summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/net/tcp/http.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/net/tcp/http.c b/src/net/tcp/http.c
index b7cbea46..b8ea3cc5 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,
},