lavf/http: Properly process HTTP header on listen.
authorStephan Holljes <klaxa1337@googlemail.com>
Wed, 3 Jun 2015 23:21:02 +0000 (01:21 +0200)
committerNicolas George <george@nsup.org>
Sat, 6 Jun 2015 07:24:50 +0000 (09:24 +0200)
Signed-off-by: Stephan Holljes <klaxa1337@googlemail.com>
libavformat/http.c

index a5b3e29..53bdb98 100644 (file)
@@ -563,7 +563,7 @@ static int process_line(URLContext *h, char *line, int line_count,
                         int *new_location)
 {
     HTTPContext *s = h->priv_data;
-    char *tag, *p, *end;
+    char *tag, *p, *end, *method, *resource, *version;
     int ret;
 
     /* end of header */
@@ -574,6 +574,44 @@ static int process_line(URLContext *h, char *line, int line_count,
 
     p = line;
     if (line_count == 0) {
+        if (s->listen) {
+            // HTTP method
+            method = p;
+            while (!av_isspace(*p))
+                p++;
+            *(p++) = '\0';
+            av_log(h, AV_LOG_TRACE, "Received method: %s\n", method);
+            if (s->method) {
+                if (av_strcasecmp(s->method, method)) {
+                    av_log(h, AV_LOG_ERROR, "Received and expected HTTP method do not match. (%s expected, %s received)\n",
+                           s->method, method);
+                    return ff_http_averror(400, AVERROR(EIO));
+                }
+            }
+
+            // HTTP resource
+            while (av_isspace(*p))
+                p++;
+            resource = p;
+            while (!av_isspace(*p))
+                p++;
+            *(p++) = '\0';
+            av_log(h, AV_LOG_TRACE, "Requested resource: %s\n", resource);
+
+            // HTTP version
+            while (av_isspace(*p))
+                p++;
+            version = p;
+            while (!av_isspace(*p))
+                p++;
+            *p = '\0';
+            if (av_strncasecmp(version, "HTTP/", 5)) {
+                av_log(h, AV_LOG_ERROR, "Malformed HTTP version string.\n");
+                return ff_http_averror(400, AVERROR(EIO));
+            }
+            av_log(h, AV_LOG_TRACE, "HTTP version string: %s\n", version);
+        } else {
+        /* TODO: reindent */
         while (!av_isspace(*p) && *p != '\0')
             p++;
         while (av_isspace(*p))
@@ -584,6 +622,7 @@ static int process_line(URLContext *h, char *line, int line_count,
 
         if ((ret = check_http_code(h, s->http_code, end)) < 0)
             return ret;
+        }
     } else {
         while (*p != '\0' && *p != ':')
             p++;