Index: wp-admin/includes/file.php
===================================================================
--- wp-admin/includes/file.php	(revision 7497)
+++ wp-admin/includes/file.php	(working copy)
@@ -192,25 +210,30 @@
 * Downloads a url to a local file using the Snoopy HTTP Class
 *
 * @param string $url the URL of the file to download
-* @return mixed false on failure, string Filename on success.
+* @return mixed WP_Error on failure, string Filename on success.
 */
 function download_url( $url ) {
 	//WARNING: The file is not automatically deleted, The script must unlink() the file.
 	if( ! $url )
-		return false;
+		return new WP_Error('http_no_url', __('Invalid URL Provided'));
 
 	$tmpfname = tempnam(get_temp_dir(), 'wpupdate');
 	if( ! $tmpfname )
-		return false;
+		return new WP_Error('http_no_file', __('Could not create Temporary file'));
 
 	$handle = @fopen($tmpfname, 'w');
 	if( ! $handle )
-		return false;
+		return new WP_Error('http_no_file', __('Could not create Temporary file'));
 
 	require_once( ABSPATH . 'wp-includes/class-snoopy.php' );
 	$snoopy = new Snoopy();
 	$snoopy->fetch($url);
 
+	if( $snoopy->status != '200' ){
+		fclose($handle);
+		unlink($tmpfname);
+		return new WP_Error('http_404', trim($snoopy->response_code));
+	}
 	fwrite($handle, $snoopy->results);
 	fclose($handle);
 
Index: wp-admin/includes/update.php
===================================================================
--- wp-admin/includes/update.php	(revision 7497)
+++ wp-admin/includes/update.php	(working copy)
@@ -176,8 +176,8 @@
 	apply_filters('update_feedback', sprintf(__('Downloading update from %s'), $package));
 	$file = download_url($package);
 
-	if ( !$file )
-		return new WP_Error('download_failed', __('Download failed.'));
+	if ( is_wp_error($file) )
+		return new WP_Error('download_failed', __('Download failed.'), $file->get_error_message());
 
 	$working_dir = $base . 'wp-content/upgrade/' . basename($plugin, '.php');
 

