22 char **content_buf,
int *content_len)
26 const char *buf = o->
op->
buf;
30 while (i < size-1 && buf[i] ==
'\n')
34 if (buf[i] ==
'\r' && i < size-1 && buf[i+1] ==
'\n')
48 else if (buf[i] ==
':')
52 (*headers)->name =
odr_strdupn(o, buf + po, i - po);
54 while (i < size-1 && buf[i] ==
' ')
56 for (po = i; i < size-1 && !strchr(
"\r\n", buf[i]); i++)
59 (*headers)->value =
odr_strdupn(o, buf + po, i - po);
64 headers = &(*headers)->
next;
65 if (i < size-1 && buf[i] ==
'\r')
81 *content_buf = (
char*)
odr_malloc(o, size - i);
87 for (; i < size-2; i++)
89 chunk_len = chunk_len * 16 +
92 chunk_len = chunk_len * 16 +
95 chunk_len = chunk_len * 16 +
100 while (buf[i] !=
'\r' && buf[i+1] !=
'\n')
112 if (chunk_len < 0 || off + chunk_len > size)
118 memcpy (*content_buf + off, buf + i, chunk_len);
140 *content_len = size - i;
141 *content_buf =
odr_strdupn(o, buf + i, *content_len);
148 const char *content_type,
151 const char *l =
"Content-Type";
154 char *ctype = (
char *)
155 odr_malloc(o, strlen(content_type)+strlen(charset) + 15);
156 sprintf(ctype,
"%s; charset=%s", content_type, charset);
169 const char *username,
const char *password)
179 len = strlen(username) + strlen(password);
181 sprintf(tmp,
"%s:%s", username, password);
182 buf = (
char *)
odr_malloc(o, (len+1) * 8/6 + 12);
183 strcpy(buf,
"Basic ");
224 const char *v = (*hp)->value;
235 for (; hp; hp = hp->
next)
271 const char *cp0 = strstr(host,
"://");
278 cp1 = strchr(cp0,
'/');
280 cp1 = cp0+strlen(cp0);
295 const char *cp0 = strstr(uri,
"://");
302 cp1 = strchr(cp0,
'/');
304 cp1 = cp0+strlen(cp0);
332 const char *server,
const char *server_url)
349 size_t sz = 400 + strlen(http_err) + (details ?
350 strlen(details) : 0);
353 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\""
354 " \"http://www.w3.org/TR/html4/strict.dtd\">\n"
357 " <TITLE>%s</TITLE>\n"
360 " <P><A HREF=\"%s\">%s</A></P>\n"
361 " <P>Error: %d</P>\n"
362 " <P>Description: %s</P>\n", server, server_url, server,
367 "<P>Details: %s</P>\n", details);
381 "http://www.indexdata.com/yaz");
396 return "Switching Protocols";
404 return "Non-Authoritative Information";
408 return "Reset Content";
410 return "Partial Content";
412 return "Multiple Choices";
414 return "Moved Permenently";
420 return "Not Modified";
424 return "Temporary Redirect";
426 return "Bad Request";
430 return "Method Not Allowed";
432 return "Not Acceptable";
434 return "Proxy Authentication Required";
436 return "Request Timeout";
442 return "Length Required";
444 return "Precondition Failed";
446 return "Request Entity Too Large";
448 return "Request-URI Too Long";
450 return "Unsupported Media Type";
452 return "Requested Range Not Satisfiable";
454 return "Expectation Failed";
456 return "Internal Error";
458 return "Not Implemented";
460 return "Bad Gateway";
462 return "Service Unavailable";
464 return "Gateway Timeout";
466 return "HTTP Version Not Supported";
468 return "Unknown Error";
476 const char *buf = o->
op->
buf;
484 while (i < size-2 && !strchr(
" \r\n", buf[i]))
494 while (i < size-2 && buf[i] >=
'0' && buf[i] <=
'9')
496 hr->
code = hr->
code*10 + (buf[i] -
'0');
499 while (i < size-1 && buf[i] !=
'\n')
509 const char *buf = o->
op->
buf;
521 for (i = 0; buf[i] !=
' '; i++)
522 if (i >= size-5 || i > 30)
529 while (i < size && !strchr(
"\r\n", buf[i]))
535 if (!lspace || i >= size || lspace >= size - 5 ||
536 memcmp(buf + lspace + 1,
"HTTP/", 5))
543 if (i < size-1 && buf[i] ==
'\r')
568 odr_printf(o,
"(truncated from %ld to %d\n", (
long) len, i);
571 else if (buf[i] == 0)
584 int top0 = o->
op->
top;
586 sprintf(sbuf,
"HTTP/%s %d %s\r\n", hr->
version,
591 sprintf(sbuf,
"Content-Length: %d\r\n", hr->
content_len);
620 int top0 = o->
op->
top;
626 cp = strchr(hr->
path,
'#');
636 sprintf(lstr,
"Content-Length: %d\r\n",
662 if (*location ==
'/')
667 strcpy(nlocation, uri);
670 args = nlocation + strlen(nlocation);
673 strcpy(args, location);
void yaz_base64encode(const char *in, char *out)
encodes Base64 string
Header for Base64 utilities.
void cs_get_host_args(const char *type_and_host, const char **args)
Z_GDU * z_get_HTTP_Response(ODR o, int code)
int yaz_decode_http_request(ODR o, Z_HTTP_Request **hr_p)
Z_GDU * z_get_HTTP_Request(ODR o)
const char * z_HTTP_errmsg(int code)
int yaz_encode_http_request(ODR o, Z_HTTP_Request *hr)
const char * z_HTTP_header_lookup(const Z_HTTP_Header *hp, const char *n)
Z_GDU * z_get_HTTP_Request_uri(ODR odr, const char *uri, const char *args, int use_full_uri)
void z_HTTP_header_add_basic_auth(ODR o, Z_HTTP_Header **hp, const char *username, const char *password)
Z_GDU * z_get_HTTP_Response_server(ODR o, int code, const char *details, const char *server, const char *server_url)
int yaz_decode_http_response(ODR o, Z_HTTP_Response **hr_p)
void z_HTTP_header_set(ODR o, Z_HTTP_Header **hp, const char *n, const char *v)
static int decode_headers_content(ODR o, int off, Z_HTTP_Header **headers, char **content_buf, int *content_len)
int yaz_encode_http_response(ODR o, Z_HTTP_Response *hr)
const char * z_HTTP_header_remove(Z_HTTP_Header **hp, const char *n)
const char * yaz_check_location(ODR odr, const char *uri, const char *location, int *host_change)
Z_GDU * z_get_HTTP_Response_details(ODR o, int code, const char *details)
Z_GDU * z_get_HTTP_Request_host_path(ODR odr, const char *host, const char *path)
static void dump_http_package(ODR o, const char *buf, size_t len)
void z_HTTP_header_add(ODR o, Z_HTTP_Header **hp, const char *n, const char *v)
void z_HTTP_header_add_content_type(ODR o, Z_HTTP_Header **hp, const char *content_type, const char *charset)
int yaz_strcasecmp(const char *s1, const char *s2)
ala strcasecmp - no locale
Header for YAZ iconv interface.
Internal ODR definitions.
void odr_printf(ODR o, const char *fmt,...)
#define ODR_VISIBLESTRING
char * odr_strdupn(ODR o, const char *str, size_t n)
char * odr_strdup(ODR o, const char *str)
int odr_write(ODR o, const char *buf, int bytes)
void * odr_malloc(ODR o, size_t size)
void(* stream_write)(ODR o, void *handle, int type, const char *buf, int len)
Z_HTTP_Request * HTTP_Request
Z_HTTP_Response * HTTP_Response
Header for YAZ iconv interface.
#define YAZ_VERSION
YAZ version as string.
Header for the Z_GDU (HTTP or Z39.50 package)
#define Z_GDU_HTTP_Response
#define Z_GDU_HTTP_Request