Index: wp-includes/http.php
===================================================================
--- wp-includes/http.php	(revision 12531)
+++ wp-includes/http.php	(working copy)
@@ -739,7 +768,7 @@
 			return new WP_Error('http_request_failed', $arrHeaders['response']['code'] . ': ' . $arrHeaders['response']['message']);
 
 		// If location is found, then assume redirect and redirect to location.
-		if ( isset($arrHeaders['headers']['location']) ) {
+		if ( 'HEAD' != $r['method'] && isset($arrHeaders['headers']['location']) ) {
 			if ( $r['redirection']-- > 0 ) {
 				return $this->request($arrHeaders['headers']['location'], $r);
 			} else {
@@ -884,6 +913,9 @@
 		if ( ! function_exists('fopen') || (function_exists('ini_get') && true != ini_get('allow_url_fopen')) )
 			return false;
 
+		if ( isset($args['method']) && 'HEAD' == $args['method'] ) //This transport cannot make a HEAD request.
+			return false;
+
 		$use = true;
 
 		//PHP does not verify SSL certs, We can only make a request via this transports if SSL Verification is turned off.
@@ -980,6 +1012,7 @@
 				'protocol_version' => (float) $r['httpversion'],
 				'header' => $strHeaders,
 				'timeout' => $r['timeout'],
+				'ignore_errors' => true, // Return non-200 requests.
 				'ssl' => array(
 						'verify_peer' => $ssl_verify,
 						'verify_host' => $ssl_verify
@@ -1001,6 +1034,9 @@
 		if ( ! is_null($r['body']) && ! empty($r['body'] ) )
 			$arrContext['http']['content'] = $r['body'];
 
+		if ( 'HEAD' == $r['method'] ) // Disable redirects for HEAD requests
+			$arrContext['http']['max_redirects'] = 1;
+
 		$context = stream_context_create($arrContext);
 
 		if ( !WP_DEBUG )
@@ -1008,7 +1044,7 @@
 		else
 			$handle = fopen($url, 'r', false, $context);
 
-		if ( ! $handle)
+		if ( ! $handle )
 			return new WP_Error('http_request_failed', sprintf(__('Could not open handle for fopen() to %s'), $url));
 
 		$timeout = (int) floor( $r['timeout'] );
@@ -1159,6 +1195,9 @@
 			)
 		);
 
+		if ( HTTP_METH_HEAD == $r['method'] )
+			$options['redirect'] = 0; // Assumption: Docs seem to suggest that this means do not follow. Untested.
+
 		// The HTTP extensions offers really easy proxy support.
 		$proxy = new WP_HTTP_Proxy();
 
@@ -1326,8 +1365,8 @@
 		else
 			curl_setopt( $handle, CURLOPT_HEADER, false );
 
-		// The option doesn't work with safe mode or when open_basedir is set.
-		if ( !ini_get('safe_mode') && !ini_get('open_basedir') )
+		// The option doesn't work with safe mode or when open_basedir is set. Do not follow for Redirects either.
+		if ( !ini_get('safe_mode') && !ini_get('open_basedir') && 'HEAD' != $r['method'] )
 			curl_setopt( $handle, CURLOPT_FOLLOWLOCATION, true );
 
 		if ( !empty( $r['headers'] ) ) {