PLIV-5 --resolve httpapi cache not working for some urls

This commit is contained in:
Anthony Minessale 2014-03-10 12:20:08 -05:00
parent 65fed130e5
commit 3584902ae1

View File

@ -2317,9 +2317,23 @@ SWITCH_STANDARD_APP(httapi_function)
/* HTTP FILE INTERFACE */ /* HTTP FILE INTERFACE */
static const char *find_ext(const char *in)
{
const char *p = in + (strlen(in) - 1);
while(p >= in && *p) {
if (*p == '/') return NULL;
if (*p == '.') return (p+1);
p--;
}
return NULL;
}
static char *load_cache_data(http_file_context_t *context, const char *url) static char *load_cache_data(http_file_context_t *context, const char *url)
{ {
char *ext = NULL, *dext = NULL, *p; const char *ext = NULL;
char *dext = NULL, *p;
char digest[SWITCH_MD5_DIGEST_STRING_SIZE] = { 0 }; char digest[SWITCH_MD5_DIGEST_STRING_SIZE] = { 0 };
char meta_buffer[1024] = ""; char meta_buffer[1024] = "";
int fd; int fd;
@ -2332,11 +2346,7 @@ static char *load_cache_data(http_file_context_t *context, const char *url)
} }
if (zstr(ext)) { if (zstr(ext)) {
if ((ext = strrchr(url, '.'))) { ext = find_ext(url);
ext++;
} else {
ext = "wav";
}
} }
if (ext && (p = strchr(ext, '?'))) { if (ext && (p = strchr(ext, '?'))) {
@ -2348,9 +2358,8 @@ static char *load_cache_data(http_file_context_t *context, const char *url)
} }
context->cache_file_base = switch_core_sprintf(context->pool, "%s%s%s", globals.cache_path, SWITCH_PATH_SEPARATOR, digest); context->cache_file_base = switch_core_sprintf(context->pool, "%s%s%s", globals.cache_path, SWITCH_PATH_SEPARATOR, digest);
context->cache_file = switch_core_sprintf(context->pool, "%s%s%s.%s", globals.cache_path, SWITCH_PATH_SEPARATOR, digest, ext); context->meta_file = switch_core_sprintf(context->pool, "%s%s%s.meta", globals.cache_path, SWITCH_PATH_SEPARATOR, digest);
context->meta_file = switch_core_sprintf(context->pool, "%s.meta", context->cache_file); context->lock_file = switch_core_sprintf(context->pool, "%s%s%s.lock", globals.cache_path, SWITCH_PATH_SEPARATOR, digest);
context->lock_file = switch_core_sprintf(context->pool, "%s.lock", context->cache_file);
if (switch_file_exists(context->meta_file, context->pool) == SWITCH_STATUS_SUCCESS && ((fd = open(context->meta_file, O_RDONLY, 0)) > -1)) { if (switch_file_exists(context->meta_file, context->pool) == SWITCH_STATUS_SUCCESS && ((fd = open(context->meta_file, O_RDONLY, 0)) > -1)) {
if ((bytes = read(fd, meta_buffer, sizeof(meta_buffer))) > 0) { if ((bytes = read(fd, meta_buffer, sizeof(meta_buffer))) > 0) {
@ -2363,10 +2372,20 @@ static char *load_cache_data(http_file_context_t *context, const char *url)
} }
context->metadata = switch_core_strdup(context->pool, p); context->metadata = switch_core_strdup(context->pool, p);
} }
if ((p = strrchr(context->metadata, ':'))) {
p++;
if (!zstr(p)) {
ext = p;
}
}
} }
close(fd); close(fd);
} }
context->cache_file = switch_core_sprintf(context->pool, "%s%s%s%s%s", globals.cache_path, SWITCH_PATH_SEPARATOR, digest, ext ? "." : "", ext ? ext : "");
switch_safe_free(dext); switch_safe_free(dext);
return context->cache_file; return context->cache_file;
@ -2626,6 +2645,7 @@ static switch_status_t locate_url_file(http_file_context_t *context, const char
switch_status_t status = SWITCH_STATUS_FALSE; switch_status_t status = SWITCH_STATUS_FALSE;
time_t now = switch_epoch_time_now(NULL); time_t now = switch_epoch_time_now(NULL);
char *metadata; char *metadata;
const char *ext = NULL;
load_cache_data(context, url); load_cache_data(context, url);
@ -2635,6 +2655,10 @@ static switch_status_t locate_url_file(http_file_context_t *context, const char
lock_file(context, SWITCH_TRUE); lock_file(context, SWITCH_TRUE);
if (context->url_params) {
ext = switch_event_get_header(context->url_params, "ext");
}
if (!context->url_params || !switch_true(switch_event_get_header(context->url_params, "nohead"))) { if (!context->url_params || !switch_true(switch_event_get_header(context->url_params, "nohead"))) {
const char *ct = NULL; const char *ct = NULL;
const char *newext = NULL; const char *newext = NULL;
@ -2650,8 +2674,7 @@ static switch_status_t locate_url_file(http_file_context_t *context, const char
} }
} }
if ((!context->url_params || !switch_event_get_header(context->url_params, "ext")) if (zstr(ext) && headers && (ct = switch_event_get_header(headers, "content-type"))) {
&& headers && (ct = switch_event_get_header(headers, "content-type"))) {
if (switch_strcasecmp_any(ct, "audio/mpeg", "audio/x-mpeg", "audio/mp3", "audio/x-mp3", "audio/mpeg3", if (switch_strcasecmp_any(ct, "audio/mpeg", "audio/x-mpeg", "audio/mp3", "audio/x-mp3", "audio/mpeg3",
"audio/x-mpeg3", "audio/mpg", "audio/x-mpg", "audio/x-mpegaudio", NULL)) { "audio/x-mpeg3", "audio/mpg", "audio/x-mpg", "audio/x-mpegaudio", NULL)) {
newext = "mp3"; newext = "mp3";
@ -2660,14 +2683,14 @@ static switch_status_t locate_url_file(http_file_context_t *context, const char
} }
} }
if (newext) { if (newext) {
char *p; ext = newext;
} else if (zstr(ext)) {
if ((p = strrchr(context->cache_file, '.'))) { ext = find_ext(context->cache_file);
*p = '\0';
} }
if (newext) {
context->cache_file = switch_core_sprintf(context->pool, "%s.%s", context->cache_file, newext); context->cache_file = switch_core_sprintf(context->pool, "%s.%s", context->cache_file, newext);
} }
@ -2678,11 +2701,12 @@ static switch_status_t locate_url_file(http_file_context_t *context, const char
} }
if (!unreachable && !zstr(context->metadata)) { if (!unreachable && !zstr(context->metadata)) {
metadata = switch_core_sprintf(context->pool, "%s:%s:%s:%s", metadata = switch_core_sprintf(context->pool, "%s:%s:%s:%s:%s",
url, url,
switch_event_get_header_nil(headers, "last-modified"), switch_event_get_header_nil(headers, "last-modified"),
switch_event_get_header_nil(headers, "etag"), switch_event_get_header_nil(headers, "etag"),
switch_event_get_header_nil(headers, "content-length") switch_event_get_header_nil(headers, "content-length"),
ext
); );
if (!strcmp(metadata, context->metadata)) { if (!strcmp(metadata, context->metadata)) {
@ -2701,11 +2725,12 @@ static switch_status_t locate_url_file(http_file_context_t *context, const char
} }
metadata = switch_core_sprintf(context->pool, "%s:%s:%s:%s", metadata = switch_core_sprintf(context->pool, "%s:%s:%s:%s:%s",
url, url,
switch_event_get_header_nil(headers, "last-modified"), switch_event_get_header_nil(headers, "last-modified"),
switch_event_get_header_nil(headers, "etag"), switch_event_get_header_nil(headers, "etag"),
switch_event_get_header_nil(headers, "content-length") switch_event_get_header_nil(headers, "content-length"),
ext
); );
write_meta_file(context, metadata, headers); write_meta_file(context, metadata, headers);