86 char **uri_lean,
char **http_user,
89 const char *cp1 = strchr(uri,
'/');
97 if (!strncmp(cp1,
"://", 3))
100 const char *cp2 = cp1 + 3;
101 while (*cp2 && *cp2 !=
'/' && *cp2 !=
'@')
107 if (*cp2 ==
'@' && cp3)
110 memcpy(*uri_lean, uri, cp1 + 3 - uri);
111 strcpy(*uri_lean + (cp1 + 3 - uri), cp2 + 1);
113 *http_user =
nmem_strdupn(nmem, cp1 + 3, cp3 - (cp1 + 3));
114 *http_pass =
nmem_strdupn(nmem, cp3 + 1, cp2 - (cp3 + 1));
135 const char *buf,
size_t len)
138 int number_of_redirects = 0;
148 const char *location = 0;
158 &http_user, &http_pass);
169 for ( ; user_headers; user_headers = user_headers->
next)
172 if (!strcmp(user_headers->
name,
"Host"))
175 else if (!strcmp(user_headers->
name,
"User-Agent"))
177 user_headers->
name, user_headers->
value);
180 user_headers->
name, user_headers->
value);
182 if (http_user && http_pass)
185 http_user, http_pass);
210 fwrite(buf_out, 1, len_out, stdout);
246 "cs_rcvconnect failed for URL %s", uri);
255 ret =
cs_put(conn, buf_out, len_out);
269 ret =
cs_get(conn, &netbuffer, &netlen);
281 fwrite(netbuffer, 1, ret, stdout);
305 if (++number_of_redirects <= p->max_redirects &&
306 location && (code == 301 || code == 302 || code == 307))
310 location, &host_change);
COMSTACK cs_create_host2(const char *vhost, int blocking, void **vp, const char *proxy_host, int *proxy_mode)
#define cs_connect(handle, address)
#define cs_put(handle, buf, size)
#define cs_get(handle, buf, size)
#define cs_fileno(handle)
#define cs_rcvconnect(handle)
void yaz_cookies_reset(yaz_cookies_t yc)
void yaz_cookies_destroy(yaz_cookies_t yc)
yaz_cookies_t yaz_cookies_create(void)
void yaz_cookies_request(yaz_cookies_t yc, ODR odr, Z_HTTP_Request *req)
void yaz_cookies_response(yaz_cookies_t yc, Z_HTTP_Response *res)
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)
void z_HTTP_header_set(ODR o, Z_HTTP_Header **hp, const char *n, const char *v)
const char * yaz_check_location(ODR odr, const char *uri, const char *location, int *host_change)
void z_HTTP_header_add(ODR o, Z_HTTP_Header **hp, const char *n, const char *v)
void yaz_log(int level, const char *fmt,...)
Writes log message.
#define YLOG_WARN
log level: warning
void * nmem_malloc(NMEM n, size_t size)
allocates memory block on NMEM handle
char * nmem_strdupn(NMEM mem, const char *src, size_t n)
allocates string of certain size on NMEM handle
char * nmem_strdup(NMEM mem, const char *src)
allocates string on NMEM handle (similar strdup)
ODR odr_createmem(int direction)
void odr_setbuf(ODR o, char *buf, int len, int can_grow)
char * odr_getbuf(ODR o, int *len, int *size)
char * odr_strdup(ODR o, const char *str)
int yaz_poll(struct yaz_poll_fd *fds, int num_fds, int sec, int nsec)
poll wrapper for poll or select
#define yaz_poll_add(var, value)
yaz_poll_mask
select/poll masks .. timeout is "output" only
Z_HTTP_Request * HTTP_Request
Z_HTTP_Response * HTTP_Response
enum yaz_poll_mask input_mask
int cs_set_head_only(COMSTACK cs, int head_only)
const char * yaz_url_get_error(yaz_url_t p)
get last error from yaz_url_exec
void yaz_url_set_timeout(yaz_url_t p, int sec, int ns)
sets I/O timeout
yaz_url_t yaz_url_create(void)
creates a URL fetcher handle
static void extract_user_pass(NMEM nmem, const char *uri, char **uri_lean, char **http_user, char **http_pass)
static void log_warn(yaz_url_t p)
void yaz_url_set_max_redirects(yaz_url_t p, int num)
sets maximum number of redirects
void yaz_url_destroy(yaz_url_t p)
destroys a URL fetcher
void yaz_url_set_proxy(yaz_url_t p, const char *proxy)
sets proxy for URL fetcher
Z_HTTP_Response * yaz_url_exec(yaz_url_t p, const char *uri, const char *method, Z_HTTP_Header *user_headers, const char *buf, size_t len)
executes the actual HTTP request (including redirects, etc)
void yaz_url_set_verbose(yaz_url_t p, int num)
sets verbose level 0=none, >0 verbose
void wrbuf_destroy(WRBUF b)
destroy WRBUF and its buffer
void wrbuf_rewind(WRBUF b)
empty WRBUF content (length of buffer set to 0)
WRBUF wrbuf_alloc(void)
construct WRBUF
void wrbuf_printf(WRBUF b, const char *fmt,...)
writes printf result to WRBUF
const char * wrbuf_cstr(WRBUF b)
returns WRBUF content as C-string
Header for WRBUF (growing buffer)
#define xstrdup(s)
utility macro which calls xstrdup_f
#define xfree(x)
utility macro which calls xfree_f
#define xmalloc(x)
utility macro which calls malloc_f
#define Z_GDU_HTTP_Response
int z_GDU(ODR o, Z_GDU **p, int opt, const char *name)