Index: includes/bootstrap.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/bootstrap.inc,v
retrieving revision 1.263
diff -u -p -r1.263 bootstrap.inc
--- includes/bootstrap.inc	4 Jan 2009 16:15:54 -0000	1.263
+++ includes/bootstrap.inc	7 Jan 2009 17:20:21 -0000
@@ -392,6 +392,18 @@ function drupal_initialize_variables() {
   if (!isset($_SERVER['SERVER_PROTOCOL']) || ($_SERVER['SERVER_PROTOCOL'] != 'HTTP/1.0' && $_SERVER['SERVER_PROTOCOL'] != 'HTTP/1.1')) {
     $_SERVER['SERVER_PROTOCOL'] = 'HTTP/1.0';
   }
+  // Some pre-HTTP/1.1 clients will not send a Host header. Ensure the key is
+  // defined for E_ALL compliance.
+  if (!isset($_SERVER['HTTP_HOST'])) {
+    $_SERVER['HTTP_HOST'] = '';
+  }
+
+  if (!drupal_valid_http_host()) {
+    // HTTP_HOST is invalid, e.g. if containing slashes it may be an attack.
+    header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request');
+    exit;
+  }
+
   // Enforce E_ALL, but allow users to set levels not part of E_ALL.
   error_reporting(E_ALL | error_reporting());
 
@@ -422,8 +434,13 @@ function drupal_initialize_variables() {
  *  TRUE if only containing valid characters, or FALSE otherwise.
  */
 function drupal_valid_http_host() {
-  $_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']);
-  return preg_match('/^\[?(?:[a-z0-9-:\]_]+\.?)+$/', $_SERVER['HTTP_HOST']);
+  if (isset($_SERVER['HTTP_HOST']) && $_SERVER['HTTP_HOST'] != '') {
+    $_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']);
+    return preg_match('/^\[?(?:[a-z0-9-:\]_]+\.?)+$/', $_SERVER['HTTP_HOST']);
+  }
+  else {
+    return TRUE;
+  }
 }
 
 /**
@@ -437,12 +454,6 @@ function conf_init() {
   global $databases, $db_prefix, $cookie_domain, $conf, $installed_profile, $update_free_access;
   $conf = array();
 
-  if (!drupal_valid_http_host()) {
-    // HTTP_HOST is invalid, e.g. if containing slashes it may be an attack.
-    header($_SERVER['SERVER_PROTOCOL'] . ' 400 Bad Request');
-    exit;
-  }
-
   if (file_exists(DRUPAL_ROOT . '/' . conf_path() . '/settings.php')) {
     include_once DRUPAL_ROOT . '/' . conf_path() . '/settings.php';
   }
Index: modules/simpletest/tests/bootstrap.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/simpletest/tests/bootstrap.test,v
retrieving revision 1.9
diff -u -p -r1.9 bootstrap.test
--- modules/simpletest/tests/bootstrap.test	3 Dec 2008 14:51:53 -0000	1.9
+++ modules/simpletest/tests/bootstrap.test	7 Jan 2009 17:20:21 -0000
@@ -68,7 +68,7 @@ class BootstrapIPAddressTestCase extends
     // Cluster environment.
     $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'] = $this->cluster_ip;
     $this->assertTrue(
-      ip_address(true) == $this->cluster_ip,
+      ip_address(TRUE) == $this->cluster_ip,
       t('Cluster environment got cluster client IP')
     );
     $_SERVER['HTTP_HOST'] = 'security/.drupal.org:80';
@@ -81,6 +81,10 @@ class BootstrapIPAddressTestCase extends
     $this->assertFalse(drupal_valid_http_host(), t('HTTP_HOST with .. is invalid'));
     $_SERVER['HTTP_HOST'] = '[::1]:80'; // IPv6 loopback address
     $this->assertTrue(drupal_valid_http_host(), t('HTTP_HOST containing IPv6 loopback is valid'));
+    $_SERVER['HTTP_HOST'] = '';
+    $this->assertTrue(drupal_valid_http_host(), t('Empty HTTP_HOST is valid'));
+    $_SERVER['HTTP_HOST'] = NULL;
+    $this->assertTrue(drupal_valid_http_host(), t('NULL HTTP_HOST is valid'));
   }
 }
 
