From beab89a43b1060eff01824c32298128ef83a816e Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Tue, 9 Jul 2013 15:02:07 +0200 Subject: [PATCH] New utility yaz_url_get_error YAZ-669 --- include/yaz/url.h | 9 +++++++++ src/url.c | 38 +++++++++++++++++++++++++++++++------- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/include/yaz/url.h b/include/yaz/url.h index 0deb4db..66edc5e 100644 --- a/include/yaz/url.h +++ b/include/yaz/url.h @@ -74,11 +74,20 @@ YAZ_EXPORT void yaz_url_set_max_redirects(yaz_url_t p, int num); \param buf content buffer for HTTP request, NULL for empty content \param len content length for HTTP request \returns HTTP response; NULL on ERROR. + + Use yaz_url_get_error to get details if NULL is returned. */ YAZ_EXPORT Z_HTTP_Response *yaz_url_exec(yaz_url_t p, const char *uri, const char *method, Z_HTTP_Header *headers, const char *buf, size_t len); + +/** \brief get last error from yaz_url_exec + \param p handle + \returns message (possibly empty string no error occurred) +*/ +YAZ_EXPORT const char *yaz_url_get_error(yaz_url_t p); + YAZ_END_CDECL #endif diff --git a/src/url.c b/src/url.c index ff7ff81..5e699d9 100644 --- a/src/url.c +++ b/src/url.c @@ -13,12 +13,14 @@ #include #include #include +#include struct yaz_url { ODR odr_in; ODR odr_out; char *proxy; int max_redirects; + WRBUF w_error; }; yaz_url_t yaz_url_create(void) @@ -28,6 +30,7 @@ yaz_url_t yaz_url_create(void) p->odr_out = odr_createmem(ODR_ENCODE); p->proxy = 0; p->max_redirects = 10; + p->w_error = wrbuf_alloc(); return p; } @@ -38,6 +41,7 @@ void yaz_url_destroy(yaz_url_t p) odr_destroy(p->odr_in); odr_destroy(p->odr_out); xfree(p->proxy); + wrbuf_destroy(p->w_error); xfree(p); } } @@ -93,6 +97,16 @@ static void extract_user_pass(NMEM nmem, *uri_lean = nmem_strdup(nmem, uri); } +const char *yaz_url_get_error(yaz_url_t p) +{ + return wrbuf_cstr(p->w_error); +} + +static void log_warn(yaz_url_t p) +{ + yaz_log(YLOG_WARN, "yaz_url: %s", wrbuf_cstr(p->w_error)); +} + Z_HTTP_Response *yaz_url_exec(yaz_url_t p, const char *uri, const char *method, Z_HTTP_Header *user_headers, @@ -101,6 +115,7 @@ Z_HTTP_Response *yaz_url_exec(yaz_url_t p, const char *uri, Z_HTTP_Response *res = 0; int number_of_redirects = 0; + wrbuf_rewind(p->w_error); while (1) { void *add; @@ -144,17 +159,21 @@ Z_HTTP_Response *yaz_url_exec(yaz_url_t p, const char *uri, } if (!z_GDU(p->odr_out, &gdu, 0, 0)) { - yaz_log(YLOG_WARN, "Can not encode HTTP request URL:%s", uri); + wrbuf_printf(p->w_error, "Can not encode HTTP request for URL %s", + uri); + log_warn(p); return 0; } conn = cs_create_host_proxy(uri_lean, 1, &add, p->proxy); if (!conn) { - yaz_log(YLOG_WARN, "Could not resolve URL: %s", uri); + wrbuf_printf(p->w_error, "Can not resolve URL %s", uri); + log_warn(p); } else if (cs_connect(conn, add) < 0) { - yaz_log(YLOG_WARN, "Can not connect to URL: %s", uri); + wrbuf_printf(p->w_error, "Can not connect to URL %s", uri); + log_warn(p); } else { @@ -162,7 +181,10 @@ Z_HTTP_Response *yaz_url_exec(yaz_url_t p, const char *uri, char *buf = odr_getbuf(p->odr_out, &len, 0); if (cs_put(conn, buf, len) < 0) - yaz_log(YLOG_WARN, "cs_put failed URL: %s", uri); + { + wrbuf_printf(p->w_error, "cs_put fail for URL %s", uri); + log_warn(p); + } else { char *netbuffer = 0; @@ -170,7 +192,8 @@ Z_HTTP_Response *yaz_url_exec(yaz_url_t p, const char *uri, int cs_res = cs_get(conn, &netbuffer, &netlen); if (cs_res <= 0) { - yaz_log(YLOG_WARN, "cs_get failed URL: %s", uri); + wrbuf_printf(p->w_error, "cs_get failed for URL %s", uri); + log_warn(p); } else { @@ -179,8 +202,9 @@ Z_HTTP_Response *yaz_url_exec(yaz_url_t p, const char *uri, if (!z_GDU(p->odr_in, &gdu, 0, 0) || gdu->which != Z_GDU_HTTP_Response) { - yaz_log(YLOG_WARN, "HTTP decoding failed " - "URL:%s", uri); + wrbuf_printf(p->w_error, "HTTP decoding fail for " + "URL %s", uri); + log_warn(p); } else { -- 1.7.10.4