diff options
author | Darin Petkov <petkov@chromium.org> | 2010-08-25 13:14:48 -0700 |
---|---|---|
committer | Darin Petkov <petkov@chromium.org> | 2010-08-25 13:14:48 -0700 |
commit | 41c2fcf4525a3b4e8960c4b71dfe4f4f11c8224f (patch) | |
tree | 5a8ceeb63a2a8b3417210d92a1c184c4c6ab1f4d /test_http_server.cc | |
parent | 5c0a8afa879886800d82b195e3164e5a580a2cc7 (diff) |
AU: Support redirects.
BUG=5692
TEST=unit tests, gmerged on device, making sure update engine still works
Change-Id: If593f6efbd39452aa98b453f4d5489ce7d7d7fb9
Review URL: http://codereview.chromium.org/3161041
Diffstat (limited to 'test_http_server.cc')
-rw-r--r-- | test_http_server.cc | 58 |
1 files changed, 54 insertions, 4 deletions
diff --git a/test_http_server.cc b/test_http_server.cc index 3c2ee54c..9573c312 100644 --- a/test_http_server.cc +++ b/test_http_server.cc @@ -32,6 +32,7 @@ namespace chromeos_update_engine { struct HttpRequest { HttpRequest() : offset(0), return_code(200) {} + string host; string url; off_t offset; int return_code; @@ -40,6 +41,7 @@ struct HttpRequest { namespace { const int kPort = 8080; // hardcoded to 8080 for now const int kBigLength = 100000; +const int kMediumLength = 1000; } bool ParseRequest(int fd, HttpRequest* request) { @@ -65,6 +67,7 @@ bool ParseRequest(int fd, HttpRequest* request) { CHECK_NE(string::npos, url_end); string url = headers.substr(url_start, url_end - url_start); LOG(INFO) << "URL: " << url; + request->url = url; string::size_type range_start, range_end; if (headers.find("\r\nRange: ") == string::npos) { @@ -81,7 +84,20 @@ bool ParseRequest(int fd, HttpRequest* request) { request->return_code = 206; // Success for Range: request LOG(INFO) << "Offset: " << request->offset; } - request->url = url; + + if (headers.find("\r\nHost: ") == string::npos) { + request->host = ""; + } else { + string::size_type host_start = + headers.find("\r\nHost: ") + strlen("\r\nHost: "); + string::size_type host_end = headers.find('\r', host_start); + CHECK_NE(string::npos, host_end); + string host = headers.substr(host_start, host_end - host_start); + + LOG(INFO) << "Host: " << host; + request->host = host; + } + return true; } @@ -128,8 +144,8 @@ void HandleQuitQuitQuit(int fd) { exit(0); } -void HandleBig(int fd, const HttpRequest& request) { - const off_t full_length = kBigLength; +void HandleBig(int fd, const HttpRequest& request, int big_length) { + const off_t full_length = big_length; WriteHeaders(fd, true, full_length, request.offset, request.return_code); const off_t content_length = full_length - request.offset; int i = request.offset; @@ -173,6 +189,36 @@ void HandleFlaky(int fd, const HttpRequest& request) { } } +// Handles /redirect/<code>/<url> requests by returning the specified +// redirect <code> with a location pointing to /<url>. +void HandleRedirect(int fd, const HttpRequest& request) { + LOG(INFO) << "Redirecting..."; + string url = request.url; + CHECK_EQ(0, url.find("/redirect/")); + url.erase(0, strlen("/redirect/")); + string::size_type url_start = url.find('/'); + CHECK_NE(url_start, string::npos); + string code = url.substr(0, url_start); + url.erase(0, url_start); + url = "http://" + request.host + url; + string status; + if (code == "301") { + status = "Moved Permanently"; + } else if (code == "302") { + status = "Found"; + } else if (code == "303") { + status = "See Other"; + } else if (code == "307") { + status = "Temporary Redirect"; + } else { + CHECK(false) << "Unrecognized redirection code: " << code; + } + LOG(INFO) << "Code: " << code << " " << status; + LOG(INFO) << "New URL: " << url; + WriteString(fd, "HTTP/1.1 " + code + " " + status + "\r\n"); + WriteString(fd, "Location: " + url + "\r\n"); +} + void HandleDefault(int fd, const HttpRequest& request) { const string data("unhandled path"); WriteHeaders(fd, true, data.size(), request.offset, request.return_code); @@ -188,9 +234,13 @@ void HandleConnection(int fd) { if (request.url == "/quitquitquit") HandleQuitQuitQuit(fd); else if (request.url == "/big") - HandleBig(fd, request); + HandleBig(fd, request, kBigLength); + else if (request.url == "/medium") + HandleBig(fd, request, kMediumLength); else if (request.url == "/flaky") HandleFlaky(fd, request); + else if (request.url.find("/redirect/") == 0) + HandleRedirect(fd, request); else HandleDefault(fd, request); |