Remove bend_request definition from backend.h
[yaz-moved-to-github.git] / src / seshigh.c
index aebcdc0..1a3e794 100644 (file)
@@ -93,7 +93,6 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb,
 static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd);
 static Z_APDU *process_sortRequest(association *assoc, request *reqb, int *fd);
 static void process_close(association *assoc, request *reqb);
-void save_referenceId(request *reqb, Z_ReferenceId *refid);
 static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
     int *fd);
 static Z_APDU *process_segmentRequest(association *assoc, request *reqb);
@@ -377,7 +376,7 @@ void ir_session(IOCHAN h, int event)
     {
         if (assoc->state != ASSOC_UP)
         {
-            yaz_log(YLOG_DEBUG, "Final timeout - closing connection.");
+            yaz_log(log_session, "Timeout. Closing connection");
             /* do we need to lod this at all */
             cs_close(conn);
             destroy_association(assoc);
@@ -385,8 +384,7 @@ void ir_session(IOCHAN h, int event)
         }
         else
         {
-            yaz_log(log_sessiondetail, 
-                    "Session idle too long. Sending close.");
+            yaz_log(log_sessiondetail, "Timeout. Sending Z39.50 Close");
             do_close(assoc, Z_Close_lackOfActivity, 0);
         }
         return;
@@ -848,9 +846,10 @@ static int ccl2pqf(ODR odr, const Odr_oct *ccl, CCL_bibset bibset,
 
 static void srw_bend_search(association *assoc, request *req,
                             Z_SRW_PDU *sr,
-                            Z_SRW_searchRetrieveResponse *srw_res,
+                            Z_SRW_PDU *res,
                             int *http_code)
 {
+    Z_SRW_searchRetrieveResponse *srw_res = res->u.response;
     int srw_error = 0;
     Z_External *ext;
     Z_SRW_searchRetrieveRequest *srw_req = sr->u.request;
@@ -873,6 +872,8 @@ static void srw_bend_search(association *assoc, request *req,
         rr.partial_resultset = 0;
         rr.query = (Z_Query *) odr_malloc(assoc->decode, sizeof(*rr.query));
         rr.query->u.type_1 = 0;
+        rr.extra_args = sr->extra_args;
+        rr.extra_response_data = 0;
         
         if (srw_req->query_type == Z_SRW_query_type_cql)
         {
@@ -939,7 +940,6 @@ static void srw_bend_search(association *assoc, request *req,
             rr.stream = assoc->encode;
             rr.decode = assoc->decode;
             rr.print = assoc->print;
-            rr.request = req;
             if ( srw_req->sort.sortKeys )
                 rr.srw_sortKeys = odr_strdup(assoc->encode, 
                                              srw_req->sort.sortKeys );
@@ -1026,14 +1026,11 @@ static void srw_bend_search(association *assoc, request *req,
                         bprr->stream = assoc->encode;
                         bprr->referenceId = 0;
                         bprr->print = assoc->print;
-                        bprr->request = req;
                         bprr->association = assoc;
                         bprr->errcode = 0;
                         bprr->errstring = NULL;
                         (*assoc->init->bend_present)(assoc->backend, bprr);
                         
-                        if (!bprr->request)
-                            return;
                         if (bprr->errcode)
                         {
                             srw_error = yaz_diag_bib1_to_srw(bprr->errcode);
@@ -1094,6 +1091,11 @@ static void srw_bend_search(association *assoc, request *req,
                             srw_res->records = 0;
                     }
                 }
+                if (rr.extra_response_data)
+                {
+                    res->extraResponseData_buf = rr.extra_response_data;
+                    res->extraResponseData_len = strlen(rr.extra_response_data);
+                }
                 if (rr.estimated_hit_count || rr.partial_resultset)
                 {
                     yaz_add_srw_diagnostic(
@@ -1691,6 +1693,7 @@ static void process_http_request(association *assoc, request *req)
     int num_diagnostic = 0;
     const char *host = z_HTTP_header_lookup(hreq->headers, "Host");
 
+    yaz_log(log_request, "%s %s HTTP/%s", hreq->method, hreq->path, hreq->version);
     if (!control_association(assoc, host, 0))
     {
         p = z_get_HTTP_Response(o, 404);
@@ -1783,8 +1786,7 @@ static void process_http_request(association *assoc, request *req)
             }
             else
             {
-                srw_bend_search(assoc, req, sr, res->u.response, 
-                                &http_code);
+                srw_bend_search(assoc, req, sr, res, &http_code);
             }
             if (http_code == 200)
                 soap_package->u.generic->p = res;
@@ -2364,6 +2366,9 @@ static Z_APDU *process_initRequest(association *assoc, request *reqb)
                              binitres->errstring);
         *resp->result = 0;
     }
+    else
+        assoc->state = ASSOC_UP;
+    
     if (log_request)
     {
         if (!req->idAuthentication)
@@ -2458,9 +2463,9 @@ static Z_NamePlusRecord *surrogatediagrec(association *assoc,
     return zget_surrogateDiagRec(assoc->encode, dbname, error, addinfo);
 }
 
-static Z_Records *pack_records(association *a, char *setname, odr_int_t start,
-                               odr_int_t *num, Z_RecordComposition *comp,
-                               odr_int_t *next, odr_int_t *pres,
+static Z_Records *pack_records(association *a, char *setname, Odr_int start,
+                               Odr_int *num, Z_RecordComposition *comp,
+                               Odr_int *next, Odr_int *pres,
                                Z_ReferenceId *referenceId,
                                Odr_oid *oid, int *errcode)
 {
@@ -2616,15 +2621,15 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb,
     
     yaz_log(log_requestdetail, "Got SearchRequest.");
     bsrr->fd = fd;
-    bsrr->request = reqb;
     bsrr->association = assoc;
     bsrr->referenceId = req->referenceId;
-    save_referenceId (reqb, bsrr->referenceId);
     bsrr->srw_sortKeys = 0;
     bsrr->srw_setname = 0;
     bsrr->srw_setnameIdleTime = 0;
     bsrr->estimated_hit_count = 0;
     bsrr->partial_resultset = 0;
+    bsrr->extra_args = 0;
+    bsrr->extra_response_data = 0;
 
     yaz_log (log_requestdetail, "ResultSet '%s'", req->resultSetName);
     if (req->databaseNames)
@@ -2677,8 +2682,6 @@ static Z_APDU *process_searchRequest(association *assoc, request *reqb,
 
         if (!bsrr->errcode)
             (assoc->init->bend_search)(assoc->backend, bsrr);
-        if (!bsrr->request)  /* backend not ready with the search response */
-            return 0;  /* should not be used any more */
     }
     else
     { 
@@ -2704,9 +2707,9 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
     Z_APDU *apdu = (Z_APDU *)odr_malloc(assoc->encode, sizeof(*apdu));
     Z_SearchResponse *resp = (Z_SearchResponse *)
         odr_malloc(assoc->encode, sizeof(*resp));
-    odr_int_t *nulint = odr_intdup(assoc->encode, 0);
-    odr_int_t *next = odr_intdup(assoc->encode, 0);
-    odr_int_t *none = odr_intdup(assoc->encode, Z_SearchResponse_none);
+    Odr_int *nulint = odr_intdup(assoc->encode, 0);
+    Odr_int *next = odr_intdup(assoc->encode, 0);
+    Odr_int *none = odr_intdup(assoc->encode, Z_SearchResponse_none);
     int returnedrecs = 0;
 
     apdu->which = Z_APDU_searchResponse;
@@ -2733,7 +2736,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
     else
     {
         bool_t *sr = odr_booldup(assoc->encode, 1);
-        odr_int_t *toget = odr_intdup(assoc->encode, 0);
+        Odr_int *toget = odr_intdup(assoc->encode, 0);
         Z_RecordComposition comp, *compp = 0;
 
         yaz_log(log_requestdetail, "resultCount: " ODR_INT_PRINTF, bsrt->hits);
@@ -2743,7 +2746,9 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
 
         comp.which = Z_RecordComp_simple;
         /* how many records does the user agent want, then? */
-        if (bsrt->hits <= *req->smallSetUpperBound)
+        if (bsrt->hits < 0)
+            *toget = 0;
+        else if (bsrt->hits <= *req->smallSetUpperBound)
         {
             *toget = bsrt->hits;
             if ((comp.u.simple = req->smallSetElementSetNames))
@@ -2762,7 +2767,7 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
 
         if (*toget && !resp->records)
         {
-            odr_int_t *presst = odr_intdup(assoc->encode, 0);
+            Odr_int *presst = odr_intdup(assoc->encode, 0);
             /* Call bend_present if defined */
             if (assoc->init->bend_present)
             {
@@ -2776,14 +2781,11 @@ static Z_APDU *response_searchRequest(association *assoc, request *reqb,
                 bprr->referenceId = req->referenceId;
                 bprr->stream = assoc->encode;
                 bprr->print = assoc->print;
-                bprr->request = reqb;
                 bprr->association = assoc;
                 bprr->errcode = 0;
                 bprr->errstring = NULL;
                 (*assoc->init->bend_present)(assoc->backend, bprr);
 
-                if (!bprr->request)
-                    return 0;
                 if (bprr->errcode)
                 {
                     resp->records = diagrec(assoc, bprr->errcode, bprr->errstring);
@@ -2872,8 +2874,8 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb,
     Z_PresentRequest *req = reqb->apdu_request->u.presentRequest;
     Z_APDU *apdu;
     Z_PresentResponse *resp;
-    odr_int_t *next;
-    odr_int_t *num;
+    Odr_int *next;
+    Odr_int *num;
     int errcode = 0;
     const char *errstring = 0;
 
@@ -2894,14 +2896,11 @@ static Z_APDU *process_presentRequest(association *assoc, request *reqb,
         bprr->referenceId = req->referenceId;
         bprr->stream = assoc->encode;
         bprr->print = assoc->print;
-        bprr->request = reqb;
         bprr->association = assoc;
         bprr->errcode = 0;
         bprr->errstring = NULL;
         (*assoc->init->bend_present)(assoc->backend, bprr);
         
-        if (!bprr->request)
-            return 0; /* should not happen */
         if (bprr->errcode)
         {
             resp->records = diagrec(assoc, bprr->errcode, bprr->errstring);
@@ -2966,8 +2965,8 @@ static Z_APDU *process_scanRequest(association *assoc, request *reqb, int *fd)
     Z_APDU *apdu = (Z_APDU *)odr_malloc(assoc->encode, sizeof(*apdu));
     Z_ScanResponse *res = (Z_ScanResponse *)
         odr_malloc(assoc->encode, sizeof(*res));
-    odr_int_t *scanStatus = odr_intdup(assoc->encode, Z_Scan_failure);
-    odr_int_t *numberOfEntriesReturned = odr_intdup(assoc->encode, 0);
+    Odr_int *scanStatus = odr_intdup(assoc->encode, Z_Scan_failure);
+    Odr_int *numberOfEntriesReturned = odr_intdup(assoc->encode, 0);
     Z_ListEntries *ents = (Z_ListEntries *)
         odr_malloc(assoc->encode, sizeof(*ents));
     Z_DiagRecs *diagrecs_p = NULL;
@@ -3268,7 +3267,7 @@ static Z_APDU *process_deleteRequest(association *assoc, request *reqb,
     bdrr->statuses = 0;
     if (bdrr->num_setnames > 0)
     {
-        bdrr->statuses = (odr_int_t*) 
+        bdrr->statuses = (Odr_int*) 
             odr_malloc(assoc->encode, sizeof(*bdrr->statuses) *
                        bdrr->num_setnames);
         for (i = 0; i < bdrr->num_setnames; i++)
@@ -3353,72 +3352,6 @@ static void process_close(association *assoc, request *reqb)
     yaz_log(log_request,"Close OK");
 }
 
-void save_referenceId(request *reqb, Z_ReferenceId *refid)
-{
-    if (refid)
-    {
-        reqb->len_refid = refid->len;
-        reqb->refid = (char *)nmem_malloc(reqb->request_mem, refid->len);
-        memcpy(reqb->refid, refid->buf, refid->len);
-    }
-    else
-    {
-        reqb->len_refid = 0;
-        reqb->refid = NULL;
-    }
-}
-
-void bend_request_send(bend_association a, bend_request req, Z_APDU *res)
-{
-    process_z_response(a, req, res);
-}
-
-bend_request bend_request_mk(bend_association a)
-{
-    request *nreq = request_get(&a->outgoing);
-    nreq->request_mem = nmem_create();
-    return nreq;
-}
-
-Z_ReferenceId *bend_request_getid(ODR odr, bend_request req)
-{
-    Z_ReferenceId *id;
-    if (!req->refid)
-        return 0;
-    id = (Odr_oct *)odr_malloc(odr, sizeof(*odr));
-    id->buf = (unsigned char *)odr_malloc(odr, req->len_refid);
-    id->len = id->size = req->len_refid;
-    memcpy(id->buf, req->refid, req->len_refid);
-    return id;
-}
-
-void bend_request_destroy(bend_request *req)
-{
-    nmem_destroy((*req)->request_mem);
-    request_release(*req);
-    *req = NULL;
-}
-
-int bend_backend_respond(bend_association a, bend_request req)
-{
-    char *msg;
-    int r;
-    r = process_z_request(a, req, &msg);
-    if (r < 0)
-        yaz_log(YLOG_WARN, "%s", msg);
-    return r;
-}
-
-void bend_request_setdata(bend_request r, void *p)
-{
-    r->clientData = p;
-}
-
-void *bend_request_getdata(bend_request r)
-{
-    return r->clientData;
-}
-
 static Z_APDU *process_segmentRequest(association *assoc, request *reqb)
 {
     bend_segment_rr req;
@@ -3451,7 +3384,6 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd)
     esrequest.print = assoc->print;
     esrequest.errcode = 0;
     esrequest.errstring = NULL;
-    esrequest.request = reqb;
     esrequest.association = assoc;
     esrequest.taskPackage = 0;
     esrequest.referenceId = req->referenceId;
@@ -3475,10 +3407,6 @@ static Z_APDU *process_ESRequest(association *assoc, request *reqb, int *fd)
 
     (*assoc->init->bend_esrequest)(assoc->backend, &esrequest);
     
-    /* If the response is being delayed, return NULL */
-    if (esrequest.request == NULL)
-        return(NULL);
-
     resp->referenceId = req->referenceId;
 
     if (esrequest.errcode == -1)