Index: wp-includes/class-http.php
===================================================================
--- wp-includes/class-http.php	(revision 23609)
+++ wp-includes/class-http.php	(working copy)
@@ -586,6 +586,25 @@
 
 		return $absolute_path . '/' . ltrim( $path, '/' );
 	}
+
+	/**
+	 * Determine if we should perform a redirection
+	 * @param $http_code int The HTTP Response code
+	 * @param $args mixed The $args passed to the request function
+	 * 
+	 * @since 3.6.0
+	 *
+	 * @return bool
+	 */
+	public static function should_redirect( $http_code, $args ) {
+		if ( 0 === $args['_redirection'] ) // _redirection: The original requested number of redirections
+			return false;
+
+		if ( $http_code < 300 || $http_code > 399 )
+			return false;
+
+		return true;
+	}
 }
 
 /**
@@ -798,7 +817,7 @@
 		$arrHeaders = WP_Http::processHeaders( $process['headers'] );
 
 		// If location is found, then assume redirect and redirect to location.
-		if ( isset($arrHeaders['headers']['location']) && 0 !== $r['_redirection'] ) {
+		if ( isset($arrHeaders['headers']['location']) && WP_HTTP::should_redirect( $arrHeaders['response']['code'], $r ) ) {
 			if ( $r['redirection']-- > 0 ) {
 				return wp_remote_request( WP_HTTP::make_absolute_url( $arrHeaders['headers']['location'], $url ), $r);
 			} else {
@@ -988,7 +1007,7 @@
 		else
 			$processedHeaders = WP_Http::processHeaders($meta['wrapper_data']);
 
-		if ( ! empty( $processedHeaders['headers']['location'] ) && 0 !== $r['_redirection'] ) { // _redirection: The requested number of redirections
+		if ( ! empty( $processedHeaders['headers']['location'] ) && WP_HTTP::should_redirect( $processedHeaders['response']['code'], $r ) ) {
 			if ( $r['redirection']-- > 0 ) {
 				return wp_remote_request( WP_HTTP::make_absolute_url( $processedHeaders['headers']['location'], $url ), $r );
 			} else {
@@ -1253,8 +1272,7 @@
 		if ( $r['stream'] )
 			fclose( $this->stream_handle );
 
-		// See #11305 - When running under safe mode, redirection is disabled above. Handle it manually.
-		if ( ! empty( $theHeaders['headers']['location'] ) && 0 !== $r['_redirection'] ) { // _redirection: The requested number of redirections
+		if ( ! empty( $theHeaders['headers']['location'] ) && WP_HTTP::should_redirect( $response['code'], $r ) ) {
 			if ( $r['redirection']-- > 0 ) {
 				return wp_remote_request( WP_HTTP::make_absolute_url( $theHeaders['headers']['location'], $url ), $r );
 			} else {
