X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fzoom-c.c;h=b7bb1fed3f5399eed3b480adc6f22122048fe90e;hp=da0d86743d0dac3c4f77e758f45053b514fb362a;hb=7ee4de722ccf984fc27203e70c432e29290f3984;hpb=d5a4d0d6a476429a3588e8e7d9e31094c28ef204 diff --git a/src/zoom-c.c b/src/zoom-c.c index da0d867..b7bb1fe 100644 --- a/src/zoom-c.c +++ b/src/zoom-c.c @@ -50,6 +50,7 @@ static void initlog(void) } void ZOOM_connection_remove_tasks(ZOOM_connection c); +static zoom_ret send_HTTP_redirect(ZOOM_connection c, const char *uri); void ZOOM_set_dset_error(ZOOM_connection c, int error, const char *dset, @@ -296,6 +297,7 @@ ZOOM_API(ZOOM_connection) c->sru_version = 0; c->no_redirects = 0; c->cookies = 0; + c->location = 0; c->saveAPDU_wrbuf = 0; ZOOM_memcached_init(c); @@ -370,19 +372,6 @@ ZOOM_API(void) ZOOM_set_error(c, ZOOM_ERROR_NONE, 0); ZOOM_connection_remove_tasks(c); - if (c->odr_print) - { - odr_setprint(c->odr_print, 0); /* prevent destroy from fclose'ing */ - odr_destroy(c->odr_print); - } - if (ZOOM_options_get_bool(c->options, "apdulog", 0)) - { - c->odr_print = odr_createmem(ODR_PRINT); - odr_setprint(c->odr_print, yaz_log_file()); - } - else - c->odr_print = 0; - if (c->cs) { yaz_log(c->log_details, "%p ZOOM_connection_connect reconnect ok", c); @@ -556,6 +545,33 @@ ZOOM_API(void) return; } + if (c->odr_print) + odr_destroy(c->odr_print); + c->odr_print = 0; + val = ZOOM_options_get(c->options, "apdufile"); + if (val) + { + c->odr_print = odr_createmem(ODR_PRINT); + if (strcmp(val, "-")) + { + FILE *f = fopen(val, "a"); + if (!f) + { + WRBUF w = wrbuf_alloc(); + wrbuf_printf(w, "fopen: %s", val); + ZOOM_set_error(c, ZOOM_ERROR_INTERNAL, wrbuf_cstr(w)); + wrbuf_destroy(w); + return; + } + odr_setprint(c->odr_print, f); + } + } + else if (ZOOM_options_get_bool(c->options, "apdulog", 0)) + { + c->odr_print = odr_createmem(ODR_PRINT); + odr_setprint_noclose(c->odr_print, yaz_log_file()); + } + yaz_log(c->log_details, "%p ZOOM_connection_connect async=%d", c, c->async); ZOOM_connection_add_task(c, ZOOM_TASK_CONNECT); @@ -609,10 +625,7 @@ ZOOM_API(void) if (c->odr_save) odr_destroy(c->odr_save); if (c->odr_print) - { - odr_setprint(c->odr_print, 0); /* prevent destroy from fclose'ing */ odr_destroy(c->odr_print); - } ZOOM_options_destroy(c->options); ZOOM_connection_remove_tasks(c); ZOOM_connection_remove_events(c); @@ -628,6 +641,7 @@ ZOOM_API(void) xfree(c->group); xfree(c->password); xfree(c->sru_version); + xfree(c->location); yaz_cookies_destroy(c->cookies); wrbuf_destroy(c->saveAPDU_wrbuf); xfree(c); @@ -1093,7 +1107,11 @@ static zoom_ret do_connect_host(ZOOM_connection c, const char *logical_url) assert(c->tasks->which == ZOOM_TASK_CONNECT); ZOOM_connection_remove_task(c); ZOOM_connection_set_mask(c, 0); - ZOOM_connection_exec_task(c); + + if (c->cs && c->location) + send_HTTP_redirect(c, c->location); + else + ZOOM_connection_exec_task(c); } c->state = STATE_ESTABLISHED; return zoom_pending; @@ -1498,6 +1516,8 @@ static zoom_ret send_HTTP_redirect(ZOOM_connection c, const char *uri) z_HTTP_header_add_basic_auth(c->odr_out, &gdu->u.HTTP_Request->headers, c->user, c->password); } + xfree(c->location); + c->location = 0; return ZOOM_send_GDU(c, gdu); } @@ -1561,10 +1581,9 @@ static void handle_http(ZOOM_connection c, Z_HTTP_Response *hres) int host_change = 0; location = yaz_check_location(c->odr_in, c->host_port, location, &host_change); - if (do_connect_host(c, location) == zoom_complete) - return; /* connect failed.. */ - cs_rcvconnect(c->cs); - send_HTTP_redirect(c, location); + xfree(c->location); + c->location = xstrdup(location); + do_connect_host(c, location); return; } } @@ -1979,7 +1998,10 @@ static void ZOOM_connection_do_io(ZOOM_connection c, int mask) ZOOM_connection_remove_task(c); ZOOM_connection_set_mask(c, 0); } - ZOOM_connection_exec_task(c); + if (c->cs && c->location) + send_HTTP_redirect(c, c->location); + else + ZOOM_connection_exec_task(c); } c->state = STATE_ESTABLISHED; }