aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Holljes <klaxa1337@googlemail.com>2015-06-04 01:21:02 +0200
committerNicolas George <george@nsup.org>2015-06-06 09:24:50 +0200
commita7e7c68b0e264f5db15bbbf9fb3cd557cc58e927 (patch)
treeae67fdce4763fdbf6d0bb8d99df576b5f443d660
parent8cfaa76a5e77a8cf9768a5315646647610ff49c7 (diff)
downloadffmpeg-a7e7c68b0e264f5db15bbbf9fb3cd557cc58e927.tar.gz
lavf/http: Properly process HTTP header on listen.
Signed-off-by: Stephan Holljes <klaxa1337@googlemail.com>
-rw-r--r--libavformat/http.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/libavformat/http.c b/libavformat/http.c
index a5b3e2942d..53bdb985f0 100644
--- a/libavformat/http.c
+++ b/libavformat/http.c
@@ -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++;