ZOO-Project
response_print.h
Go to the documentation of this file.
1 /*
2  * Author : GĂ©rald FENOY
3  *
4  * Copyright (c) 2009-2023 GeoLabs SARL
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 
25 #ifndef ZOO_RESPONSE_PRINT_H
26 #define ZOO_RESPONSE_PRINT_H 1
27 
28 #pragma once
29 
33 #define DEFAULT_SERVICE_URL "http://www.zoo-project.org/"
34 
37 #define TIME_SIZE 40
38 
39 #include <libintl.h>
40 #include <locale.h>
41 
45 #define _(String) dgettext ("zoo-kernel",String)
46 
49 #define _ss(String) dgettext ("zoo-services",String)
50 
54 #define ZOO_LOCK_CREATE_FAILED -4
55 
58 #define ZOO_LOCK_ACQUIRE_FAILED -5
59 
62 #define ZOO_LOCK_RELEASE_FAILED -6
63 
64 #include <sys/stat.h>
65 #include <sys/types.h>
66 #ifndef WIN32
67 #include <sys/ipc.h>
68 #include <sys/shm.h>
69 #include <sys/sem.h>
70 #else
71 #include <direct.h>
72 #endif
73 #include <stdio.h>
74 #include <time.h>
75 #include <ctype.h>
76 #ifdef WIN32
77 #ifndef USE_RUBY
78 #include <unistd.h>
79 #endif
80 #endif
81 #ifndef WIN32
82 //#include <locale.h>
83 #include <locale.h> // knut: this appears to be a non-standard header file that has been removed in newer versions of glibc; it may be sufficient to include <locale.h> (see above)
84 #endif
85 
86 #include "service.h"
87 #include <openssl/sha.h>
88 #include <openssl/md5.h>
89 #include <openssl/hmac.h>
90 #include <openssl/evp.h>
91 #include <openssl/bio.h>
92 #include <openssl/buffer.h>
93 
94 #include <libxml/parser.h>
95 #include <libxml/xpath.h>
96 
97 #ifdef __cplusplus
98 extern "C" {
99 #endif
100 
103 #define ZOO_NS_MAX 10
104 
107 #define ZOO_DOC_MAX 20
108 
112  static char* SERVICE_URL;
113 
117  static xmlNsPtr usedNs[ZOO_NS_MAX];
121  static char* nsName[ZOO_NS_MAX];
125  static int nbNs=0;
129  static xmlDocPtr iDocs[ZOO_DOC_MAX];
133  static int nbDocs=0;
134 
138  static char wpsStatus[3][11]={
139  "Succeeded",
140  "Failed",
141  "Running"
142  };
146  static const char* schemas[2][8]={
147  {"1.0.0","http://www.opengis.net/ows/1.1","http://www.opengis.net/wps/1.0.0","http://schemas.opengis.net/wps/1.0.0","%s %s/wps%s_response.xsd","http://schemas.opengis.net/ows/1.1.0/owsExceptionReport.xsd","1.1.0"},
148  {"2.0.0","http://www.opengis.net/ows/2.0","http://www.opengis.net/wps/2.0","http://schemas.opengis.net/wps/2.0","http://www.opengis.net/wps/2.0 http://schemas.opengis.net/wps/2.0/wps.xsd","http://schemas.opengis.net/ows/2.0/owsExceptionReport.xsd","2.0.2","http://www.opengis.net/spec/wps/2.0/def/process-profile/"},
149  };
153  static int nbSupportedRequests=7;
157  static const char* requests[2][7]={
158  {"GetCapabilities","DescribeProcess","Execute",NULL},
159  {"GetCapabilities","DescribeProcess","Execute","GetStatus","GetResult","Dismiss",NULL},
160  };
164  static int nbReqIdentifier=2;
168  static int nbReqJob=3;
172  static const char* root_nodes[2][4]={
173  {"ProcessOfferings","ProcessDescriptions","ExecuteResponse",NULL},
174  {"Contents","ProcessOfferings","Result",NULL}
175  };
176 
180  static const char* capabilities[2][7]={
181  {
182  "Process",
183  "processVersion","1",
184  "storeSupported","true",
185  "statusSupported","true"
186  },
187  {
188  "ProcessSummary",
189  "processVersion","1.0.0",
190  "jobControlOptions","sync-execute async-execute dismiss",
191  "outputTransmission","value reference"
192  }
193  };
194 
198  static const char* const aapccStatusCodes[][10] = {
199  {
200  "500 Not Implemented",
201  "OperationNotSupported",
202  "NoApplicableCode",
203  "InvalidQueryParameterValue",
204  NULL
205  },
206  {
207  "400 Bad request",
208  "MissingParameterValue",
209  "InvalidParameterValue",
210  "InvalidUpdateSequence",
211  "OptionNotSupported",
212  "VersionNegotiationFailed",
213  "NoSuchMode",
214  "BadRequest",
215  "WorkflowNotFound",
216  // ref. https://github.com/opengeospatial/ogcapi-processes/issues/250
217  //"InvalidQueryParameterValue",
218  NULL
219  },
220  {
221  "404 Not Found",
222  "NotFound",
223  "NoSuchProcess",
224  "NoSuchJob",
225  "ResultNotReady",
226  NULL
227  },
228  {
229  "500 Not Implemented",
230  NULL
231  }
232  };
233 
234  void addLangAttr(xmlNodePtr,maps*);
235 
236  void printHeaders(maps**);
237  void printAssociatedLinks(maps**);
238  void printSessionHeaders(maps**);
239  int printAFile(maps**,char*,zStatStruct,void (funcError) (maps**, map*));
240 
241  int zooXmlSearchForNs(const char*);
242  int zooXmlAddNs(xmlNodePtr,const char*,const char*);
243  void zooXmlCleanupNs();
244 
245  int zooXmlAddDoc(xmlNodePtr,const char*,const char*);
246  void zooXmlCleanupDocs();
247 
248  const char* produceStatusString(maps*,map*);
250  xmlNodePtr createExceptionReportNode(maps*,map*,int);
251  void printProcessResponse(maps**,map*,int,service*,const char*,int,maps*,maps*);
252  xmlNodePtr printWPSHeader(xmlDocPtr,maps*,const char*,const char*,const char*,int);
253  xmlNodePtr printGetCapabilitiesHeader(xmlDocPtr,maps*,const char*);
256  void printFullDescription(xmlDocPtr,int,elements*,const char*,xmlNsPtr,xmlNsPtr,xmlNodePtr,int,int,const map*);
257  void printDocument(maps**,xmlDocPtr,int);
258  void printDescription(xmlNodePtr,xmlNsPtr,const char*,map*,int);
259  void printIOType(xmlDocPtr,xmlNodePtr,xmlNsPtr,xmlNsPtr,xmlNsPtr,elements*,maps*,const char*,int);
260  void printRawdataOutput(maps**,maps*);
262  map* parseBoundingBox(const char*);
263  void printBoundingBox(xmlNsPtr,xmlNodePtr,map*);
264  void printBoundingBoxDocument(maps*,maps*,FILE*);
265  void printOutputDefinitions(xmlDocPtr,xmlNodePtr,xmlNsPtr,xmlNsPtr,elements*,maps*,const char*);
266  void printStatusInfo(maps*,map*,char*);
267  void addAdditionalParameters(map*,xmlDocPtr,xmlNodePtr,xmlNsPtr,xmlNsPtr,int);
268  void addMetadata(map*,xmlDocPtr,xmlNodePtr,xmlNsPtr,xmlNsPtr,int);
269 
270  char* produceFileUrl(service*,maps*,maps*,const char*, int);
271  void outputResponse(service*,maps*,maps*,map*,int,maps**,int);
272 
273  void localPrintException(maps**,map*);
274  int errorException(maps**, const char *, const char *, const char*);
275 
276  xmlNodePtr soapEnvelope(maps*,xmlNodePtr);
277  int checkForSoapEnvelope(xmlDocPtr);
278 
279 #ifdef __cplusplus
280 }
281 #endif
282 
283 #endif
zooXmlAddNs
int zooXmlAddNs(xmlNodePtr, const char *, const char *)
Add an XML namespace to the usedNS if it was not already used.
Definition: response_print.c:376
printRawdataOutput
void printRawdataOutput(maps **, maps *)
Print one outputs as raw.
Definition: response_print.c:3321
printSessionHeaders
void printSessionHeaders(maps **)
Print the Set-Cookie header if necessary (conf["lenv"]["cookie"]) and save the session file.
Definition: response_print.c:251
printDescription
void printDescription(xmlNodePtr, xmlNsPtr, const char *, map *, int)
Create XML node with basic ows metadata information (Identifier,Title,Abstract)
Definition: response_print.c:2664
wpsStatus
static char wpsStatus[3][11]
Definitions of acceptable final status.
Definition: response_print.h:138
SERVICE_URL
static char * SERVICE_URL
Global char* to store the serverAddress value of the [main] section.
Definition: response_print.h:112
service.h
printBoundingBoxDocument
void printBoundingBoxDocument(maps *, maps *, FILE *)
Print an ows:BoundingBox XML document.
Definition: response_print.c:3511
printExceptionReportResponse
void printExceptionReportResponse(maps **, map *)
Print an OWS ExceptionReport or exception.yaml Document and HTTP headers (when required) depending on...
Definition: response_print.c:2781
printOutputDefinitions
void printOutputDefinitions(xmlDocPtr, xmlNodePtr, xmlNsPtr, xmlNsPtr, elements *, maps *, const char *)
Print a XML document.
Definition: response_print.c:2367
soapEnvelope
xmlNodePtr soapEnvelope(maps *, xmlNodePtr)
Generate a SOAP Envelope node when required (if the isSoap key of the [main] section is set to true).
Definition: response_print.c:452
outputResponse
void outputResponse(service *, maps *, maps *, map *, int, maps **, int)
Generate the output response (RawDataOutput or ResponseDocument)
Definition: response_print.c:3032
ZOO_DOC_MAX
#define ZOO_DOC_MAX
Maximum number of XML docs.
Definition: response_print.h:107
aapccStatusCodes
static const char *const aapccStatusCodes[][10]
Correspondance between HTTP status code and exception code.
Definition: response_print.h:198
nbReqJob
static int nbReqJob
Definitions requests requiring jobid (only for WPS version 2.0.0)
Definition: response_print.h:168
service
Metadata information about a full Service.
Definition: service.h:715
elements
Metadata information about input or output.
Definition: service.h:700
printProcessResponse
void printProcessResponse(maps **, map *, int, service *, const char *, int, maps *, maps *)
Generate a wps:Execute XML document.
Definition: response_print.c:2011
produceFileUrl
char * produceFileUrl(service *, maps *, maps *, const char *, int)
Produce a copy file and the corresponding url in case it is required Please, free the returned ressou...
Definition: response_print.c:2928
ZOO_NS_MAX
#define ZOO_NS_MAX
Maximum number of XML namespaces.
Definition: response_print.h:103
printWPSHeader
xmlNodePtr printWPSHeader(xmlDocPtr, maps *, const char *, const char *, const char *, int)
Generate a WPS header.
Definition: response_print.c:486
createExceptionReportNode
xmlNodePtr createExceptionReportNode(maps *, map *, int)
Create an OWS ExceptionReport Node.
Definition: response_print.c:2801
printStatusInfo
void printStatusInfo(maps *, map *, char *)
Print a StatusInfo XML document.
Definition: response_print.c:3575
root_nodes
static const char * root_nodes[2][4]
Definitions of root node for response depending on the request and the WPS version.
Definition: response_print.h:172
printGetCapabilitiesHeader
xmlNodePtr printGetCapabilitiesHeader(xmlDocPtr, maps *, const char *)
Generate a Capabilities header.
Definition: response_print.c:584
printHeaders
void printHeaders(maps **)
Print the HTTP headers based on a map.
Definition: response_print.c:117
printAFile
int printAFile(maps **, char *, zStatStruct, void(funcError)(maps **, map *))
Print a file red as binary.
Definition: response_print.c:53
printDocument
void printDocument(maps **, xmlDocPtr, int)
Print a XML document.
Definition: response_print.c:2331
usedNs
static xmlNsPtr usedNs[ZOO_NS_MAX]
Array of xmlNsPtr storing all used XML namespace.
Definition: response_print.h:117
maps
linked list of map pointer
Definition: service.h:678
nbReqIdentifier
static int nbReqIdentifier
Definitions requests requiring identifier (depending on the WPS version)
Definition: response_print.h:164
nsName
static char * nsName[ZOO_NS_MAX]
Array storing names of the used XML namespace.
Definition: response_print.h:121
zooXmlSearchForNs
int zooXmlSearchForNs(const char *)
Search for an existing XML namespace in usedNS.
Definition: response_print.c:357
nbDocs
static int nbDocs
Number of XML docs.
Definition: response_print.h:133
zooXmlAddDoc
int zooXmlAddDoc(xmlNodePtr, const char *, const char *)
checkForSoapEnvelope
int checkForSoapEnvelope(xmlDocPtr)
printRawdataOutputs
void printRawdataOutputs(maps **, service *, maps *)
Print all outputs as raw.
Definition: response_print.c:3226
map
KVP linked list.
Definition: service.h:657
printIOType
void printIOType(xmlDocPtr, xmlNodePtr, xmlNsPtr, xmlNsPtr, xmlNsPtr, elements *, maps *, const char *, int)
Generate XML nodes describing inputs or outputs metadata.
Definition: response_print.c:2411
parseBoundingBox
map * parseBoundingBox(const char *)
Parse a BoundingBox string.
Definition: response_print.c:3458
errorException
int errorException(maps **, const char *, const char *, const char *)
Print an OWS ExceptionReport.
Definition: response_print.c:2899
nbNs
static int nbNs
Number of XML namespaces.
Definition: response_print.h:125
printDescribeProcessForProcess
void printDescribeProcessForProcess(registry *, maps *, void *, void *, service *)
Generate a ProcessDescription node for a servie and add it to a given node.
Definition: response_print.c:1215
produceStatusString
const char * produceStatusString(maps *, map *)
Produce the status string used in HTTP headers.
Definition: response_print.c:2697
zooXmlCleanupDocs
void zooXmlCleanupDocs()
Free allocated memort to store XML documents.
Definition: response_print.c:435
zooXmlCleanupNs
void zooXmlCleanupNs()
Free allocated memory to store used XML namespace.
Definition: response_print.c:401
schemas
static const char * schemas[2][8]
Definitions of schemas depending on the WPS version.
Definition: response_print.h:146
printGetCapabilitiesForProcess
void printGetCapabilitiesForProcess(registry *, maps *, void *, void *, service *)
Generate a wps:Process node for a servie and add it to a given node.
Definition: response_print.c:849
addLangAttr
void addLangAttr(xmlNodePtr, maps *)
Add a land attribute to a XML node.
Definition: response_print.c:313
registry
Profile registry.
Definition: service.h:735
iDocs
static xmlDocPtr iDocs[ZOO_DOC_MAX]
Array of xmlDocPtr storing XML docs.
Definition: response_print.h:129
addAdditionalParameters
void addAdditionalParameters(map *, xmlDocPtr, xmlNodePtr, xmlNsPtr, xmlNsPtr, int)
Add AdditionalParameters nodes to any existing node.
Definition: response_print.c:1056
addMetadata
void addMetadata(map *, xmlDocPtr, xmlNodePtr, xmlNsPtr, xmlNsPtr, int)
Add a Metadata node to any existing node.
Definition: response_print.c:967
printBoundingBox
void printBoundingBox(xmlNsPtr, xmlNodePtr, map *)
Create required XML nodes for boundingbox and update the current XML node.
Definition: response_print.c:3406
requests
static const char * requests[2][7]
Definitions of requests depending on the WPS version.
Definition: response_print.h:157
nbSupportedRequests
static int nbSupportedRequests
Definitions of support requests (depending on the WPS version)
Definition: response_print.h:153
capabilities
static const char * capabilities[2][7]
Name and corresponding attributes depending on the WPS version.
Definition: response_print.h:180
localPrintException
void localPrintException(maps **, map *)
Invoke the ensureFiltered then printExceptionReportResponseJ functions.
Definition: response_print.c:2880
zStatStruct
#define zStatStruct
Definition: service.h:155
printAssociatedLinks
void printAssociatedLinks(maps **)
Produce the Links header based on the links stored in the headers_links section of the main configura...
Definition: response_print.c:176
printFullDescription
void printFullDescription(xmlDocPtr, int, elements *, const char *, xmlNsPtr, xmlNsPtr, xmlNodePtr, int, int, const map *)
Generate the required XML tree for the detailled metadata information of inputs or outputs.
Definition: response_print.c:1334