From: Adam Dickmeiss Date: Fri, 10 Jan 2014 12:58:36 +0000 (+0100) Subject: Add yaz_check_location X-Git-Tag: v5.0.11~9 X-Git-Url: http://lists.indexdata.dk/?a=commitdiff_plain;h=d606d0d7c6015414a1d5ba065d09b507679be5a3;p=yaz-moved-to-github.git Add yaz_check_location This function gets an absolute URI from Location (HTTP redirect). --- diff --git a/include/yaz/zgdu.h b/include/yaz/zgdu.h index a92a3b1..3c2ad75 100644 --- a/include/yaz/zgdu.h +++ b/include/yaz/zgdu.h @@ -110,6 +110,8 @@ YAZ_EXPORT int yaz_decode_http_response(ODR o, Z_HTTP_Response **hr_p); YAZ_EXPORT int yaz_encode_http_response(ODR o, Z_HTTP_Response *hr); YAZ_EXPORT int yaz_encode_http_request(ODR o, Z_HTTP_Request *hr); +YAZ_EXPORT const char *yaz_check_location(ODR odr, const char *uri, + const char *location, int *host_change); YAZ_END_CDECL #endif diff --git a/src/http.c b/src/http.c index d79fd10..0f17df5 100644 --- a/src/http.c +++ b/src/http.c @@ -16,6 +16,7 @@ #include #include #include +#include static int decode_headers_content(ODR o, int off, Z_HTTP_Header **headers, char **content_buf, int *content_len) @@ -645,6 +646,32 @@ int yaz_encode_http_request(ODR o, Z_HTTP_Request *hr) return 1; } +const char *yaz_check_location(ODR odr, const char *uri, const char *location, + int *host_change) +{ + if (*location == '/') + { /* relative location */ + char *args = 0; + char *nlocation = (char *) odr_malloc(odr, strlen(location) + + strlen(uri) + 3); + strcpy(nlocation, uri); + cs_get_host_args(nlocation, (const char **) &args); + if (!args || !*args) + args = nlocation + strlen(nlocation); + else + args--; + strcpy(args, location); + *host_change = 0; + return nlocation; + } + else + { + /* we don't check if host is the same as before - yet */ + *host_change = 1; + return location; + } +} + /* * Local variables: * c-basic-offset: 4