http: Expose the content location via an AVOption

Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
Martin Storsjö 2013-11-21 11:25:16 +02:00
parent 393d80cc27
commit be4edda673
2 changed files with 16 additions and 6 deletions

View File

@ -51,7 +51,7 @@ typedef struct {
int http_code; int http_code;
int64_t chunksize; /**< Used if "Transfer-Encoding: chunked" otherwise -1. */ int64_t chunksize; /**< Used if "Transfer-Encoding: chunked" otherwise -1. */
int64_t off, filesize; int64_t off, filesize;
char location[MAX_URL_SIZE]; char *location;
HTTPAuthState auth_state; HTTPAuthState auth_state;
HTTPAuthState proxy_auth_state; HTTPAuthState proxy_auth_state;
char *headers; 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" }, {"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" }, {"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 }, {"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} {NULL}
}; };
#define HTTP_CLASS(flavor)\ #define HTTP_CLASS(flavor)\
@ -218,7 +219,10 @@ int ff_http_do_new_request(URLContext *h, const char *uri)
int ret; int ret;
s->off = 0; 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); av_dict_copy(&options, s->chained_options, 0);
ret = http_open_cnx(h, &options); 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; h->is_streamed = 1;
s->filesize = -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) if (options)
av_dict_copy(&s->chained_options, *options, 0); 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)) while (av_isspace(*p))
p++; p++;
if (!av_strcasecmp(tag, "Location")) { 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), ff_make_absolute_url(redirected_location, sizeof(redirected_location),
s->location, p); 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; *new_location = 1;
} else if (!av_strcasecmp (tag, "Content-Length") && s->filesize == -1) { } else if (!av_strcasecmp (tag, "Content-Length") && s->filesize == -1) {
s->filesize = strtoll(p, NULL, 10); s->filesize = strtoll(p, NULL, 10);

View File

@ -31,7 +31,7 @@
#define LIBAVFORMAT_VERSION_MAJOR 55 #define LIBAVFORMAT_VERSION_MAJOR 55
#define LIBAVFORMAT_VERSION_MINOR 10 #define LIBAVFORMAT_VERSION_MINOR 10
#define LIBAVFORMAT_VERSION_MICRO 0 #define LIBAVFORMAT_VERSION_MICRO 1
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \ LIBAVFORMAT_VERSION_MINOR, \