#include <yaz/zgdu.h>
#include <yaz/base64.h>
-#ifdef WIN32
-#define strncasecmp _strnicmp
-#define strcasecmp _stricmp
-#endif
-
static int decode_headers_content(ODR o, int off, Z_HTTP_Header **headers,
char **content_buf, int *content_len)
{
memcpy ((*headers)->value, o->buf + po, i - po);
(*headers)->value[i - po] = '\0';
- if (!strcasecmp((*headers)->name, "Transfer-Encoding")
+ if (!yaz_strcasecmp((*headers)->name, "Transfer-Encoding")
&&
- !strcasecmp((*headers)->value, "chunked"))
+ !yaz_strcasecmp((*headers)->value, "chunked"))
chunked = 1;
headers = &(*headers)->next;
if (i < o->size-1 && o->buf[i] == '\r')
{
while (*hp)
{
- if (!strcmp((*hp)->name, n))
+ if (!yaz_strcasecmp((*hp)->name, n))
{
(*hp)->value = odr_strdup(o, v);
return;
(*hp)->next = 0;
}
+const char *z_HTTP_header_remove(Z_HTTP_Header **hp, const char *n)
+{
+ while (*hp)
+ {
+ if (!yaz_strcasecmp((*hp)->name, n))
+ {
+ const char *v = (*hp)->value;
+ *hp = (*hp)->next;
+ return v;
+ }
+ hp = &(*hp)->next;
+ }
+ return 0;
+}
+
const char *z_HTTP_header_lookup(const Z_HTTP_Header *hp, const char *n)
{
for (; hp; hp = hp->next)
- if (!yaz_matchstr(hp->name, n))
+ if (!yaz_strcasecmp(hp->name, n))
return hp->value;
return 0;
}
return p;
}
-Z_GDU *z_get_HTTP_Response(ODR o, int code)
+Z_GDU *z_get_HTTP_Response_details(ODR o, int code, const char *details)
{
Z_GDU *p = (Z_GDU *) odr_malloc(o, sizeof(*p));
Z_HTTP_Response *hres;
"YAZ/" YAZ_VERSION);
if (code != 200)
{
- hres->content_buf = (char*) odr_malloc(o, 400);
+ const char *http_err = z_HTTP_errmsg(code);
+ size_t sz = 400 + strlen(http_err) + (details ?
+ strlen(details) : 0);
+ hres->content_buf = (char*) odr_malloc(o, sz);
sprintf(hres->content_buf,
"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\""
" \"http://www.w3.org/TR/html4/strict.dtd\">\n"
" <P><A HREF=\"http://www.indexdata.com/yaz/\">YAZ</A> "
YAZ_VERSION "</P>\n"
" <P>Error: %d</P>\n"
- " <P>Description: %.50s</P>\n"
+ " <P>Description: %s</P>\n", code, http_err);
+ if (details)
+ {
+ sprintf(hres->content_buf + strlen(hres->content_buf),
+ "<P>Details: %s</P>\n", details);
+ }
+ sprintf(hres->content_buf + strlen(hres->content_buf),
" </BODY>\n"
- "</HTML>\n",
- code, z_HTTP_errmsg(code));
+ "</HTML>\n");
hres->content_len = strlen(hres->content_buf);
z_HTTP_header_add(o, &hres->headers, "Content-Type", "text/html");
}
return p;
}
+Z_GDU *z_get_HTTP_Response(ODR o, int code)
+{
+ return z_get_HTTP_Response_details(o, code, 0);
+}
+
const char *z_HTTP_errmsg(int code)
{
switch (code)
odr_write2(o, sbuf, strlen(sbuf));
for (h = hr->headers; h; h = h->next)
{
- if (yaz_matchstr(h->name, "Content-Length"))
+ if (yaz_strcasecmp(h->name, "Content-Length")
+ && yaz_strcasecmp(h->name, "Transfer-Encoding"))
{ /* skip Content-Length if given. content_len rules */
odr_write2(o, h->name, strlen(h->name));
odr_write2(o, ": ", 2);