static zoom_ret do_write(ZOOM_connection c);
+ZOOM_API(void) ZOOM_resultset_release(ZOOM_resultset r)
+{
+#if ZOOM_RESULT_LISTS
+#else
+ if (r->connection)
+ {
+ /* remove ourselves from the resultsets in connection */
+ ZOOM_resultset *rp = &r->connection->resultsets;
+ while (1)
+ {
+ assert(*rp); /* we must be in this list!! */
+ if (*rp == r)
+ { /* OK, we're here - take us out of it */
+ *rp = (*rp)->next;
+ break;
+ }
+ rp = &(*rp)->next;
+ }
+ r->connection = 0;
+ }
+#endif
+}
+
ZOOM_API(void)
ZOOM_connection_destroy(ZOOM_connection c)
{
wrbuf_destroy(rec->wrbuf);
#endif
-#if YAZ_HAVE_XML2
- if (rec->xml_mem)
- xmlFree(rec->xml_mem);
-#endif
if (rec->odr)
odr_destroy(rec->odr);
}
yaz_log(log_details, "%p ZOOM_connection resultset_destroy: Deleting resultset (%p) ", r->connection, r);
ZOOM_resultset_cache_reset(r);
-#if ZOOM_RESULT_LISTS
-#else
- if (r->connection)
- {
- /* remove ourselves from the resultsets in connection */
- ZOOM_resultset *rp = &r->connection->resultsets;
- while (1)
- {
- assert(*rp); /* we must be in this list!! */
- if (*rp == r)
- { /* OK, we're here - take us out of it */
- *rp = (*rp)->next;
- break;
- }
- rp = &(*rp)->next;
- }
- }
-#endif
+ ZOOM_resultset_release(r);
ZOOM_query_destroy(r->query);
ZOOM_options_destroy(r->options);
odr_destroy(r->odr);
buf = odr_getbuf(odr_enc, &size, 0);
nrec = (ZOOM_record) xmalloc(sizeof(*nrec));
+ yaz_log(log_details, "ZOOM_record create");
nrec->odr = odr_createmem(ODR_DECODE);
#if SHPTR
nrec->record_wrbuf = 0;
#else
nrec->wrbuf = 0;
#endif
-#if YAZ_HAVE_XML2
- nrec->xml_mem = 0;
- nrec->xml_size = 0;
-#endif
odr_setbuf(nrec->odr, buf, size, 0);
z_NamePlusRecord(nrec->odr, &nrec->npr, 0, 0);
ZOOM_record_destroy(ZOOM_record rec)
{
ZOOM_record_release(rec);
+ yaz_log(log_details, "ZOOM_record destroy");
xfree(rec);
}
return cd;
}
-static const char *return_marc_record(ZOOM_record rec, WRBUF wrbuf,
+static const char *return_marc_record(WRBUF wrbuf,
int marc_type,
int *len,
const char *buf, int sz,
return ret_string;
}
-static const char *return_opac_record(ZOOM_record rec, WRBUF wrbuf,
+static const char *return_opac_record(WRBUF wrbuf,
int marc_type,
int *len,
Z_OPACRecord *opac_rec,
return wrbuf_cstr(wrbuf);
}
-static const char *return_string_record(ZOOM_record rec, WRBUF wrbuf,
+static const char *return_string_record(WRBUF wrbuf,
int *len,
const char *buf, int sz,
const char *record_charset)
return buf;
}
-static const char *return_record(ZOOM_record rec, int *len,
- Z_NamePlusRecord *npr,
- int marctype, const char *charset)
+static const char *return_record_wrbuf(WRBUF wrbuf, int *len,
+ Z_NamePlusRecord *npr,
+ int marctype, const char *charset)
{
Z_External *r = (Z_External *) npr->u.databaseRecord;
const Odr_oid *oid = r->direct_reference;
- WRBUF wrbuf;
-#if SHPTR
- if (!rec->record_wrbuf)
- {
- WRBUF w = wrbuf_alloc();
- YAZ_SHPTR_INIT(rec->record_wrbuf, w);
- }
- wrbuf = rec->record_wrbuf->ptr;
-#else
- if (!rec->wrbuf)
- rec->wrbuf = wrbuf_alloc();
- wrbuf = rec->wrbuf;
-#endif
wrbuf_rewind(wrbuf);
/* render bibliographic record .. */
if (r->which == Z_External_OPAC)
{
- return return_opac_record(rec, wrbuf, marctype, len,
+ return return_opac_record(wrbuf, marctype, len,
r->u.opac, charset);
}
if (r->which == Z_External_sutrs)
- return return_string_record(rec, wrbuf, len,
+ return return_string_record(wrbuf, len,
(char*) r->u.sutrs->buf,
r->u.sutrs->len,
charset);
if (yaz_oid_is_iso2709(oid))
{
const char *ret_buf = return_marc_record(
- rec, wrbuf, marctype, len,
+ wrbuf, marctype, len,
(const char *) r->u.octet_aligned->buf,
r->u.octet_aligned->len,
charset);
if (marctype != YAZ_MARC_ISO2709)
return 0;
}
- return return_string_record(rec, wrbuf, len,
+ return return_string_record(wrbuf, len,
(const char *) r->u.octet_aligned->buf,
r->u.octet_aligned->len,
charset);
else if (r->which == Z_External_grs1)
{
yaz_display_grs1(wrbuf, r->u.grs1, 0);
- return return_string_record(rec, wrbuf, len,
+ return return_string_record(wrbuf, len,
wrbuf_buf(wrbuf),
wrbuf_len(wrbuf),
charset);
return 0;
}
-
ZOOM_API(int)
ZOOM_record_error(ZOOM_record rec, const char **cp,
const char **addinfo, const char **diagset)
return 0;
}
-static const char *get_record_format(ZOOM_record rec, int *len,
+static const char *get_record_format(WRBUF wrbuf, int *len,
Z_NamePlusRecord *npr,
int marctype, const char *charset,
const char *format)
{
- const char *res = return_record(rec, len, npr, marctype, charset);
+ const char *res = return_record_wrbuf(wrbuf, len, npr, marctype, charset);
#if YAZ_HAVE_XML2
if (*format == '1' && len)
{
doc = xmlParseMemory(res, *len);
if (doc)
{
- if (rec->xml_mem)
- xmlFree(rec->xml_mem);
- xmlDocDumpFormatMemory(doc, &rec->xml_mem, &rec->xml_size, 1);
+ xmlChar *xml_mem;
+ int xml_size;
+ xmlDocDumpFormatMemory(doc, &xml_mem, &xml_size, 1);
+ wrbuf_rewind(wrbuf);
+ wrbuf_write(wrbuf, (const char *) xml_mem, xml_size);
+ xmlFree(xml_mem);
xmlFreeDoc(doc);
- res = (char *) rec->xml_mem;
- *len = rec->xml_size;
+ res = wrbuf_cstr(wrbuf);
+ *len = wrbuf_len(wrbuf);
}
}
#endif
}
-ZOOM_API(const char *)
- ZOOM_record_get(ZOOM_record rec, const char *type_spec, int *len)
+static const char *npr_format(Z_NamePlusRecord *npr, const char *schema,
+ WRBUF wrbuf,
+ const char *type_spec, int *len)
{
+ size_t i;
char type[40];
char charset[40];
char format[3];
- const char *cp;
- size_t i;
- Z_NamePlusRecord *npr;
-
- if (len)
- *len = 0; /* default return */
-
- if (!rec)
- return 0;
- npr = rec->npr;
- if (!npr)
- return 0;
+ const char *cp = type_spec;
- cp = type_spec;
for (i = 0; cp[i] && cp[i] != ';' && cp[i] != ' ' && i < sizeof(type)-1;
i++)
type[i] = cp[i];
else if (!strcmp(type, "schema"))
{
if (len)
- *len = rec->schema ? strlen(rec->schema) : 0;
- return rec->schema;
+ *len = schema ? strlen(schema) : 0;
+ return schema;
}
else if (!strcmp(type, "syntax"))
{
/* from now on - we have a database record .. */
if (!strcmp(type, "render"))
{
- return get_record_format(rec, len, npr, YAZ_MARC_LINE, charset, format);
+ return get_record_format(wrbuf, len, npr, YAZ_MARC_LINE, charset, format);
}
else if (!strcmp(type, "xml"))
{
- return get_record_format(rec, len, npr, YAZ_MARC_MARCXML, charset,
+ return get_record_format(wrbuf, len, npr, YAZ_MARC_MARCXML, charset,
format);
}
else if (!strcmp(type, "txml"))
{
- return get_record_format(rec, len, npr, YAZ_MARC_TURBOMARC, charset,
+ return get_record_format(wrbuf, len, npr, YAZ_MARC_TURBOMARC, charset,
format);
}
else if (!strcmp(type, "raw"))
{
- return get_record_format(rec, len, npr, YAZ_MARC_ISO2709, charset,
+ return get_record_format(wrbuf, len, npr, YAZ_MARC_ISO2709, charset,
format);
}
else if (!strcmp(type, "ext"))
else if (!strcmp(type, "opac"))
{
if (npr->u.databaseRecord->which == Z_External_OPAC)
- return get_record_format(rec, len, npr, YAZ_MARC_MARCXML, charset,
- format);
+ return get_record_format(wrbuf, len, npr, YAZ_MARC_MARCXML, charset,
+ format);
}
return 0;
}
+ZOOM_API(const char *)
+ ZOOM_record_get(ZOOM_record rec, const char *type_spec, int *len)
+{
+ WRBUF wrbuf;
+
+ if (len)
+ *len = 0; /* default return */
+
+ if (!rec || !rec->npr)
+ return 0;
+
+#if SHPTR
+ if (!rec->record_wrbuf)
+ {
+ WRBUF w = wrbuf_alloc();
+ YAZ_SHPTR_INIT(rec->record_wrbuf, w);
+ }
+ wrbuf = rec->record_wrbuf->ptr;
+#else
+ if (!rec->wrbuf)
+ rec->wrbuf = wrbuf_alloc();
+ wrbuf = rec->wrbuf;
+#endif
+ return npr_format(rec->npr, rec->schema, wrbuf, type_spec, len);
+}
+
static int strcmp_null(const char *v1, const char *v2)
{
if (!v1 && !v2)
#else
rc->rec.wrbuf = 0;
#endif
-#if YAZ_HAVE_XML2
- rc->rec.xml_mem = 0;
-#endif
rc->elementSetName = odr_strdup_null(r->odr, elementSetName);
rc->syntax = odr_strdup_null(r->odr, syntax);
{
struct Z_HTTP_Header *h;
Z_GDU *gdu = get_HTTP_Request_url(c->odr_out, uri);
+ char *combined_cookies;
+ int combined_cookies_len = 0;
gdu->u.HTTP_Request->method = odr_strdup(c->odr_out, "GET");
z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers, "Accept",
"text/xml");
-
+
for (h = cookie_hres->headers; h; h = h->next)
{
if (!strcmp(h->name, "Set-Cookie"))
- z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
- "Cookie", h->value);
+ {
+ char *cp;
+
+ if (!(cp = strchr(h->value, ';')))
+ cp = h->value + strlen(h->value);
+ if (cp - h->value >= 1) {
+ combined_cookies = xrealloc(combined_cookies, combined_cookies_len + cp - h->value + 3);
+ memcpy(combined_cookies+combined_cookies_len, h->value, cp - h->value);
+ combined_cookies[combined_cookies_len + cp - h->value] = '\0';
+ strcat(combined_cookies,"; ");
+ combined_cookies_len = strlen(combined_cookies);
+ }
+ }
+ }
+
+ if (combined_cookies_len)
+ {
+ z_HTTP_header_add(c->odr_out, &gdu->u.HTTP_Request->headers,
+ "Cookie", combined_cookies);
+ xfree(combined_cookies);
}
+
if (c->user && c->password)
{
z_HTTP_header_add_basic_auth(c->odr_out, &gdu->u.HTTP_Request->headers,
do_close(c);
}
if (cret == zoom_complete)
- ZOOM_connection_remove_task(c);
- if (!strcmp(hres->version, "1.0"))
{
- /* HTTP 1.0: only if Keep-Alive we stay alive.. */
- if (!connection_head || strcmp(connection_head, "Keep-Alive"))
- do_close(c);
+ yaz_log(YLOG_LOG, "removing tasks in handle_http");
+ ZOOM_connection_remove_task(c);
}
- else
{
- /* HTTP 1.1: only if no close we stay alive .. */
- if (connection_head && !strcmp(connection_head, "close"))
+ int must_close = 0;
+ if (!strcmp(hres->version, "1.0"))
+ {
+ /* HTTP 1.0: only if Keep-Alive we stay alive.. */
+ if (!connection_head || strcmp(connection_head, "Keep-Alive"))
+ must_close = 1;
+ }
+ else
+ {
+ /* HTTP 1.1: only if no close we stay alive.. */
+ if (connection_head && !strcmp(connection_head, "close"))
+ must_close = 1;
+ }
+ if (must_close)
+ {
do_close(c);
+ if (c->tasks)
+ {
+ c->tasks->running = 0;
+ ZOOM_connection_insert_task(c, ZOOM_TASK_CONNECT);
+ c->reconnect_ok = 0;
+ }
+ }
}
}
#endif