From be4edda6731a341d3fdeaa0e57753dc396790362 Mon Sep 17 00:00:00 2001 From: Martin Storsjö Date: Thu, 21 Nov 2013 11:25:16 +0200 Subject: http: Expose the content location via an AVOption MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavformat/http.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'libavformat/http.c') diff --git a/libavformat/http.c b/libavformat/http.c index eb08dfe892..96f56f8006 100644 --- a/libavformat/http.c +++ b/libavformat/http.c @@ -51,7 +51,7 @@ typedef struct { int http_code; int64_t chunksize; /**< Used if "Transfer-Encoding: chunked" otherwise -1. */ int64_t off, filesize; - char location[MAX_URL_SIZE]; + char *location; HTTPAuthState auth_state; HTTPAuthState proxy_auth_state; char *headers; @@ -83,6 +83,7 @@ static const AVOption options[] = { {"none", "No auth method set, autodetect", 0, AV_OPT_TYPE_CONST, {.i64 = HTTP_AUTH_NONE}, 0, 0, D|E, "auth_type" }, {"basic", "HTTP basic authentication", 0, AV_OPT_TYPE_CONST, {.i64 = HTTP_AUTH_BASIC}, 0, 0, D|E, "auth_type" }, {"send_expect_100", "Force sending an Expect: 100-continue header for POST", OFFSET(send_expect_100), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, E }, +{"location", "The actual location of the data received", OFFSET(location), AV_OPT_TYPE_STRING, { 0 }, 0, 0, D|E }, {NULL} }; #define HTTP_CLASS(flavor)\ @@ -218,7 +219,10 @@ int ff_http_do_new_request(URLContext *h, const char *uri) int ret; s->off = 0; - av_strlcpy(s->location, uri, sizeof(s->location)); + av_free(s->location); + s->location = av_strdup(uri); + if (!s->location) + return AVERROR(ENOMEM); av_dict_copy(&options, s->chained_options, 0); ret = http_open_cnx(h, &options); @@ -235,7 +239,9 @@ static int http_open(URLContext *h, const char *uri, int flags, h->is_streamed = 1; s->filesize = -1; - av_strlcpy(s->location, uri, sizeof(s->location)); + s->location = av_strdup(uri); + if (!s->location) + return AVERROR(ENOMEM); if (options) av_dict_copy(&s->chained_options, *options, 0); @@ -335,10 +341,14 @@ static int process_line(URLContext *h, char *line, int line_count, while (av_isspace(*p)) p++; if (!av_strcasecmp(tag, "Location")) { - char redirected_location[MAX_URL_SIZE]; + char redirected_location[MAX_URL_SIZE], *new_loc; ff_make_absolute_url(redirected_location, sizeof(redirected_location), s->location, p); - av_strlcpy(s->location, redirected_location, sizeof(s->location)); + new_loc = av_strdup(redirected_location); + if (!new_loc) + return AVERROR(ENOMEM); + av_free(s->location); + s->location = new_loc; *new_location = 1; } else if (!av_strcasecmp (tag, "Content-Length") && s->filesize == -1) { s->filesize = strtoll(p, NULL, 10); -- cgit v1.2.3