- wrbuf_puts(c->wrbuf, "<record>\n");
- wrbuf_printf(c->wrbuf, "<recid>%d</recid>\n", rec->recid);
- write_metadata(c->wrbuf, service, rec->metadata, 1);
- for (r = rec->records; r; r = r->next)
- write_subrecord(r, c->wrbuf, service, 1);
- wrbuf_puts(c->wrbuf, "</record>\n");
- rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf));
- http_send_response(c);
+ if (offsetstr)
+ {
+ int offset = atoi(offsetstr);
+ const char *syntax = http_argbyname(rq, "syntax");
+ const char *esn = http_argbyname(rq, "esn");
+ int i;
+ struct record*r = rec->records;
+
+ for (i = 0; i < offset && r; r = r->next, i++)
+ ;
+ if (!r)
+ {
+ error(rs, PAZPAR2_RECORD_FAIL, "no record at offset given");
+ return;
+ }
+ else
+ {
+ http_channel_observer_t obs =
+ http_add_observer(c, r->client, show_raw_reset);
+ if (client_show_raw_begin(r->client, r->position, syntax, esn,
+ obs /* data */,
+ show_raw_record_error,
+ show_raw_record_ok))
+ {
+ http_remove_observer(obs);
+ error(rs, PAZPAR2_RECORD_FAIL, "invalid parameters");
+ return;
+ }
+ }
+ }
+ else
+ {
+ wrbuf_puts(c->wrbuf, "<record>\n");
+ wrbuf_printf(c->wrbuf, "<recid>%s</recid>\n", rec->recid);
+ write_metadata(c->wrbuf, service, rec->metadata, 1);
+ for (r = rec->records; r; r = r->next)
+ write_subrecord(r, c->wrbuf, service, 1);
+ wrbuf_puts(c->wrbuf, "</record>\n");
+ rs->payload = nmem_strdup(c->nmem, wrbuf_cstr(c->wrbuf));
+ http_send_response(c);
+ }