Index: wp-includes/class-http.php
===================================================================
--- wp-includes/class-http.php	(revision 15570)
+++ wp-includes/class-http.php	(working copy)
@@ -59,10 +59,68 @@
 	 * @return WP_Http
 	 */
 	function __construct() {
-		WP_Http::_getTransport();
-		WP_Http::_postTransport();
+		WP_Http::_namedTransport( array( 'get', 'post' ) );
 	}
+	
+	/**
+	 * Tests through all WP_Http objects and stores the first match 
+	 * and returns.
+	 * 
+	 * Test Order:
+	 * 
+	 *   1. exthttp  : WP_Http_ExtHTTP
+	 *   2. curl     : WP_Http_Curl
+	 *   3. streams  : WP_Http_Streams
+	 *   4. fopen    : WP_Http_Fopen
+	 *   5. fsockopen: WP_Http_Fsockopen
+	 * 
+	 * Note: fopen is not used in post $context.
+	 * 
+	 * @since 3.1.0
+	 * @access private
+	 * @param string|array $named name context, use array of names to use multiple
+	 * @param array $args (optional) Request arguments
+	 * @return object|null Concrete HTTP Transport Object; Null if no transport was found.
+	 */
+	function &_namedTransport( $named, $args = array() ) {
+		static $working, $blocking, $nonblocking;
 
+		is_scalar( $named ) && ( $named = array( (string) $named ) );
+
+		foreach ( $named as $context ) {
+			if ( !isset( $working[$context] ) ) {
+				$transports = array(
+					'exthttp'   => 'ExtHTTP',
+					'curl'      => 'Curl',
+					'streams'   => 'Streams',
+					'fopen'     => 'Fopen',
+					'fsockopen' => 'Fsockopen',
+				);
+
+				foreach ( $transports as $name => $spec ) {
+					$class = 'WP_Http_' . $spec;
+					if ( !call_user_func( array( $class, 'test' ), $args ) )
+						continue;
+
+					$wp_http = new $class();
+					
+					$working[$context][$name] = &$wp_http; 
+					$blocking[$context][]     = &$wp_http;
+					$nonblocking[$context][]  = &$wp_http;
+
+					break;
+				}
+			}
+			do_action( 'http_transport_get_debug', $working[$context], $blocking[$context], $nonblocking[$context] );
+		}
+
+		if ( isset($args['blocking']) && !$args['blocking'] )
+			return $nonblocking[$context];
+		else
+			return $blocking[$context];
+		
+	}
+
 	/**
 	 * Tests the WordPress HTTP objects for an object to use and returns it.
 	 *
@@ -86,38 +144,7 @@
 	 * @return object|null Null if no transports are available, HTTP transport object.
 	 */
 	function &_getTransport( $args = array() ) {
-		static $working_transport, $blocking_transport, $nonblocking_transport;
-
-		if ( is_null($working_transport) ) {
-			if ( true === WP_Http_ExtHttp::test($args) ) {
-				$working_transport['exthttp'] = new WP_Http_ExtHttp();
-				$blocking_transport[] = &$working_transport['exthttp'];
-			} else if ( true === WP_Http_Curl::test($args) ) {
-				$working_transport['curl'] = new WP_Http_Curl();
-				$blocking_transport[] = &$working_transport['curl'];
-			} else if ( true === WP_Http_Streams::test($args) ) {
-				$working_transport['streams'] = new WP_Http_Streams();
-				$blocking_transport[] = &$working_transport['streams'];
-			} else if ( true === WP_Http_Fopen::test($args) ) {
-				$working_transport['fopen'] = new WP_Http_Fopen();
-				$blocking_transport[] = &$working_transport['fopen'];
-			} else if ( true === WP_Http_Fsockopen::test($args) ) {
-				$working_transport['fsockopen'] = new WP_Http_Fsockopen();
-				$blocking_transport[] = &$working_transport['fsockopen'];
-			}
-
-			foreach ( array('curl', 'streams', 'fopen', 'fsockopen', 'exthttp') as $transport ) {
-				if ( isset($working_transport[$transport]) )
-					$nonblocking_transport[] = &$working_transport[$transport];
-			}
-		}
-
-		do_action( 'http_transport_get_debug', $working_transport, $blocking_transport, $nonblocking_transport );
-
-		if ( isset($args['blocking']) && !$args['blocking'] )
-			return $nonblocking_transport;
-		else
-			return $blocking_transport;
+		return $this->_namedTransport( 'get', $args );
 	}
 
 	/**
@@ -136,35 +163,7 @@
 	 * @return object|null Null if no transports are available, HTTP transport object.
 	 */
 	function &_postTransport( $args = array() ) {
-		static $working_transport, $blocking_transport, $nonblocking_transport;
-
-		if ( is_null($working_transport) ) {
-			if ( true === WP_Http_ExtHttp::test($args) ) {
-				$working_transport['exthttp'] = new WP_Http_ExtHttp();
-				$blocking_transport[] = &$working_transport['exthttp'];
-			} else if ( true === WP_Http_Curl::test($args) ) {
-				$working_transport['curl'] = new WP_Http_Curl();
-				$blocking_transport[] = &$working_transport['curl'];
-			} else if ( true === WP_Http_Streams::test($args) ) {
-				$working_transport['streams'] = new WP_Http_Streams();
-				$blocking_transport[] = &$working_transport['streams'];
-			} else if ( true === WP_Http_Fsockopen::test($args) ) {
-				$working_transport['fsockopen'] = new WP_Http_Fsockopen();
-				$blocking_transport[] = &$working_transport['fsockopen'];
-			}
-
-			foreach ( array('curl', 'streams', 'fsockopen', 'exthttp') as $transport ) {
-				if ( isset($working_transport[$transport]) )
-					$nonblocking_transport[] = &$working_transport[$transport];
-			}
-		}
-
-		do_action( 'http_transport_post_debug', $working_transport, $blocking_transport, $nonblocking_transport );
-
-		if ( isset($args['blocking']) && !$args['blocking'] )
-			return $nonblocking_transport;
-		else
-			return $blocking_transport;
+		return $this->_namedTransport( 'post', $args );
 	}
 
 	/**
@@ -914,7 +913,7 @@
 		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
+		if ( isset( $args['method'] ) && 'GET' !== $args['method'] ) //This transport cannot make anything else then a GET request
 			return false;
 
 		$use = true;
