source: trunk/zoo-kernel/zoo_loader.c @ 99

Last change on this file since 99 was 99, checked in by djay, 13 years ago

Add the correct behavior when method is POST, post-treatment became obsolete.

File size: 7.6 KB
Line 
1/**
2 * Author : Gérald FENOY
3 *
4 *  Copyright 2008-2011 GeoLabs SARL. All rights reserved.
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#define MALLOC_CHECK_ 0
26#define MALLOC_CHECK 0
27
28/**
29 * Specific includes
30 */
31#include "fcgio.h"
32#include "fcgi_config.h"
33#include "fcgi_stdio.h"
34#include <sys/types.h>
35#include <unistd.h>
36#include "service_internal.h"
37
38extern "C" {
39#include "cgic.h"
40#include <libxml/tree.h>
41#include <libxml/xmlmemory.h>
42#include <libxml/parser.h>
43#include <libxml/xpath.h>
44#include <libxml/xpathInternals.h>
45}
46
47xmlXPathObjectPtr extractFromDoc(xmlDocPtr,char*);
48int runRequest(map*);
49
50using namespace std;
51
52/* ************************************************************************* */
53
54int errorException(maps *m, const char *message, const char *errorcode) 
55{
56  map* errormap = createMap("text", message);
57  addToMap(errormap,"code", errorcode);
58  printExceptionReportResponse(m,errormap);
59  freeMap(&errormap);
60  free(errormap);
61  return -1;
62}
63
64/* ************************************************************************* */
65
66#ifndef STRTOK_R
67char *
68strtok_r (char *s1, const char *s2, char **lasts)
69{
70  char *ret;
71
72  if (s1 == NULL)
73    s1 = *lasts;
74  while (*s1 && strchr(s2, *s1))
75    ++s1;
76  if (*s1 == '\0')
77    return NULL;
78  ret = s1;
79  while (*s1 && !strchr(s2, *s1))
80    ++s1;
81  if (*s1)
82    *s1++ = '\0';
83  *lasts = s1;
84  return ret;
85}
86
87#endif
88
89#define TRUE 1
90#define FALSE -1
91
92int cgiMain(){
93  /**
94   * We'll use cgiOut as the default output (stdout) to produce plain text
95   * response.
96   */
97  dup2(fileno(cgiOut),fileno(stdout));
98#ifdef DEBUG
99  fprintf(cgiOut,"Content-Type: text/plain; charset=utf-8\r\nStatus: 200 OK\r\n\r\n");
100  fprintf(cgiOut,"Welcome on ZOO verbose debuging mode \r\n\r\n");
101  fflush(cgiOut);
102#endif
103 
104#ifdef DEBUG
105  fprintf (stderr, "Addr:%s\n", cgiRemoteAddr); 
106  fprintf (stderr, "RequestMethod:%s\n", cgiRequestMethod); 
107  fprintf (stderr, "Request: %s\n", cgiQueryString);
108#endif
109
110  map* tmpMap=NULL;
111
112  if(strncmp(cgiContentType,"text/xml",8)==0 || 
113     strncasecmp(cgiRequestMethod,"post",4)==0){
114    char *buffer=new char[cgiContentLength+1];
115    if(fread(buffer,1,cgiContentLength,cgiIn)){
116      buffer[cgiContentLength]=0;
117      tmpMap=createMap("request",buffer);
118    }else{
119      char **array, **arrayStep;
120      if (cgiFormEntries(&array) != cgiFormSuccess) {
121        return 1;
122      }
123      arrayStep = array;
124      while (*arrayStep) {
125        char *value=new char[cgiContentLength];
126        cgiFormStringNoNewlines(*arrayStep, value, cgiContentLength);
127        char* tmpValueFinal=(char*) malloc((strlen(*arrayStep)+strlen(value)+1)*sizeof(char));
128        sprintf(tmpValueFinal,"%s=%s",*arrayStep,value);
129        tmpMap=createMap("request",tmpValueFinal);
130        free(tmpValueFinal);
131#ifdef DEBUG
132        fprintf(stderr,"(( \n %s \n %s \n ))",*arrayStep,value);
133#endif
134        delete[]value;
135        arrayStep++;
136      }
137    }
138    delete[]buffer;
139  }
140  else{
141    char **array, **arrayStep;
142    if (cgiFormEntries(&array) != cgiFormSuccess) {
143      return 1;
144    }
145    arrayStep = array;
146    while (*arrayStep) {
147      char *value=new char[cgiContentLength];
148      cgiFormStringNoNewlines(*arrayStep, value, cgiContentLength);
149#ifdef DEBUG
150      fprintf(stderr,"(( \n %s \n %s \n ))",*arrayStep,value);
151#endif
152      if(tmpMap!=NULL)
153        addToMap(tmpMap,*arrayStep,value);
154      else
155        tmpMap=createMap(*arrayStep,value);
156      arrayStep++;
157      delete[]value;
158    }
159    cgiStringArrayFree(array);
160  }
161
162  /**
163   * In case that the POST method was used, then check if params came in XML
164   * format else try to use the attribute "request" which should be the only
165   * one.
166   */
167  if(strncasecmp(cgiRequestMethod,"post",4)==0 || 
168     (count(tmpMap)==1 && strncmp(tmpMap->value,"<",1)==0)){
169    /**
170     * First include the MetaPath and the ServiceProvider default parameters
171     * (which should be always available in GET params so in cgiQueryString)
172     */
173    char *str1;
174    str1=cgiQueryString;
175    /**
176     * Store the original XML request in xrequest map
177     */
178    map* t1=getMap(tmpMap,"request");
179    if(t1!=NULL){
180      addToMap(tmpMap,"xrequest",t1->value);
181      xmlInitParser();
182      xmlDocPtr doc = xmlParseMemory(t1->value,cgiContentLength);
183      xmlNodePtr cur = xmlDocGetRootElement(doc);
184      char *tval;
185      tval=NULL;
186      tval = (char*) xmlGetProp(cur,BAD_CAST "service");
187      if(tval!=NULL)
188        addToMap(tmpMap,"service",tval);
189      tval=NULL;
190      tval = (char*) xmlGetProp(cur,BAD_CAST "language");
191      if(tval!=NULL)
192        addToMap(tmpMap,"language",tval);
193     
194      char* requests[3];
195      requests[0]="GetCapabilities";
196      requests[1]="DescribeProcess";
197      requests[2]="Execute";
198      for(int j=0;j<3;j++){
199        char tt[35];
200        sprintf(tt,"/*[local-name()='%s']",requests[j]);
201        xmlXPathObjectPtr reqptr=extractFromDoc(doc,tt);
202        if(reqptr!=NULL){
203          xmlNodeSet* req=reqptr->nodesetval;
204#ifdef DEBUG
205          fprintf(stderr,"%i",req->nodeNr);
206#endif
207          if(req!=NULL && req->nodeNr==1){
208            t1->value=requests[j];
209            j=2;
210          }
211          xmlXPathFreeObject(reqptr);
212        }
213        //xmlFree(req);
214      }
215      if(strncasecmp(t1->value,"GetCapabilities",15)==0){
216        xmlXPathObjectPtr versptr=extractFromDoc(doc,"/*/*/*[local-name()='Version']");
217        xmlNodeSet* vers=versptr->nodesetval;
218        xmlChar* content=xmlNodeListGetString(doc, vers->nodeTab[0]->xmlChildrenNode,1);
219        addToMap(tmpMap,"version",(char*)content);
220        xmlXPathFreeObject(versptr);
221        //xmlFree(vers);
222        xmlFree(content);
223      }else{
224        tval=NULL;
225        tval = (char*) xmlGetProp(cur,BAD_CAST "version");
226        if(tval!=NULL)
227          addToMap(tmpMap,"version",tval);
228        xmlFree(tval);
229        tval = (char*) xmlGetProp(cur,BAD_CAST "language");
230        if(tval!=NULL)
231          addToMap(tmpMap,"language",tval);
232        xmlXPathObjectPtr idptr=extractFromDoc(doc,"/*/*[local-name()='Identifier']");
233        if(idptr!=NULL){
234          xmlNodeSet* id=idptr->nodesetval;
235          if(id!=NULL){
236            char* identifiers=NULL;
237            identifiers=(char*)calloc(cgiContentLength,sizeof(char));
238            identifiers[0]=0;
239            for(int k=0;k<id->nodeNr;k++){
240              xmlChar* content=xmlNodeListGetString(doc, id->nodeTab[k]->xmlChildrenNode,1);
241              if(strlen(identifiers)>0){
242                char *tmp=strdup(identifiers);
243                snprintf(identifiers,strlen(tmp)+xmlStrlen(content)+2,"%s,%s",tmp,content);
244                free(tmp);
245              }
246              else{
247                snprintf(identifiers,xmlStrlen(content)+1,"%s",content);
248              }
249              xmlFree(content);
250            }
251            xmlXPathFreeObject(idptr);
252            addToMap(tmpMap,"Identifier",identifiers);
253            free(identifiers);
254          }
255        }
256        //xmlFree(id);
257      }
258      xmlFree(tval);
259      xmlFreeDoc(doc);
260      xmlCleanupParser();
261    }
262  }
263
264  runRequest(tmpMap);
265
266  /**
267   * Required but can't be made after executing a process using POST requests.
268   */
269  if(strncasecmp(cgiRequestMethod,"post",4)!=0 && count(tmpMap)!=1 && tmpMap!=NULL){
270    freeMap(&tmpMap);
271    free(tmpMap);
272  }
273  return 0;
274
275}
Note: See TracBrowser for help on using the repository browser.

Search

ZOO Sponsors

http://www.zoo-project.org/trac/chrome/site/img/geolabs-logo.pnghttp://www.zoo-project.org/trac/chrome/site/img/neogeo-logo.png http://www.zoo-project.org/trac/chrome/site/img/apptech-logo.png http://www.zoo-project.org/trac/chrome/site/img/3liz-logo.png http://www.zoo-project.org/trac/chrome/site/img/gateway-logo.png

Become a sponsor !

Knowledge partners

http://www.zoo-project.org/trac/chrome/site/img/ocu-logo.png http://www.zoo-project.org/trac/chrome/site/img/gucas-logo.png http://www.zoo-project.org/trac/chrome/site/img/polimi-logo.png http://www.zoo-project.org/trac/chrome/site/img/fem-logo.png http://www.zoo-project.org/trac/chrome/site/img/supsi-logo.png http://www.zoo-project.org/trac/chrome/site/img/cumtb-logo.png

Become a knowledge partner

Related links

http://zoo-project.org/img/ogclogo.png http://zoo-project.org/img/osgeologo.png