/*
- * Copyright (c) 2002-2003, Index Data.
+ * Copyright (C) 1995-2005, Index Data ApS
* See the file LICENSE for details.
*
- * $Id: zgdu.c,v 1.6 2004-02-19 23:21:44 adam Exp $
+ * $Id: zgdu.c,v 1.12 2005-01-15 19:47:14 adam Exp $
*/
+/**
+ * \file zgdu.c
+ * \brief Implements HTTP and Z39.50 encoding and decoding.
+ */
+
+#include <ctype.h>
#include <yaz/odr.h>
#include <yaz/yaz-version.h>
#include <yaz/yaz-iconv.h>
#include <yaz/zgdu.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)
{
{
int off = 0;
- /* we know buffer will be smaller than o->size - i - 2*/
- *content_buf = (char*) odr_malloc(o, o->size - i - 2);
+ /* we know buffer will be smaller than o->size - i*/
+ *content_buf = (char*) odr_malloc(o, o->size - i);
while (1)
{
+ /* chunk length .. */
int chunk_len = 0;
for (; i < o->size-2; i++)
if (isdigit(o->buf[i]))
(o->buf[i] - ('a'-10));
else
break;
- if (i > o->size - 2)
- break;
- if (o->buf[i] != '\r' || o->buf[i+1] != '\n')
- { /* chunk length must be followed by \r\n */
- o->error = OHTTP;
- return 0;
+ /* chunk extension ... */
+ while (o->buf[i] != '\r' && o->buf[i+1] != '\n')
+ {
+ if (i >= o->size-2)
+ {
+ o->error = OHTTP;
+ return 0;
+ }
+ i++;
}
- i += 2;
+ i += 2; /* skip CRLF */
if (chunk_len == 0)
break;
if (chunk_len < 0 || off + chunk_len > o->size)
o->error = OHTTP;
return 0;
}
+ /* copy chunk .. */
memcpy (*content_buf + off, o->buf + i, chunk_len);
- i += chunk_len;
+ i += chunk_len + 2; /* skip chunk+CRLF */
off += chunk_len;
}
if (!off)
hr = (*p)->u.HTTP_Response = (Z_HTTP_Response *)
odr_malloc(o, sizeof(*hr));
+ hr->content_buf = 0;
+ hr->content_len = 0;
+
po = i = 5;
while (i < o->size-2 && o->buf[i] != ' ' && o->buf[i] != '\r')
i++;
(*p)->u.HTTP_Response->content_len);
if (o->direction == ODR_PRINT)
{
- fprintf(o->print, "-- HTTP response:\n%.*s\n", o->top - top0,
- o->buf + top0);
- fprintf(o->print, "-- \n");
+ odr_printf(o, "-- HTTP response:\n%.*s\n", o->top - top0,
+ o->buf + top0);
+ odr_printf(o, "-- \n");
}
break;
case Z_GDU_HTTP_Request:
(*p)->u.HTTP_Request->content_len);
if (o->direction == ODR_PRINT)
{
- fprintf(o->print, "-- HTTP request:\n%.*s\n", o->top - top0,
+ odr_printf(o, "-- HTTP request:\n%.*s\n", o->top - top0,
o->buf + top0);
- fprintf(o->print, "-- \n");
+ odr_printf(o, "-- \n");
}
break;
case Z_GDU_Z3950: