X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fcomstack.c;h=19346b48f3eaef154cb1c34567bfad9178e24195;hp=6934ea68b5ad2728cb2c31b50a6d069136acc16e;hb=2788a4851b551e1a3efb320a2878b809f2d8a9d7;hpb=019eca69c2a438db0aea7b8760685c618cb5f552 diff --git a/src/comstack.c b/src/comstack.c index 6934ea6..19346b4 100644 --- a/src/comstack.c +++ b/src/comstack.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2009 Index Data * See the file LICENSE for details. - * - * $Id: comstack.c,v 1.19 2007-10-05 16:46:55 adam Exp $ */ /** @@ -24,6 +22,14 @@ #define strncasecmp _strnicmp #endif +#if HAVE_GNUTLS_H +#define ENABLE_SSL 1 +#endif + +#if HAVE_OPENSSL_SSL_H +#define ENABLE_SSL 1 +#endif + static const char *cs_errlist[] = { "No error or unspecified error", @@ -74,9 +80,24 @@ void cs_get_host_args(const char *type_and_host, const char **args) } } -int cs_parse_host(const char *uri, const char **host, - CS_TYPE *t, enum oid_proto *proto) +static int cs_parse_host(const char *uri, const char **host, + CS_TYPE *t, enum oid_proto *proto, + char **connect_host) { + *connect_host = 0; + if (strncmp(uri, "connect:", 8) == 0) + { + const char *cp = strchr(uri, ','); + if (cp) + { + size_t len = cp - (uri + 8); + *connect_host = (char *) xmalloc(len+1); + memcpy(*connect_host, uri + 8, len); + (*connect_host)[len] = '\0'; + uri = cp+1; + } + } + if (strncmp (uri, "tcp:", 4) == 0) { *t = tcpip_type; @@ -85,7 +106,7 @@ int cs_parse_host(const char *uri, const char **host, } else if (strncmp (uri, "ssl:", 4) == 0) { -#if HAVE_OPENSSL_SSL_H +#if ENABLE_SSL *t = ssl_type; *host = uri + 4; *proto = PROTO_Z3950; @@ -113,7 +134,7 @@ int cs_parse_host(const char *uri, const char **host, } else if (strncmp(uri, "https:", 6) == 0) { -#if HAVE_OPENSSL_SSL_H +#if ENABLE_SSL *t = ssl_type; *host = uri + 6; while (**host == '/') @@ -138,18 +159,27 @@ COMSTACK cs_create_host(const char *vhost, int blocking, void **vp) const char *host = 0; COMSTACK cs; CS_TYPE t; + char *connect_host = 0; - cs_parse_host(vhost, &host, &t, &proto); - - cs = cs_create(t, blocking, proto); - if (!cs) - return 0; + cs_parse_host(vhost, &host, &t, &proto, &connect_host); - if (!(*vp = cs_straddr(cs, host))) + if (t == tcpip_type) { - cs_close (cs); - return 0; - } + cs = yaz_tcpip_create(-1, blocking, proto, connect_host ? host : 0); + } + else + { + cs = cs_create(t, blocking, proto); + } + if (cs) + { + if (!(*vp = cs_straddr(cs, connect_host ? connect_host : host))) + { + cs_close (cs); + cs = 0; + } + } + xfree(connect_host); return cs; } @@ -178,7 +208,7 @@ static int skip_crlf(const char *buf, int len, int *i) #define CHUNK_DEBUG 0 -int cs_complete_http(const char *buf, int len) +static int cs_complete_http(const char *buf, int len, int head_only) { /* deal with HTTP request/response */ int i = 2, content_len = 0, chunked = 0; @@ -188,7 +218,7 @@ int cs_complete_http(const char *buf, int len) /* if dealing with HTTP responses - then default content length is unlimited (socket close) */ - if (!memcmp(buf, "HTTP/", 5)) + if (!head_only && !memcmp(buf, "HTTP/", 5)) content_len = -1; #if 0 @@ -324,16 +354,27 @@ int cs_complete_http(const char *buf, int len) return 0; } -int cs_complete_auto(const unsigned char *buf, int len) +static int cs_complete_auto_x(const char *buf, int len, int head_only) { if (len > 5 && buf[0] >= 0x20 && buf[0] < 0x7f && buf[1] >= 0x20 && buf[1] < 0x7f && buf[2] >= 0x20 && buf[2] < 0x7f) { - int r = cs_complete_http((const char *) buf, len); + int r = cs_complete_http(buf, len, head_only); return r; } - return completeBER(buf, len); + return completeBER((const unsigned char *) buf, len); +} + + +int cs_complete_auto(const char *buf, int len) +{ + return cs_complete_auto_x(buf, len, 0); +} + +int cs_complete_auto_head(const char *buf, int len) +{ + return cs_complete_auto_x(buf, len, 1); } void cs_set_max_recv_bytes(COMSTACK cs, int max_recv_bytes)