AU: HTTP success is not just 200, but anything in the 2xx range

BUG=None
TEST=attached unittest

Review URL: http://codereview.chromium.org/3036005
diff --git a/http_fetcher_unittest.cc b/http_fetcher_unittest.cc
index a579ea3..0a38c5c 100644
--- a/http_fetcher_unittest.cc
+++ b/http_fetcher_unittest.cc
@@ -339,6 +339,7 @@
     data.append(bytes, length);
   }
   virtual void TransferComplete(HttpFetcher* fetcher, bool successful) {
+    EXPECT_TRUE(successful);
     g_main_loop_quit(loop_);
   }
   string data;
diff --git a/libcurl_http_fetcher.cc b/libcurl_http_fetcher.cc
index e2f18af..84f0972 100644
--- a/libcurl_http_fetcher.cc
+++ b/libcurl_http_fetcher.cc
@@ -119,8 +119,10 @@
       return false;
     } else {
       if (delegate_) {
-        // success is when http_response_code is 200
-        delegate_->TransferComplete(this, http_response_code == 200);
+        // success is when http_response_code is 2xx
+        bool success = (http_response_code >= 200) &&
+            (http_response_code < 300);
+        delegate_->TransferComplete(this, success);
       }
     }
   } else {
diff --git a/test_http_server.cc b/test_http_server.cc
index 9fbe97f..3f6897c 100644
--- a/test_http_server.cc
+++ b/test_http_server.cc
@@ -31,8 +31,10 @@
 namespace chromeos_update_engine {
 
 struct HttpRequest {
+  HttpRequest() : offset(0), return_code(200) {}
   string url;
   off_t offset;
+  int return_code;
 };
 
 namespace {
@@ -76,6 +78,7 @@
     LOG(INFO) << "Range: " << range_header;
     CHECK(*range_header.rbegin() == '-');
     request->offset = atoll(range_header.c_str() + strlen("bytes="));
+    request->return_code = 206;  // Success for Range: request
     LOG(INFO) << "Offset: " << request->offset;
   }
   request->url = url;
@@ -104,9 +107,9 @@
 }
 
 void WriteHeaders(int fd, bool support_range, off_t full_size,
-                  off_t start_offset) {
+                  off_t start_offset, int return_code) {
   LOG(INFO) << "writing headers";
-  WriteString(fd, "HTTP/1.1 200 OK\r\n");
+  WriteString(fd, string("HTTP/1.1 ") + Itoa(return_code) + " OK\r\n");
   WriteString(fd, "Content-Type: application/octet-stream\r\n");
   if (support_range) {
     WriteString(fd, "Accept-Ranges: bytes\r\n");
@@ -121,13 +124,13 @@
 }
 
 void HandleQuitQuitQuit(int fd) {
-  WriteHeaders(fd, true, 0, 0);
+  WriteHeaders(fd, true, 0, 0, 200);
   exit(0);
 }
 
 void HandleBig(int fd, const HttpRequest& request) {
   const off_t full_length = kBigLength;
-  WriteHeaders(fd, true, full_length, request.offset);
+  WriteHeaders(fd, true, full_length, request.offset, request.return_code);
   const off_t content_length = full_length - request.offset;
   int i = request.offset;
   for (; i % 10; i++)
@@ -143,7 +146,7 @@
 // (technically, when (offset % (9000 * 7)) == 0).
 void HandleFlaky(int fd, const HttpRequest& request) {
   const off_t full_length = kBigLength;
-  WriteHeaders(fd, true, full_length, request.offset);
+  WriteHeaders(fd, true, full_length, request.offset, request.return_code);
   const off_t content_length =
       min(static_cast<off_t>(9000), full_length - request.offset);
   const bool should_sleep = (request.offset % (9000 * 7)) == 0;
@@ -172,7 +175,7 @@
 
 void HandleDefault(int fd, const HttpRequest& request) {
   const string data("unhandled path");
-  WriteHeaders(fd, true, data.size(), request.offset);
+  WriteHeaders(fd, true, data.size(), request.offset, request.return_code);
   const string data_to_write(data.substr(request.offset,
                                          data.size() - request.offset));
   WriteString(fd, data_to_write);