added logging of extended services packages - requests and responses
[metaproxy-moved-to-github.git] / src / gduutil.cpp
1 /* $Id: gduutil.cpp,v 1.4 2006-08-30 15:56:54 marc Exp $
2    Copyright (c) 2005-2006, Index Data.
3
4    See the LICENSE file for details
5 */
6
7 #include "gduutil.hpp"
8 #include "util.hpp"
9
10 #include <yaz/wrbuf.h>
11 #include <yaz/querytowrbuf.h>
12
13 #include <iostream>
14 #include <list>
15
16 namespace mp = metaproxy_1;
17
18 // Doxygen doesn't like mp::gdu, so we use this instead
19 namespace mp_gdu = metaproxy_1::gdu;
20
21 std::ostream& std::operator<<(std::ostream& os,  Z_GDU& zgdu)
22 {
23     if (zgdu.which == Z_GDU_Z3950)
24         os << "Z3950" << " " << *(zgdu.u.z3950) ;
25     else if (zgdu.which == Z_GDU_HTTP_Request)
26         os << "HTTP_Request" << " " << *(zgdu.u.HTTP_Request);
27     else if (zgdu.which == Z_GDU_HTTP_Response)
28         os << "HTTP_Response" << " " << *(zgdu.u.HTTP_Response);
29     else
30         os << "Z_GDU";
31     return os;
32 }
33
34 std::ostream& std::operator<<(std::ostream& os, Z_HTTP_Request& httpreq)
35 {
36     os << httpreq.method << " ";
37     os << httpreq.path;    
38     return os;
39 }
40
41
42 std::ostream& std::operator<<(std::ostream& os, Z_HTTP_Response& httpres)
43 {
44     os << httpres.code << " ";
45     os << httpres.content_len;   
46     return os;
47 }
48
49 std::ostream& std::operator<<(std::ostream& os, Z_Records & rs)
50 {
51     switch(rs.which) {
52     case Z_Records_DBOSD :
53         break;
54     case Z_Records_NSD:
55         os << *(rs.u.nonSurrogateDiagnostic);
56         break;
57     case Z_Records_multipleNSD:
58         os << "Z_Records_multipleNSD";
59         //os << *(rs.u.multipleNonSurDiagnostics);
60         break;
61     default:
62         os << "Z_Records" ;
63     }
64     
65     return os;
66 }
67
68 std::ostream& std::operator<<(std::ostream& os, Z_DiagRec& dr)
69 {
70     switch(dr.which) {
71     case Z_DiagRec_defaultFormat:
72         os << *(dr.u.defaultFormat);
73         break;
74     case Z_DiagRec_externallyDefined :
75         os << "Z_DiagRec_externallyDefined";
76         break;
77     default:
78         os << "Z_DiagRec" ;
79     }
80     
81     return os;
82 }
83
84 std::ostream& std::operator<<(std::ostream& os, Z_DefaultDiagFormat& ddf)
85 {
86     os << *(ddf.condition) << " ";
87     switch(ddf.which) {
88     case Z_DefaultDiagFormat_v2Addinfo:
89         os << ddf.u.v2Addinfo;
90         break;
91     case Z_DefaultDiagFormat_v3Addinfo:
92         os << ddf.u.v3Addinfo;
93         break;
94     default:
95         os << "Z_DefaultDiagFormat" ;
96     }
97     
98     return os;
99 }
100
101 std::ostream& std::operator<<(std::ostream& os,  Z_APDU& zapdu)
102 {
103     switch(zapdu.which) {
104
105     case Z_APDU_initRequest:
106         os << "initRequest" << " ";
107                         
108         {
109             Z_InitRequest *ir 
110                 = zapdu.u.initRequest;
111
112             Z_IdAuthentication *a = ir->idAuthentication;
113             if (a && a->which == Z_IdAuthentication_idPass )
114                 os << a->u.idPass->userId << " ";
115             //<< ":" << a->u.idPass->groupId << " ";
116             else
117                 os << "--" << " ";
118
119             std::list<std::string> vhosts;
120             mp::util::get_vhost_otherinfo(ir->otherInfo, vhosts);
121             if (vhosts.size()){
122                 copy(vhosts.begin(), vhosts.end(), 
123                      ostream_iterator<string>(os, " "));
124             }
125                 else
126                     os << "--" << " " ;
127
128             os << (ir->implementationId) << " "
129                 //<< ir->referenceId << " "
130                << (ir->implementationName) << " "
131                << (ir->implementationVersion);
132         }
133         break;
134     case Z_APDU_initResponse:
135         os << "initResponse" << " ";
136         {
137             Z_InitResponse *ir 
138                 = zapdu.u.initResponse;
139             if (*(ir->result))
140                 os << "OK" << " "
141                    << (ir->implementationId) << " "
142                     //<< ir->referenceId << " "
143                    << (ir->implementationName) << " "
144                    << (ir->implementationVersion) << " ";
145             else
146                 os << "DIAG";
147         }
148         break;
149     case Z_APDU_searchRequest:
150         os << "searchRequest" << " ";
151         { 
152             Z_SearchRequest *sr 
153                 = zapdu.u.searchRequest;
154                             
155             for (int i = 0; i < sr->num_databaseNames; i++)
156             {
157                 os << sr->databaseNames[i];
158                 if (i+1 ==  sr->num_databaseNames)
159                     os << " ";
160                 else
161                     os << "+";
162             }
163                          
164             WRBUF wr = wrbuf_alloc();
165             yaz_query_to_wrbuf(wr, sr->query);
166             os << wrbuf_buf(wr);
167             wrbuf_free(wr, 1);
168         }
169         break;
170     case Z_APDU_searchResponse:
171         os << "searchResponse" << " ";
172         {
173             Z_SearchResponse *sr 
174                 = zapdu.u.searchResponse;
175             if (*(sr->searchStatus))
176                 os << "OK" << " "
177                    << *(sr->resultCount) << " "
178                     //<< sr->referenceId << " "
179                    << *(sr->numberOfRecordsReturned) << " "
180                    << *(sr->nextResultSetPosition);
181             else 
182                 if (sr->records)
183                     os << "DIAG " << *(sr->records);
184                 else
185                     os << "ERROR";
186         }
187         break;
188     case Z_APDU_presentRequest:
189         os << "presentRequest" << " ";
190         {
191             Z_PresentRequest *pr = zapdu.u.presentRequest;
192             os << pr->resultSetId << " "
193                 //<< pr->referenceId << " "
194                << *(pr->resultSetStartPoint) << " "
195                << *(pr->numberOfRecordsRequested);
196         }
197         break;
198     case Z_APDU_presentResponse:
199         os << "presentResponse" << " ";
200         {
201             Z_PresentResponse *pr 
202                 = zapdu.u.presentResponse;
203             if (!*(pr->presentStatus))
204                 os << "OK" << " "
205                     //<< "-" << " "
206                     //<< pr->referenceId << " "
207                    << *(pr->numberOfRecordsReturned) << " "
208                    << *(pr->nextResultSetPosition);
209             else
210                 if (pr->records)
211                     os << "DIAG " << *(pr->records);
212                 else
213                     os << "ERROR";
214
215             //os << "DIAG" << " "
216             //<< "-" << " "
217             //<< pr->referenceId << " "
218             //<< *(pr->numberOfRecordsReturned) << " "
219             //<< *(pr->nextResultSetPosition);
220         }
221         break;
222     case Z_APDU_deleteResultSetRequest:
223         os << "deleteResultSetRequest";
224         break;
225     case Z_APDU_deleteResultSetResponse:
226         os << "deleteResultSetResponse";
227         break;
228     case Z_APDU_accessControlRequest:
229         os << "accessControlRequest";
230         break;
231     case Z_APDU_accessControlResponse:
232         os << "accessControlResponse";
233         break;
234     case Z_APDU_resourceControlRequest:
235         os << "resourceControlRequest";
236         break;
237     case Z_APDU_resourceControlResponse:
238         os << "resourceControlResponse";
239         break;
240     case Z_APDU_triggerResourceControlRequest:
241         os << "triggerResourceControlRequest";
242         break;
243     case Z_APDU_resourceReportRequest:
244         os << "resourceReportRequest";
245         break;
246     case Z_APDU_resourceReportResponse:
247         os << "resourceReportResponse";
248         break;
249     case Z_APDU_scanRequest:
250         os << "scanRequest" << " ";
251         { 
252             Z_ScanRequest *sr 
253                 = zapdu.u.scanRequest;
254                             
255             for (int i = 0; i < sr->num_databaseNames; i++)
256             {
257                 os << sr->databaseNames[i];
258                 if (i+1 ==  sr->num_databaseNames)
259                     os << " ";
260                 else
261                     os << "+";
262             }
263
264             os << *(sr->numberOfTermsRequested) << " "
265                << *(sr->preferredPositionInResponse) << " "
266                << *(sr->stepSize) << " ";
267                          
268             WRBUF wr = wrbuf_alloc();
269             yaz_scan_to_wrbuf(wr, sr->termListAndStartPoint, VAL_NONE);
270             os << wrbuf_buf(wr);
271             wrbuf_free(wr, 1);
272         }
273         break;
274     case Z_APDU_scanResponse:
275         os << "scanResponse" << " ";
276         {
277             Z_ScanResponse *sr 
278                 = zapdu.u.scanResponse;
279             if (!*(sr->scanStatus))
280                 os << "OK" << " "
281                     //<< *(sr->scanStatus) << " "
282                    << *(sr->numberOfEntriesReturned) << " "
283                     //<< sr->referenceId << " "
284                    << *(sr->positionOfTerm) << " "
285                    << *(sr->stepSize) << " ";
286             else {
287                 os << "ERROR" << " "
288                    << *(sr->scanStatus) << " ";
289                 
290                 switch (*(sr->scanStatus)){
291                 case Z_Scan_success:
292                     os << "success ";
293                     break;
294                 case Z_Scan_partial_1:
295                     os << "partial_1";
296                     break;
297                 case Z_Scan_partial_2:
298                     os << "partial_2";
299                     break;
300                 case Z_Scan_partial_3:
301                     os << "partial_3";
302                         break;
303                 case Z_Scan_partial_4:
304                     os << "partial_4";
305                     break;
306                 case Z_Scan_partial_5:
307                     os << "partial_5";
308                     break;
309                 case Z_Scan_failure:
310                     os << "failure";
311                     break;
312                 default:
313                     os << "unknown";
314                 }
315                 
316                 os << " " << *(sr->numberOfEntriesReturned);
317             }
318         }
319         break;
320     case Z_APDU_sortRequest:
321         os << "sortRequest" << " ";
322         break;
323     case Z_APDU_sortResponse:
324         os << "sortResponse" << " ";
325         break;
326     case Z_APDU_segmentRequest:
327         os << "segmentRequest" << " ";
328         break;
329     case Z_APDU_extendedServicesRequest:
330         os << "extendedServicesRequest" << " ";
331         { 
332             Z_ExtendedServicesRequest *er 
333                 = zapdu.u.extendedServicesRequest;
334
335             switch(*(er->function))
336             {
337             case Z_ExtendedServicesRequest_create:
338                 os << "create";
339                 break;
340             case Z_ExtendedServicesRequest_delete:
341                 os << "delete";
342                 break;
343             case Z_ExtendedServicesRequest_modify:
344                 os << "modify";
345                 break;
346             default:
347                 os << "unknown";
348             }
349
350             if (er->userId)
351                 os << " " << er->userId ;
352             else
353                 os << " " << "--";
354
355             if (er->packageName)
356                 os << " " << er->packageName;
357             else
358                 os << " " << "--";
359
360             if (er->description)
361                 os << " " << er->description;
362             else
363                 os << " " << "--";
364         }
365         break;
366     case Z_APDU_extendedServicesResponse:
367         os << "extendedServicesResponse" << " ";
368          { 
369              Z_ExtendedServicesResponse *er 
370                  = zapdu.u.extendedServicesResponse;
371
372              switch (*(er->operationStatus)){
373                  case Z_ExtendedServicesResponse_done:
374                      os << "OK";
375                  break;
376                  case Z_ExtendedServicesResponse_accepted:
377                      os << "ACCEPT";
378                  break;
379                  case Z_ExtendedServicesResponse_failure:
380                      if (er->num_diagnostics)
381                          os << "DIAG " << **(er->diagnostics);
382                      else
383                          os << "ERROR";
384                  break;
385              default:
386                  os << "unknown";
387              }
388          }
389         break;
390     case Z_APDU_close:
391         os  << "close" << " ";
392         { 
393             Z_Close  *c 
394                 = zapdu.u.close;
395
396             os << *(c->closeReason) << " ";
397             switch (*(c->closeReason)) {
398             case Z_Close_finished:
399                 os << "finished";
400                 break;
401             case Z_Close_shutdown:
402                 os << "shutdown";
403                 break;
404             case Z_Close_systemProblem:
405                 os << "systemProblem";
406                 break;
407             case Z_Close_costLimit:
408                 os << "costLimit";
409                 break;
410             case Z_Close_resources:
411                 os << "resources";
412                 break;
413             case Z_Close_securityViolation:
414                 os << "securityViolation";
415                 break;
416             case Z_Close_protocolError:
417                 os << "protocolError";
418                 break;
419             case Z_Close_lackOfActivity:
420                 os << "";
421                 break;
422             case Z_Close_peerAbort:
423                 os << "peerAbort";
424                 break;
425             case Z_Close_unspecified:
426                 os << "unspecified";
427                 break;
428             default:
429                 os << "unknown";
430                 break;
431             }
432         }
433         break;
434     case Z_APDU_duplicateDetectionRequest:
435         os << "duplicateDetectionRequest";
436         break;
437     case Z_APDU_duplicateDetectionResponse:
438         os << "duplicateDetectionResponse";
439         break;
440     default: 
441         os << "Z_APDU "
442            << "UNKNOWN";
443     }
444
445     return os;
446 }
447
448
449 /*
450  * Local variables:
451  * c-basic-offset: 4
452  * indent-tabs-mode: nil
453  * c-file-style: "stroustrup"
454  * End:
455  * vim: shiftwidth=4 tabstop=8 expandtab
456  */