#include "eventl.h"
#include "pazpar2.h"
#include "http.h"
-#include "http_command.h"
#include "settings.h"
#include "client.h"
struct http_session *next;
};
-static struct http_session *session_list = 0;
+static struct http_session *session_list = 0; /* thread pr */
+
void http_session_destroy(struct http_session *s);
static void session_timeout(IOCHAN i, int event)
http_session_destroy(s);
}
-struct http_session *http_session_create(void)
+struct http_session *http_session_create(struct conf_service *service)
{
NMEM nmem = nmem_create();
struct http_session *r = nmem_malloc(nmem, sizeof(*r));
- r->psession = new_session(nmem);
+ r->psession = new_session(nmem, service);
r->session_id = 0;
r->timestamp = 0;
r->nmem = nmem;
unsigned int make_sessionid(void)
{
- static int seq = 0;
+ static int seq = 0; /* thread pr */
unsigned int res;
seq++;
static struct http_session *locate_session(struct http_request *rq, struct http_response *rs)
{
struct http_session *p;
- char *session = http_argbyname(rq, "session");
+ const char *session = http_argbyname(rq, "session");
unsigned int id;
if (!session)
static void cmd_exit(struct http_channel *c)
{
yaz_log(YLOG_WARN, "exit");
- http_close_server();
+ http_close_server(c->server);
}
static void cmd_init(struct http_channel *c)
unsigned int sesid;
char buf[1024];
const char *clear = http_argbyname(c->request, "clear");
- struct http_session *s = http_session_create();
+ const char *service_name = http_argbyname(c->request, "service");
+ struct conf_service *service = locate_service(c->server,
+ service_name);
+ struct http_session *s = http_session_create(service);
struct http_response *rs = c->response;
+ if (!service)
+ {
+ error(rs, PAZPAR2_MALFORMED_PARAMETER_VALUE, "service");
+ return;
+ }
+
yaz_log(YLOG_DEBUG, "HTTP Session init");
if (!clear || *clear == '0')
session_init_databases(s->psession);
struct termlist_score **p;
int len;
int i;
- char *name = http_argbyname(rq, "name");
- char *nums = http_argbyname(rq, "num");
+ const char *name = http_argbyname(rq, "name");
+ const char *nums = http_argbyname(rq, "num");
int num = 15;
int status;
while (*name)
{
char tname[256];
- char *tp;
+ const char *tp;
if (!(tp = strchr(name, ',')))
tp = name + strlen(name);
struct http_response *rs = c->response;
struct http_request *rq = c->request;
struct http_session *s = locate_session(rq, rs);
- struct record_cluster *rec;
+ struct record_cluster *rec, *prev_r, *next_r;
struct record *r;
- struct conf_service *service = global_parameters.server->service;
+ struct conf_service *service = s->psession->service;
const char *idstr = http_argbyname(rq, "id");
const char *offsetstr = http_argbyname(rq, "offset");
const char *binarystr = http_argbyname(rq, "binary");
return;
}
wrbuf_rewind(c->wrbuf);
- if (!(rec = show_single(s->psession, idstr)))
+ if (!(rec = show_single(s->psession, idstr, &prev_r, &next_r)))
{
if (session_set_watch(s->psession, SESSION_WATCH_RECORD,
cmd_record_ready, c, c) != 0)
error(rs, PAZPAR2_RECORD_FAIL, "no record at offset given");
return;
}
- else if (syntax == 0 && esn == 0)
- {
- http_channel_observer_t obs =
- http_add_observer(c, r->client, show_raw_reset);
- int ret = client_show_raw_immediate(
- r->client, r->position, syntax, esn,
- obs,
- show_raw_record_error,
- (binary ?
- show_raw_record_ok_binary :
- show_raw_record_ok),
- (binary ? 1 : 0));
- if (ret == -1)
- {
- http_remove_observer(obs);
- error(rs, PAZPAR2_NO_SESSION, 0);
- return;
- }
- }
else
{
- void *data2;
http_channel_observer_t obs =
http_add_observer(c, r->client, show_raw_reset);
- int ret =
- client_show_raw_begin(
- r->client, r->position, syntax, esn,
- obs /* data */,
- show_raw_record_error,
- (binary ?
- show_raw_record_ok_binary :
- show_raw_record_ok),
- &data2,
- (binary ? 1 : 0));
+ int ret = client_show_raw_begin(r->client, r->position,
+ syntax, esn,
+ obs /* data */,
+ show_raw_record_error,
+ (binary ?
+ show_raw_record_ok_binary :
+ show_raw_record_ok),
+ (binary ? 1 : 0));
if (ret == -1)
{
http_remove_observer(obs);
error(rs, PAZPAR2_NO_SESSION, 0);
- return;
}
}
}
wrbuf_puts(c->wrbuf, "<recid>");
wrbuf_xmlputs(c->wrbuf, rec->recid);
wrbuf_puts(c->wrbuf, "</recid>\n");
+ if (prev_r)
+ {
+ wrbuf_puts(c->wrbuf, "<prevrecid>");
+ wrbuf_xmlputs(c->wrbuf, prev_r->recid);
+ wrbuf_puts(c->wrbuf, "</prevrecid>\n");
+ }
+ if (next_r)
+ {
+ wrbuf_puts(c->wrbuf, "<nextrecid>");
+ wrbuf_xmlputs(c->wrbuf, next_r->recid);
+ wrbuf_puts(c->wrbuf, "</nextrecid>\n");
+ }
+ wrbuf_printf(c->wrbuf, "<activeclients>%d</activeclients>\n",
+ session_active_clients(s->psession));
write_metadata(c->wrbuf, service, rec->metadata, 1);
for (r = rec->records; r; r = r->next)
write_subrecord(r, c->wrbuf, service, 1);
struct http_session *s = locate_session(rq, rs);
struct record_cluster **rl;
struct reclist_sortparms *sp;
- char *start = http_argbyname(rq, "start");
- char *num = http_argbyname(rq, "num");
- char *sort = http_argbyname(rq, "sort");
+ const char *start = http_argbyname(rq, "start");
+ const char *num = http_argbyname(rq, "num");
+ const char *sort = http_argbyname(rq, "sort");
int startn = 0;
int numn = 20;
int total;
numn = atoi(num);
if (!sort)
sort = "relevance";
- if (!(sp = reclist_parse_sortparms(c->nmem, sort)))
+ if (!(sp = reclist_parse_sortparms(c->nmem, sort, s->psession->service)))
{
error(rs, PAZPAR2_MALFORMED_PARAMETER_VALUE, "sort");
return;
int ccount;
struct record *p;
struct record_cluster *rec = rl[i];
- struct conf_service *service = global_parameters.server->service;
+ struct conf_service *service = s->psession->service;
wrbuf_puts(c->wrbuf, "<hit>\n");
write_metadata(c->wrbuf, service, rec->metadata, 0);
struct http_request *rq = c->request;
struct http_response *rs = c->response;
struct http_session *s = locate_session(rq, rs);
- char *block = http_argbyname(rq, "block");
+ const char *block = http_argbyname(rq, "block");
int status;
if (!s)
struct http_request *rq = c->request;
struct http_response *rs = c->response;
struct http_session *s = locate_session(rq, rs);
- char *query = http_argbyname(rq, "query");
- char *filter = http_argbyname(rq, "filter");
+ const char *query = http_argbyname(rq, "query");
+ const char *filter = http_argbyname(rq, "filter");
enum pazpar2_error_code code;
const char *addinfo = 0;
wrbuf_rewind(c->wrbuf);
wrbuf_puts(c->wrbuf, "<info>\n");
wrbuf_puts(c->wrbuf, " <version>\n");
- wrbuf_puts(c->wrbuf, "<pazpar2>");
+ wrbuf_puts(c->wrbuf, "<pazpar2");
+#ifdef PAZPAR2_VERSION_SHA1
+ wrbuf_printf(c->wrbuf, " sha1=\"%s\"", PAZPAR2_VERSION_SHA1);
+#endif
+ wrbuf_puts(c->wrbuf, ">");
wrbuf_xmlputs(c->wrbuf, VERSION);
wrbuf_puts(c->wrbuf, "</pazpar2>");
void http_command(struct http_channel *c)
{
- char *command = http_argbyname(c->request, "command");
+ const char *command = http_argbyname(c->request, "command");
struct http_response *rs = http_create_response(c);
int i;