X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fhttp.c;h=6539f7ab4ce1994c7a5e12955ee1fff29a5dee22;hp=42b32ed8927a69f3ca02fdbbc77987c56c3b0c5b;hb=0e7fdbc857d4905e67a7bdf8fe5b6c773ee47a7b;hpb=fe507b6b15788a3a8e58063d9dae52532a5229a5 diff --git a/src/http.c b/src/http.c index 42b32ed..6539f7a 100644 --- a/src/http.c +++ b/src/http.c @@ -1,20 +1,21 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2012 Index Data * See the file LICENSE for details. - * - * $Id: http.c,v 1.2 2007-05-06 20:12:20 adam Exp $ */ - /** * \file http.c * \brief Implements HTTP decoding */ +#if HAVE_CONFIG_H +#include +#endif -#include #include #include #include +#include #include +#include #ifdef WIN32 #define strncasecmp _strnicmp @@ -91,13 +92,13 @@ static int decode_headers_content(ODR o, int off, Z_HTTP_Header **headers, /* chunk length .. */ int chunk_len = 0; for (; i < o->size-2; i++) - if (isdigit(o->buf[i])) + if (yaz_isdigit(o->buf[i])) chunk_len = chunk_len * 16 + (o->buf[i] - '0'); - else if (isupper(o->buf[i])) + else if (yaz_isupper(o->buf[i])) chunk_len = chunk_len * 16 + (o->buf[i] - ('A'-10)); - else if (islower(o->buf[i])) + else if (yaz_islower(o->buf[i])) chunk_len = chunk_len * 16 + (o->buf[i] - ('a'-10)); else @@ -169,6 +170,31 @@ void z_HTTP_header_add_content_type(ODR o, Z_HTTP_Header **hp, } +/* + * HTTP Basic authentication is described at: + * http://tools.ietf.org/html/rfc1945#section-11.1 + */ +void z_HTTP_header_add_basic_auth(ODR o, Z_HTTP_Header **hp, + const char *username, const char *password) +{ + char *tmp, *buf; + int len; + + if (username == 0) + return; + if (password == 0) + password = ""; + + len = strlen(username) + strlen(password); + tmp = (char *) odr_malloc(o, len+2); + sprintf(tmp, "%s:%s", username, password); + buf = (char *) odr_malloc(o, (len+1) * 8/6 + 12); + strcpy(buf, "Basic "); + yaz_base64encode(tmp, &buf[strlen(buf)]); + z_HTTP_header_add(o, hp, "Authorization", buf); +} + + void z_HTTP_header_add(ODR o, Z_HTTP_Header **hp, const char *n, const char *v) { @@ -241,6 +267,48 @@ Z_GDU *z_get_HTTP_Request_host_path(ODR odr, return p; } +Z_GDU *z_get_HTTP_Request_uri(ODR odr, const char *uri, const char *args, + int use_full_uri) +{ + Z_GDU *p = z_get_HTTP_Request(odr); + const char *cp0 = strstr(uri, "://"); + const char *cp1 = 0; + if (cp0) + cp0 = cp0+3; + else + cp0 = uri; + + cp1 = strchr(cp0, '/'); + if (!cp1) + cp1 = cp0+strlen(cp0); + + if (cp0 && cp1) + { + char *h = (char*) odr_malloc(odr, cp1 - cp0 + 1); + memcpy (h, cp0, cp1 - cp0); + h[cp1-cp0] = '\0'; + z_HTTP_header_add(odr, &p->u.HTTP_Request->headers, + "Host", h); + } + + if (!args) + { + if (*cp1) + args = cp1 + 1; + else + args = ""; + } + p->u.HTTP_Request->path = odr_malloc(odr, cp1 - uri + strlen(args) + 2); + if (use_full_uri) + { + memcpy(p->u.HTTP_Request->path, uri, cp1 - uri); + strcpy(p->u.HTTP_Request->path + (cp1 - uri), "/"); + } + else + strcpy(p->u.HTTP_Request->path, "/"); + strcat(p->u.HTTP_Request->path, args); + return p; +} Z_GDU *z_get_HTTP_Response(ODR o, int code) { @@ -260,20 +328,21 @@ Z_GDU *z_get_HTTP_Response(ODR o, int code) if (code != 200) { hres->content_buf = (char*) odr_malloc(o, 400); - sprintf (hres->content_buf, - "\n" - "\n" - " \n" - " YAZ " YAZ_VERSION "\n" - " \n" - " \n" - "

YAZ " - YAZ_VERSION "

\n" - "

Error: %d

\n" - "

Description: %.50s

\n" - " \n" - "\n", - code, z_HTTP_errmsg(code)); + sprintf(hres->content_buf, + "\n" + "\n" + " \n" + " YAZ " YAZ_VERSION "\n" + " \n" + " \n" + "

YAZ " + YAZ_VERSION "

\n" + "

Error: %d

\n" + "

Description: %.50s

\n" + " \n" + "\n", + code, z_HTTP_errmsg(code)); hres->content_len = strlen(hres->content_buf); z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/html"); } @@ -471,6 +540,7 @@ int yaz_encode_http_request(ODR o, Z_HTTP_Request *hr) /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab