diff options
| author | Michael Brown | 2009-03-30 14:28:33 +0200 |
|---|---|---|
| committer | Michael Brown | 2009-03-30 14:28:33 +0200 |
| commit | 272e6ddc304b554742454e458733f8420fa3fd98 (patch) | |
| tree | c14767244b7a585719ab851203f9db3bbfbe140e | |
| parent | [xfer] Implement xfer_vreopen() to properly handle redirections (diff) | |
| download | ipxe-272e6ddc304b554742454e458733f8420fa3fd98.tar.gz ipxe-272e6ddc304b554742454e458733f8420fa3fd98.tar.xz ipxe-272e6ddc304b554742454e458733f8420fa3fd98.zip | |
[http] Support HTTP redirection
| -rw-r--r-- | src/net/tcp/http.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/net/tcp/http.c b/src/net/tcp/http.c index b7cbea465..b8ea3cc5b 100644 --- a/src/net/tcp/http.c +++ b/src/net/tcp/http.c @@ -138,6 +138,8 @@ static void http_done ( struct http_request *http, int rc ) { static int http_response_to_rc ( unsigned int response ) { switch ( response ) { case 200: + case 301: + case 302: return 0; case 404: return -ENOENT; @@ -181,6 +183,28 @@ static int http_rx_response ( struct http_request *http, char *response ) { } /** + * Handle HTTP Location header + * + * @v http HTTP request + * @v value HTTP header value + * @ret rc Return status code + */ +static int http_rx_location ( struct http_request *http, const char *value ) { + int rc; + + /* Redirect to new location */ + DBGC ( http, "HTTP %p redirecting to %s\n", http, value ); + if ( ( rc = xfer_redirect ( &http->xfer, LOCATION_URI_STRING, + value ) ) != 0 ) { + DBGC ( http, "HTTP %p could not redirect: %s\n", + http, strerror ( rc ) ); + return rc; + } + + return 0; +} + +/** * Handle HTTP Content-Length header * * @v http HTTP request @@ -223,6 +247,10 @@ struct http_header_handler { /** List of HTTP header handlers */ static struct http_header_handler http_header_handlers[] = { { + .header = "Location", + .rx = http_rx_location, + }, + { .header = "Content-Length", .rx = http_rx_content_length, }, |
