source: trunk/zoo-project/zoo-kernel/zoo_service_loader.c @ 384

Last change on this file since 384 was 384, checked in by djay, 11 years ago

Fix asynchronous support on windows platform, fix storage of responseDocument and add a sample service in Python language using the ZOO-API. Update makefile.vc and nmake.opt to remove unneeded cgic linkage. Fix for headers section to display only if needed.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 64.0 KB
Line 
1/**
2 * Author : Gérald FENOY
3 *
4 *  Copyright 2008-2012 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 length(x) (sizeof(x) / sizeof(x[0]))
26
27extern "C" int yylex();
28extern "C" int crlex();
29
30#include "cgic.h"
31
32extern "C" {
33#include <libxml/tree.h>
34#include <libxml/xmlmemory.h>
35#include <libxml/parser.h>
36#include <libxml/xpath.h>
37#include <libxml/xpathInternals.h>
38}
39
40#include "ulinet.h"
41
42#include <libintl.h>
43#include <locale.h>
44#include <string.h>
45
46#include "service.h"
47
48#include "service_internal.h"
49
50#ifdef USE_PYTHON
51#include "service_internal_python.h"
52#endif
53
54#ifdef USE_JAVA
55#include "service_internal_java.h"
56#endif
57
58#ifdef USE_PHP
59#include "service_internal_php.h"
60#endif
61
62#ifdef USE_JS
63#include "service_internal_js.h"
64#endif
65
66#ifdef USE_PERL
67#include "service_internal_perl.h"
68#endif
69
70#include <dirent.h>
71#include <signal.h>
72#include <unistd.h>
73#ifndef WIN32
74#include <dlfcn.h>
75#include <libgen.h>
76#else
77#include <windows.h>
78#include <direct.h>
79#include <sys/types.h>
80#include <sys/stat.h>
81#include <unistd.h>
82#define pid_t int;
83#endif
84#include <fcntl.h>
85#include <time.h>
86#include <stdarg.h>
87
88#ifdef WIN32
89extern "C" {
90  __declspec(dllexport) char *strcasestr(char const *a, char const *b)
91#ifndef USE_MS
92 { 
93  char *x=_strdup(a); 
94  char *y=_strdup(b); 
95 
96  x=_strlwr(x); 
97  y=_strlwr(y); 
98  char *pos = strstr(x, y); 
99  char *ret = pos == NULL ? NULL : (char *)(a + (pos-x)); 
100  free(x); 
101  free(y); 
102  return ret; 
103 };
104#else
105  ;
106#endif
107}
108#endif
109
110#define _(String) dgettext ("zoo-kernel",String)
111#define __(String) dgettext ("zoo-service",String)
112
113
114void translateChar(char* str,char toReplace,char toReplaceBy){
115  int i=0,len=strlen(str);
116  for(i=0;i<len;i++){
117    if(str[i]==toReplace)
118      str[i]=toReplaceBy;
119  }
120}
121
122/**
123 * Create (or append to) an array valued maps
124 * value = "["",""]"
125 */
126int appendMapsToMaps(maps* m,maps* mo,maps* mi,elements* elem){
127  maps* tmpMaps=getMaps(mo,mi->name);
128  map* tmap=getMapType(tmpMaps->content);
129  elements* el=getElements(elem,mi->name);
130  int hasEl=1;
131  if(el==NULL)
132    hasEl=-1;
133  if(tmap==NULL){
134    if(hasEl>0)
135      tmap=getMapType(el->defaults->content);     
136  }
137
138  map* testMap=NULL;
139  if(hasEl>0){
140    testMap=getMap(el->content,"maxOccurs");
141  }else{
142    testMap=createMap("maxOccurs","unbounded");
143  }
144
145  if(testMap!=NULL){
146    if(strncasecmp(testMap->value,"unbounded",9)!=0 && atoi(testMap->value)>1){
147      if(addMapsArrayToMaps(&mo,mi,tmap->name)<0){
148        char emsg[1024];
149        sprintf(emsg,_("You set maximum occurences for <%s> as %i but you tried to use it more than the limit you set. Please correct your ZCFG file or your request."),mi->name,atoi(testMap->value));
150        errorException(m,emsg,"InternalError");
151        return -1;
152      }
153    }else{
154      if(strncasecmp(testMap->value,"unbounded",9)==0){
155        if(hasEl<0){
156          freeMap(&testMap);
157          free(testMap);
158        }
159        if(addMapsArrayToMaps(&mo,mi,tmap->name)<0){
160          char emsg[1024];
161          map* tmpMap=getMap(mi->content,"length");
162          sprintf(emsg,_("ZOO-Kernel was unable to load your data for %s position %s."),mi->name,tmpMap->value);
163          errorException(m,emsg,"InternalError");
164          return -1;
165        }
166      }
167      else{
168        char emsg[1024];
169        sprintf(emsg,_("You set maximum occurences for <%s> to one but you tried to use it more than once. Please correct your ZCFG file or your request."),mi->name);
170        errorException(m,emsg,"InternalError");
171        return -1;
172      }
173    }
174  }
175  return 0;
176}
177
178xmlXPathObjectPtr extractFromDoc(xmlDocPtr doc,const char* search){
179  xmlXPathContextPtr xpathCtx;
180  xmlXPathObjectPtr xpathObj;
181  xpathCtx = xmlXPathNewContext(doc);
182  xpathObj = xmlXPathEvalExpression(BAD_CAST search,xpathCtx);
183  xmlXPathFreeContext(xpathCtx);
184  return xpathObj;
185}
186
187void donothing(int sig){
188  fprintf(stderr,"Signal %d after the ZOO-Kernel returned result !\n",sig);
189  exit(0);
190}
191
192void sig_handler(int sig){
193  char tmp[100];
194  const char *ssig;
195  switch(sig){
196  case SIGSEGV:
197    ssig="SIGSEGV";
198    break;
199  case SIGTERM:
200    ssig="SIGTERM";
201    break;
202  case SIGINT:
203    ssig="SIGINT";
204    break;
205  case SIGILL:
206    ssig="SIGILL";
207    break;
208  case SIGFPE:
209    ssig="SIGFPE";
210    break;
211  case SIGABRT:
212    ssig="SIGABRT";
213    break;
214  default:
215    ssig="UNKNOWN";
216    break;
217  }
218  sprintf(tmp,_("ZOO Kernel failed to process your request receiving signal %d = %s"),sig,ssig);
219  errorException(NULL, tmp, "InternalError");
220#ifdef DEBUG
221  fprintf(stderr,"Not this time!\n");
222#endif
223  exit(0);
224}
225
226void loadServiceAndRun(maps **myMap,service* s1,map* request_inputs,maps **inputs,maps** ioutputs,int* eres){
227  char tmps1[1024];
228  char ntmp[1024];
229  maps *m=*myMap;
230  maps *request_output_real_format=*ioutputs;
231  maps *request_input_real_format=*inputs;
232  /**
233   * Extract serviceType to know what kind of service should be loaded
234   */
235  map* r_inputs=NULL;
236#ifndef WIN32
237  char* pntmp=getcwd(ntmp,1024);
238#else
239  _getcwd(ntmp,1024);
240#endif
241  r_inputs=getMap(s1->content,"serviceType");
242#ifdef DEBUG
243  fprintf(stderr,"LOAD A %s SERVICE PROVIDER \n",r_inputs->value);
244  fflush(stderr);
245#endif
246  if(strlen(r_inputs->value)==1 && strncasecmp(r_inputs->value,"C",1)==0){
247    r_inputs=getMap(request_inputs,"metapath");
248    if(r_inputs!=NULL)
249      sprintf(tmps1,"%s/%s",ntmp,r_inputs->value);
250    else
251      sprintf(tmps1,"%s/",ntmp);
252    char *altPath=strdup(tmps1);
253    r_inputs=getMap(s1->content,"ServiceProvider");
254    sprintf(tmps1,"%s/%s",altPath,r_inputs->value);
255    free(altPath);
256#ifdef DEBUG
257    fprintf(stderr,"Trying to load %s\n",tmps1);
258#endif
259#ifdef WIN32
260    HINSTANCE so = LoadLibraryEx(tmps1,NULL,LOAD_WITH_ALTERED_SEARCH_PATH);
261#else
262    void* so = dlopen(tmps1, RTLD_LAZY);
263#endif
264#ifdef DEBUG
265#ifdef WIN32
266    DWORD errstr;
267    errstr = GetLastError();
268    fprintf(stderr,"%s loaded (%d) \n",tmps1,errstr);
269#else
270    char *errstr;
271    errstr = dlerror();
272#endif
273#endif
274
275    if( so != NULL ) {
276#ifdef DEBUG
277      fprintf(stderr,"Library loaded %s \n",errstr);
278      fprintf(stderr,"Service Shared Object = %s\n",r_inputs->value);
279#endif
280      r_inputs=getMap(s1->content,"serviceType");
281#ifdef DEBUG
282      dumpMap(r_inputs);
283      fprintf(stderr,"%s\n",r_inputs->value);
284      fflush(stderr);
285#endif
286      if(strncasecmp(r_inputs->value,"C-FORTRAN",9)==0){
287        r_inputs=getMap(request_inputs,"Identifier");
288        char fname[1024];
289        sprintf(fname,"%s_",r_inputs->value);
290#ifdef DEBUG
291        fprintf(stderr,"Try to load function %s\n",fname);
292#endif
293#ifdef WIN32
294        typedef int (CALLBACK* execute_t)(char***,char***,char***);
295        execute_t execute=(execute_t)GetProcAddress(so,fname);
296#else
297        typedef int (*execute_t)(char***,char***,char***);
298        execute_t execute=(execute_t)dlsym(so,fname);
299#endif
300#ifdef DEBUG
301#ifdef WIN32
302        errstr = GetLastError();
303#else
304        errstr = dlerror();
305#endif
306        fprintf(stderr,"Function loaded %s\n",errstr);
307#endif 
308
309        char main_conf[10][30][1024];
310        char inputs[10][30][1024];
311        char outputs[10][30][1024];
312        for(int i=0;i<10;i++){
313          for(int j=0;j<30;j++){
314            memset(main_conf[i][j],0,1024);
315            memset(inputs[i][j],0,1024);
316            memset(outputs[i][j],0,1024);
317          }
318        }
319        mapsToCharXXX(m,(char***)main_conf);
320        mapsToCharXXX(request_input_real_format,(char***)inputs);
321        mapsToCharXXX(request_output_real_format,(char***)outputs);
322        *eres=execute((char***)&main_conf[0],(char***)&inputs[0],(char***)&outputs[0]);
323#ifdef DEBUG
324        fprintf(stderr,"Function run successfully \n");
325#endif
326        charxxxToMaps((char***)&outputs[0],&request_output_real_format);
327      }else{
328#ifdef DEBUG
329#ifdef WIN32
330        errstr = GetLastError();
331        fprintf(stderr,"Function %s failed to load because of %d\n",r_inputs->value,errstr);
332#endif
333#endif
334        r_inputs=getMap(request_inputs,"Identifier");
335#ifdef DEBUG
336        fprintf(stderr,"Try to load function %s\n",r_inputs->value);
337#endif
338        typedef int (*execute_t)(maps**,maps**,maps**);
339#ifdef WIN32
340        execute_t execute=(execute_t)GetProcAddress(so,r_inputs->value); 
341#else
342        execute_t execute=(execute_t)dlsym(so,r_inputs->value);
343#endif
344
345#ifdef DEBUG
346#ifdef WIN32
347        errstr = GetLastError();
348#else
349        errstr = dlerror();
350#endif
351        fprintf(stderr,"Function loaded %s\n",errstr);
352#endif 
353
354#ifdef DEBUG
355        fprintf(stderr,"Now run the function \n");
356        fflush(stderr);
357#endif
358        *eres=execute(&m,&request_input_real_format,&request_output_real_format);
359#ifdef DEBUG
360        fprintf(stderr,"Function loaded and returned %d\n",eres);
361        fflush(stderr);
362#endif
363      }
364#ifdef WIN32
365      *ioutputs=dupMaps(&request_output_real_format);
366      FreeLibrary(so);
367#else
368      dlclose(so);
369#endif
370    } else {
371      /**
372       * Unable to load the specified shared library
373       */
374      char tmps[1024];
375#ifdef WIN32
376      DWORD errstr = GetLastError();
377#else
378      char* errstr = dlerror();
379#endif
380      sprintf(tmps,_("C Library can't be loaded %s \n"),errstr);
381      map* tmps1=createMap("text",tmps);
382      printExceptionReportResponse(m,tmps1);
383      *eres=-1;
384    }
385  }
386  else
387#ifdef USE_PYTHON
388    if(strncasecmp(r_inputs->value,"PYTHON",6)==0){
389      *eres=zoo_python_support(&m,request_inputs,s1,&request_input_real_format,&request_output_real_format);
390    }
391    else
392#endif
393       
394#ifdef USE_JAVA
395      if(strncasecmp(r_inputs->value,"JAVA",4)==0){
396        *eres=zoo_java_support(&m,request_inputs,s1,&request_input_real_format,&request_output_real_format);
397      }
398      else
399#endif
400
401#ifdef USE_PHP
402        if(strncasecmp(r_inputs->value,"PHP",3)==0){
403          *eres=zoo_php_support(&m,request_inputs,s1,&request_input_real_format,&request_output_real_format);
404        }
405        else
406#endif
407           
408           
409#ifdef USE_PERL
410          if(strncasecmp(r_inputs->value,"PERL",4)==0){
411            *eres=zoo_perl_support(&m,request_inputs,s1,&request_input_real_format,&request_output_real_format);
412          }
413          else
414#endif
415
416#ifdef USE_JS
417            if(strncasecmp(r_inputs->value,"JS",2)==0){
418              *eres=zoo_js_support(&m,request_inputs,s1,&request_input_real_format,&request_output_real_format);
419            }
420            else
421#endif
422              {
423                char tmpv[1024];
424                sprintf(tmpv,_("Programming Language (%s) set in ZCFG file is not currently supported by ZOO Kernel.\n"),r_inputs->value);
425                map* tmps=createMap("text",tmpv);
426                printExceptionReportResponse(m,tmps);
427                *eres=-1;
428              }
429  *myMap=m;
430  *ioutputs=request_output_real_format;
431}
432
433
434#ifdef WIN32
435/**
436 * createProcess function: create a new process after setting some env variables
437 */
438void createProcess(maps* m,map* request_inputs,service* s1,char* opts,int cpid, maps* inputs,maps* outputs){
439  STARTUPINFO si;
440  PROCESS_INFORMATION pi;
441  ZeroMemory( &si, sizeof(si) );
442  si.cb = sizeof(si);
443  ZeroMemory( &pi, sizeof(pi) );
444  char *tmp=(char *)malloc((1024+cgiContentLength)*sizeof(char));
445  char *tmpq=(char *)malloc((1024+cgiContentLength)*sizeof(char));
446  map *req=getMap(request_inputs,"request");
447  map *id=getMap(request_inputs,"identifier");
448  map *di=getMap(request_inputs,"DataInputs");
449
450  char *dataInputsKVP=getMapsAsKVP(inputs,cgiContentLength,0);
451  char *dataOutputsKVP=getMapsAsKVP(outputs,cgiContentLength,1);
452#ifdef DEBUG
453  fprintf(stderr,"DATAINPUTSKVP %s\n",dataInputsKVP);
454  fprintf(stderr,"DATAOUTPUTSKVP %s\n",dataOutputsKVP);
455#endif
456  map *sid=getMapFromMaps(m,"lenv","sid");
457  map* r_inputs=getMapFromMaps(m,"main","tmpPath");
458  map* r_inputs1=getMap(request_inputs,"metapath");
459  int hasIn=-1;
460  if(r_inputs1==NULL){
461    r_inputs1=createMap("metapath","");
462    hasIn=1;
463  }
464  map* r_inputs2=getMap(s1->content,"ResponseDocument");
465  if(r_inputs2==NULL)
466    r_inputs2=getMap(s1->content,"RawDataOutput");
467  map *tmpPath=getMapFromMaps(m,"lenv","cwd");
468
469  if(r_inputs2!=NULL){
470    sprintf(tmp,"\"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&%s=%s&cgiSid=%s\"",r_inputs1->value,req->value,id->value,dataInputsKVP,r_inputs2->name,r_inputs2->value,sid->value);
471    sprintf(tmpq,"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&%s=%s",r_inputs1->value,req->value,id->value,dataInputsKVP,r_inputs2->name,dataOutputsKVP);
472  }
473  else{
474    sprintf(tmp,"\"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s&cgiSid=%s\"",r_inputs1->value,req->value,id->value,dataInputsKVP,sid->value);
475    sprintf(tmpq,"metapath=%s&request=%s&service=WPS&version=1.0.0&Identifier=%s&DataInputs=%s",r_inputs1->value,req->value,id->value,dataInputsKVP,sid->value);
476  }
477 
478  if(hasIn>0){
479    freeMap(&r_inputs1);
480    free(r_inputs1);
481  }
482  char *tmp1=strdup(tmp);
483  sprintf(tmp,"zoo_loader.cgi %s \"%s\"",tmp1,sid->value);
484 
485  free(dataInputsKVP);
486  free(dataOutputsKVP);
487  //printf("REQUEST IS : %s \n",tmp);
488#ifdef DEBUG
489  fprintf(stderr,"REQUEST IS : %s \n",tmp);
490#endif
491  SetEnvironmentVariable("CGISID",TEXT(sid->value));
492  SetEnvironmentVariable("QUERY_STRING",TEXT(tmpq));
493  char clen[1000];
494  sprintf(clen,"%d",strlen(tmpq));
495  SetEnvironmentVariable("CONTENT_LENGTH",TEXT(clen));
496
497  if( !CreateProcess( NULL,             // No module name (use command line)
498                      TEXT(tmp),        // Command line
499                      NULL,             // Process handle not inheritable
500                      NULL,             // Thread handle not inheritable
501                      FALSE,            // Set handle inheritance to FALSE
502                      CREATE_NO_WINDOW, // Apache won't wait until the end
503                      NULL,             // Use parent's environment block
504                      NULL,             // Use parent's starting directory
505                      &si,              // Pointer to STARTUPINFO struct
506                      &pi )             // Pointer to PROCESS_INFORMATION struct
507      ) 
508    { 
509      //printf("CreateProcess failed (%d).\n",GetLastError() );
510#ifdef DEBUG
511      fprintf( stderr, "CreateProcess failed (%d).\n", GetLastError() );
512#endif
513      return ;
514    }else{
515    //printf("CreateProcess successfull (%d).\n",GetLastError() );
516#ifdef DEBUG
517    fprintf( stderr, "CreateProcess successfull (%d).\n\n\n\n", GetLastError() );
518#endif
519  }
520  CloseHandle( pi.hProcess );
521  CloseHandle( pi.hThread );
522  //printf("CreateProcess finished !\n");
523#ifdef DEBUG
524  fprintf(stderr,"CreateProcess finished !\n");
525#endif
526}
527#endif
528
529int runRequest(map* request_inputs)
530{
531
532#ifndef USE_GDB
533  (void) signal(SIGSEGV,sig_handler);
534  (void) signal(SIGTERM,sig_handler);
535  (void) signal(SIGINT,sig_handler);
536  (void) signal(SIGILL,sig_handler);
537  (void) signal(SIGFPE,sig_handler);
538  (void) signal(SIGABRT,sig_handler);
539#endif
540
541  map* r_inputs=NULL;
542  maps* m=NULL;
543
544  char* REQUEST=NULL;
545  /**
546   * Parsing service specfic configuration file
547   */
548  m=(maps*)malloc(MAPS_SIZE);
549  if(m == NULL){
550    return errorException(m, _("Unable to allocate memory."), "InternalError");
551  }
552  char ntmp[1024];
553#ifndef WIN32
554  char *pntmp=getcwd(ntmp,1024);
555#else
556  _getcwd(ntmp,1024);
557#endif
558  r_inputs=getMapOrFill(request_inputs,"metapath","");
559
560
561  char conf_file[10240];
562  snprintf(conf_file,10240,"%s/%s/main.cfg",ntmp,r_inputs->value);
563  conf_read(conf_file,m);
564#ifdef DEBUG
565  fprintf(stderr, "***** BEGIN MAPS\n"); 
566  dumpMaps(m);
567  fprintf(stderr, "***** END MAPS\n");
568#endif
569
570  map *getPath=getMapFromMaps(m,"main","gettextPath");
571  if(getPath!=NULL){
572    bindtextdomain ("zoo-kernel",getPath->value);
573    bindtextdomain ("zoo-services",getPath->value);   
574  }else{
575    bindtextdomain ("zoo-kernel","/usr/share/locale/");
576    bindtextdomain ("zoo-services","/usr/share/locale/");
577  }
578
579
580  /**
581   * Manage our own error log file (usefull to separate standard apache debug
582   * messages from the ZOO-Kernel ones but also for IIS users to avoid wrong
583   * headers messages returned by the CGI due to wrong redirection of stderr)
584   */
585  FILE * fstde=NULL;
586  map* fstdem=getMapFromMaps(m,"main","logPath");
587  if(fstdem!=NULL)
588        fstde = freopen(fstdem->value, "a+", stderr) ;
589
590  r_inputs=getMap(request_inputs,"language");
591  if(r_inputs==NULL)
592    r_inputs=getMapFromMaps(m,"main","language");
593  if(r_inputs!=NULL){
594    char *tmp=strdup(r_inputs->value);
595    setMapInMaps(m,"main","language",tmp);
596    translateChar(tmp,'-','_');
597    setlocale (LC_ALL, tmp);
598#ifdef WIN32
599    char tmp1[12];
600    sprintf(tmp1,"LC_ALL=%s",tmp);
601    putenv(tmp1);
602#endif
603    free(tmp);
604  }
605  else{
606    setlocale (LC_ALL, "en_US");
607#ifdef WIN32
608    char tmp1[12];
609    sprintf(tmp1,"LC_ALL=en_US");
610    putenv(tmp1);
611#endif
612    setMapInMaps(m,"main","language","en-US");
613  }
614  setlocale (LC_NUMERIC, "en_US");
615  bind_textdomain_codeset("zoo-kernel","UTF-8");
616  textdomain("zoo-kernel");
617  bind_textdomain_codeset("zoo-services","UTF-8");
618  textdomain("zoo-services");
619
620  map* lsoap=getMap(request_inputs,"soap");
621  if(lsoap!=NULL && strcasecmp(lsoap->value,"true")==0)
622    setMapInMaps(m,"main","isSoap","true");
623  else
624    setMapInMaps(m,"main","isSoap","false");
625
626
627  /**
628   * Check for minimum inputs
629   */
630  r_inputs=getMap(request_inputs,"Request");
631  if(request_inputs==NULL || r_inputs==NULL){ 
632    errorException(m, _("Parameter <request> was not specified"),"MissingParameterValue");
633    freeMaps(&m);
634    free(m);
635    freeMap(&request_inputs);
636    free(request_inputs);
637    free(REQUEST);
638    return 1;
639  }
640  else{
641    REQUEST=strdup(r_inputs->value);
642    if(strncasecmp(r_inputs->value,"GetCapabilities",15)!=0
643       && strncasecmp(r_inputs->value,"DescribeProcess",15)!=0
644       && strncasecmp(r_inputs->value,"Execute",7)!=0){ 
645      errorException(m, _("Unenderstood <request> value. Please check that it was set to GetCapabilities, DescribeProcess or Execute."), "InvalidParameterValue");
646      freeMaps(&m);
647      free(m);
648      free(REQUEST);
649      return 1;
650    }
651  }
652  r_inputs=NULL;
653  r_inputs=getMap(request_inputs,"Service");
654  if(r_inputs==NULLMAP){
655    errorException(m, _("Parameter <service> was not specified"),"MissingParameterValue");
656    freeMaps(&m);
657    free(m);
658    free(REQUEST);
659    return 1;
660  }
661  if(strncasecmp(REQUEST,"GetCapabilities",15)!=0){
662    r_inputs=getMap(request_inputs,"Version");
663    if(r_inputs==NULL){ 
664      errorException(m, _("Parameter <version> was not specified"),"MissingParameterValue");
665      freeMaps(&m);
666      free(m);
667      free(REQUEST);
668      return 1;
669    }
670  }
671
672  r_inputs=getMap(request_inputs,"serviceprovider");
673  if(r_inputs==NULL){
674    addToMap(request_inputs,"serviceprovider","");
675  }
676
677  maps* request_output_real_format=NULL;
678  map* tmpm=getMapFromMaps(m,"main","serverAddress");
679  if(tmpm!=NULL)
680    SERVICE_URL=strdup(tmpm->value);
681  else
682    SERVICE_URL=strdup(DEFAULT_SERVICE_URL);
683
684  service* s1;
685  int scount=0;
686#ifdef DEBUG
687  dumpMap(r_inputs);
688#endif
689  char conf_dir[1024];
690  int t;
691  char tmps1[1024];
692
693  r_inputs=NULL;
694  r_inputs=getMap(request_inputs,"metapath");
695  if(r_inputs!=NULL)
696    snprintf(conf_dir,1024,"%s/%s",ntmp,r_inputs->value);
697  else
698    snprintf(conf_dir,1024,"%s",ntmp);
699
700  if(strncasecmp(REQUEST,"GetCapabilities",15)==0){
701    struct dirent *dp;
702#ifdef DEBUG
703    dumpMap(r_inputs);
704#endif
705    DIR *dirp = opendir(conf_dir);
706    if(dirp==NULL){
707      return errorException(m, _("The specified path doesn't exist."),"InvalidParameterValue");
708    }
709    xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
710    r_inputs=NULL;
711    r_inputs=getMap(request_inputs,"ServiceProvider");
712    xmlNodePtr n;
713    if(r_inputs!=NULL)
714      n = printGetCapabilitiesHeader(doc,r_inputs->value,m);
715    else
716      n = printGetCapabilitiesHeader(doc,"",m);
717    /**
718     * Here we need to close stdout to ensure that not supported chars
719     * has been found in the zcfg and then printed on stdout
720     */
721    int saved_stdout = dup(fileno(stdout));
722    dup2(fileno(stderr),fileno(stdout));
723    while ((dp = readdir(dirp)) != NULL)
724      if(strstr(dp->d_name,".zcfg")!=0){
725        memset(tmps1,0,1024);
726        snprintf(tmps1,1024,"%s/%s",conf_dir,dp->d_name);
727        s1=(service*)malloc(SERVICE_SIZE);
728        if(s1 == NULL){ 
729          return errorException(m, _("Unable to allocate memory."),"InternalError");
730        }
731#ifdef DEBUG
732        fprintf(stderr,"#################\n%s\n#################\n",tmps1);
733#endif
734        t=getServiceFromFile(tmps1,&s1);
735#ifdef DEBUG
736        dumpService(s1);
737        fflush(stdout);
738        fflush(stderr);
739#endif
740        printGetCapabilitiesForProcess(m,n,s1);
741        freeService(&s1);
742        free(s1);
743        scount++;
744      }
745    (void)closedir(dirp);
746    fflush(stdout);
747    dup2(saved_stdout,fileno(stdout));
748    printDocument(m,doc,getpid());
749    freeMaps(&m);
750    free(m);
751    free(REQUEST);
752    free(SERVICE_URL);
753    fflush(stdout);
754    return 0;
755  }
756  else{
757    r_inputs=getMap(request_inputs,"Identifier");
758    if(r_inputs==NULL 
759       || strlen(r_inputs->name)==0 || strlen(r_inputs->value)==0){ 
760      errorException(m, _("Mandatory <identifier> was not specified"),"MissingParameterValue");
761      freeMaps(&m);
762      free(m);
763      free(REQUEST);
764      free(SERVICE_URL);
765      return 0;
766    }
767
768    struct dirent *dp;
769    DIR *dirp = opendir(conf_dir);
770    if(dirp==NULL){
771      errorException(m, _("The specified path path doesn't exist."),"InvalidParameterValue");
772      freeMaps(&m);
773      free(m);
774      free(REQUEST);
775      free(SERVICE_URL);
776      return 0;
777    }
778    if(strncasecmp(REQUEST,"DescribeProcess",15)==0){
779      /**
780       * Loop over Identifier list
781       */
782      xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0");
783      r_inputs=NULL;
784      r_inputs=getMap(request_inputs,"ServiceProvider");
785
786      xmlNodePtr n;
787      if(r_inputs!=NULL)
788        n = printDescribeProcessHeader(doc,r_inputs->value,m);
789      else
790        n = printDescribeProcessHeader(doc,"",m);
791
792      r_inputs=getMap(request_inputs,"Identifier");
793      char *tmps=strtok(r_inputs->value,",");
794     
795      char buff[256];
796      char buff1[1024];
797      int saved_stdout = dup(fileno(stdout));
798      dup2(fileno(stderr),fileno(stdout));
799      while(tmps){
800        memset(buff,0,256);
801        snprintf(buff,256,"%s.zcfg",tmps);
802        memset(buff1,0,1024);
803#ifdef DEBUG
804        printf("\n#######%s\n########\n",buff1);
805#endif
806        while ((dp = readdir(dirp)) != NULL)
807          if((strcasecmp("all.zcfg",buff)==0 && strstr(dp->d_name,".zcfg")>0)
808             || strcasecmp(dp->d_name,buff)==0){
809            memset(buff1,0,1024);
810            snprintf(buff1,1024,"%s/%s",conf_dir,dp->d_name);
811            s1=(service*)malloc(SERVICE_SIZE);
812            if(s1 == NULL){
813              dup2(saved_stdout,fileno(stdout));
814              return errorException(m, _("Unable to allocate memory."),"InternalError");
815            }
816#ifdef DEBUG
817            printf("#################\n%s\n#################\n",buff1);
818#endif
819            t=getServiceFromFile(buff1,&s1);
820#ifdef DEBUG
821            dumpService(s1);
822#endif
823            printDescribeProcessForProcess(m,n,s1,1);
824            freeService(&s1);
825            free(s1);
826            scount++;
827          }
828        rewinddir(dirp);
829        tmps=strtok(NULL,",");
830      }
831      closedir(dirp);
832      fflush(stdout);
833      dup2(saved_stdout,fileno(stdout));
834      printDocument(m,doc,getpid());
835      freeMaps(&m);
836      free(m);
837      free(REQUEST);
838      free(SERVICE_URL);
839      fflush(stdout);
840#ifndef LINUX_FREE_ISSUE
841      if(s1)
842        free(s1);
843#endif
844      return 0;
845    }
846    else
847      if(strncasecmp(REQUEST,"Execute",strlen(REQUEST))!=0){
848        errorException(m, _("Unenderstood <request> value. Please check that it was set to GetCapabilities, DescribeProcess or Execute."), "InvalidParameterValue");
849#ifdef DEBUG
850        fprintf(stderr,"No request found %s",REQUEST);
851#endif 
852        closedir(dirp);
853        return 0;
854      }
855    closedir(dirp);
856  }
857 
858  s1=NULL;
859  s1=(service*)malloc(SERVICE_SIZE);
860  if(s1 == NULL){
861    freeMaps(&m);
862    free(m);
863    free(REQUEST);
864    free(SERVICE_URL);
865    return errorException(m, _("Unable to allocate memory."),"InternalError");
866  }
867  r_inputs=getMap(request_inputs,"MetaPath");
868  if(r_inputs!=NULL)
869    snprintf(tmps1,1024,"%s/%s",ntmp,r_inputs->value);
870  else
871    snprintf(tmps1,1024,"%s/",ntmp);
872  r_inputs=getMap(request_inputs,"Identifier");
873  char *ttmp=strdup(tmps1);
874  snprintf(tmps1,1024,"%s/%s.zcfg",ttmp,r_inputs->value);
875  free(ttmp);
876#ifdef DEBUG
877  fprintf(stderr,"Trying to load %s\n", tmps1);
878#endif
879  int saved_stdout = dup(fileno(stdout));
880  dup2(fileno(stderr),fileno(stdout));
881  t=getServiceFromFile(tmps1,&s1);
882  fflush(stdout);
883  dup2(saved_stdout,fileno(stdout));
884  if(t<0){
885    char *tmpMsg=(char*)malloc(2048+strlen(r_inputs->value));
886   
887    sprintf(tmpMsg,_("The value for <indetifier> seems to be wrong (%s). Please, ensure that the process exist using the GetCapabilities request."),r_inputs->value);
888    errorException(m, tmpMsg, "InvalidParameterValue");
889    free(tmpMsg);
890    freeService(&s1);
891    free(s1);
892    freeMaps(&m);
893    free(m);
894    free(REQUEST);
895    free(SERVICE_URL);
896    return 0;
897  }
898  close(saved_stdout);
899
900#ifdef DEBUG
901  dumpService(s1);
902#endif
903  int j;
904 
905
906  /**
907   * Create the input and output maps data structure
908   */
909  int i=0;
910  HINTERNET hInternet;
911  HINTERNET res;
912  hInternet=InternetOpen(
913#ifndef WIN32
914                         (LPCTSTR)
915#endif
916                         "ZooWPSClient\0",
917                         INTERNET_OPEN_TYPE_PRECONFIG,
918                         NULL,NULL, 0);
919
920#ifndef WIN32
921  if(!CHECK_INET_HANDLE(hInternet))
922    fprintf(stderr,"WARNING : hInternet handle failed to initialize");
923#endif
924  maps* request_input_real_format=NULL;
925  maps* tmpmaps = request_input_real_format;
926  map* postRequest=NULL;
927  postRequest=getMap(request_inputs,"xrequest");
928  if(postRequest==NULLMAP){
929    /**
930     * Parsing outputs provided as KVP
931     */
932    r_inputs=NULL;
933#ifdef DEBUG
934    fprintf(stderr,"OUTPUT Parsing ... \n");
935#endif
936    r_inputs=getMap(request_inputs,"ResponseDocument"); 
937    if(r_inputs==NULL) r_inputs=getMap(request_inputs,"RawDataOutput");
938   
939#ifdef DEBUG
940    fprintf(stderr,"OUTPUT Parsing ... \n");
941#endif
942    if(r_inputs!=NULL){
943#ifdef DEBUG
944      fprintf(stderr,"OUTPUT Parsing start now ... \n");
945#endif
946      char cursor_output[10240];
947      char *cotmp=strdup(r_inputs->value);
948      snprintf(cursor_output,10240,"%s",cotmp);
949      free(cotmp);
950      j=0;
951       
952      /**
953       * Put each Output into the outputs_as_text array
954       */
955      char * pToken;
956      maps* tmp_output=NULL;
957#ifdef DEBUG
958      fprintf(stderr,"OUTPUT [%s]\n",cursor_output);
959#endif
960      pToken=strtok(cursor_output,";");
961      char** outputs_as_text=(char**)malloc(128*sizeof(char*));
962      if(outputs_as_text == NULL) {
963        return errorException(m, _("Unable to allocate memory"), "InternalError");
964      }
965      i=0;
966      while(pToken!=NULL){
967#ifdef DEBUG
968        fprintf(stderr,"***%s***\n",pToken);
969        fflush(stderr);
970        fprintf(stderr,"***%s***\n",pToken);
971#endif
972        outputs_as_text[i]=(char*)malloc((strlen(pToken)+1)*sizeof(char));
973        if(outputs_as_text[i] == NULL) {
974          return errorException(m, _("Unable to allocate memory"), "InternalError");
975        }
976        snprintf(outputs_as_text[i],strlen(pToken)+1,"%s",pToken);
977        pToken = strtok(NULL,";");
978        i++;
979      }
980      for(j=0;j<i;j++){
981        char *tmp=strdup(outputs_as_text[j]);
982        free(outputs_as_text[j]);
983        char *tmpc;
984        tmpc=strtok(tmp,"@");
985        int k=0;
986        while(tmpc!=NULL){
987          if(k==0){
988            if(tmp_output==NULL){
989              tmp_output=(maps*)malloc(MAPS_SIZE);
990              if(tmp_output == NULL){
991                return errorException(m, _("Unable to allocate memory."), "InternalError");
992              }
993              tmp_output->name=strdup(tmpc);
994              tmp_output->content=NULL;
995              tmp_output->next=NULL;
996            }
997          }
998          else{
999            char *tmpv=strstr(tmpc,"=");
1000            char tmpn[256];
1001            memset(tmpn,0,256);
1002            strncpy(tmpn,tmpc,(strlen(tmpc)-strlen(tmpv))*sizeof(char));
1003            tmpn[strlen(tmpc)-strlen(tmpv)]=0;
1004#ifdef DEBUG
1005            fprintf(stderr,"OUTPUT DEF [%s]=[%s]\n",tmpn,tmpv+1);
1006#endif
1007            if(tmp_output->content==NULL){
1008              tmp_output->content=createMap(tmpn,tmpv+1);
1009              tmp_output->content->next=NULL;
1010            }
1011            else
1012              addToMap(tmp_output->content,tmpn,tmpv+1);
1013          }
1014          k++;
1015#ifdef DEBUG
1016          fprintf(stderr,"***%s***\n",tmpc);
1017#endif
1018          tmpc=strtok(NULL,"@");
1019        }
1020        if(request_output_real_format==NULL)
1021          request_output_real_format=dupMaps(&tmp_output);
1022        else
1023          addMapsToMaps(&request_output_real_format,tmp_output);
1024        freeMaps(&tmp_output);
1025        free(tmp_output);
1026        tmp_output=NULL;
1027#ifdef DEBUG
1028        dumpMaps(tmp_output);
1029        fflush(stderr);
1030#endif
1031        free(tmp);
1032      }
1033      free(outputs_as_text);
1034    }
1035
1036
1037    /**
1038     * Parsing inputs provided as KVP
1039     */
1040    r_inputs=getMap(request_inputs,"DataInputs");
1041#ifdef DEBUG
1042    fprintf(stderr,"DATA INPUTS [%s]\n",r_inputs->value);
1043#endif
1044    char cursor_input[40960];
1045    if(r_inputs!=NULL)
1046      snprintf(cursor_input,40960,"%s",r_inputs->value);
1047    else{
1048      errorException(m, _("Parameter <DataInputs> was not specified"),"MissingParameterValue");
1049      freeMaps(&m);
1050      free(m);
1051      free(REQUEST);
1052      free(SERVICE_URL);
1053      InternetCloseHandle(hInternet);
1054      freeService(&s1);
1055      free(s1);
1056      return 0;
1057    }
1058    j=0;
1059 
1060    /**
1061     * Put each DataInputs into the inputs_as_text array
1062     */
1063    char *tmp1=strdup(cursor_input);
1064    char * pToken;
1065    pToken=strtok(cursor_input,";");
1066    if(pToken!=NULL && strncasecmp(pToken,tmp1,strlen(tmp1))==0){
1067      char* tmp2=url_decode(tmp1);
1068      snprintf(cursor_input,(strlen(tmp2)+1)*sizeof(char),"%s",tmp2);
1069      free(tmp2);
1070      pToken=strtok(cursor_input,";");
1071    }
1072    free(tmp1);
1073
1074    char** inputs_as_text=(char**)malloc(100*sizeof(char*));
1075    if(inputs_as_text == NULL){
1076      return errorException(m, _("Unable to allocate memory."), "InternalError");
1077    }
1078    i=0;
1079    while(pToken!=NULL){
1080#ifdef DEBUG
1081      fprintf(stderr,"***%s***\n",pToken);
1082#endif
1083      fflush(stderr);
1084#ifdef DEBUG
1085      fprintf(stderr,"***%s***\n",pToken);
1086#endif
1087      inputs_as_text[i]=(char*)malloc((strlen(pToken)+1)*sizeof(char));
1088      snprintf(inputs_as_text[i],strlen(pToken)+1,"%s",pToken);
1089      if(inputs_as_text[i] == NULL){
1090        return errorException(m, _("Unable to allocate memory."), "InternalError");
1091      }
1092      pToken = strtok(NULL,";");
1093      i++;
1094    }
1095
1096    for(j=0;j<i;j++){
1097      char *tmp=strdup(inputs_as_text[j]);
1098      free(inputs_as_text[j]);
1099      char *tmpc;
1100      tmpc=strtok(tmp,"@");
1101      while(tmpc!=NULL){
1102#ifdef DEBUG
1103        fprintf(stderr,"***\n***%s***\n",tmpc);
1104#endif
1105        char *tmpv=strstr(tmpc,"=");
1106        char tmpn[256];
1107        memset(tmpn,0,256);
1108        if(tmpv!=NULL){
1109          strncpy(tmpn,tmpc,(strlen(tmpc)-strlen(tmpv))*sizeof(char));
1110          tmpn[strlen(tmpc)-strlen(tmpv)]=0;
1111        }
1112        else{
1113          strncpy(tmpn,tmpc,strlen(tmpc)*sizeof(char));
1114          tmpn[strlen(tmpc)]=0;
1115        }
1116#ifdef DEBUG
1117        fprintf(stderr,"***\n*** %s = %s ***\n",tmpn,tmpv+1);
1118#endif
1119        if(tmpmaps==NULL){
1120          tmpmaps=(maps*)malloc(MAPS_SIZE);
1121          if(tmpmaps == NULL){
1122            return errorException(m, _("Unable to allocate memory."), "InternalError");
1123          }
1124          tmpmaps->name=strdup(tmpn);
1125          if(tmpv!=NULL){
1126            char *tmpvf=url_decode(tmpv+1);
1127            tmpmaps->content=createMap("value",tmpvf);
1128            free(tmpvf);
1129          }
1130          else
1131            tmpmaps->content=createMap("value","Reference");
1132          tmpmaps->next=NULL;
1133        }
1134        tmpc=strtok(NULL,"@");
1135        while(tmpc!=NULL){
1136#ifdef DEBUG
1137          fprintf(stderr,"*** KVP NON URL-ENCODED \n***%s***\n",tmpc);
1138#endif
1139          char *tmpv1=strstr(tmpc,"=");
1140#ifdef DEBUG
1141          fprintf(stderr,"*** VALUE NON URL-ENCODED \n***%s***\n",tmpv1+1);
1142#endif
1143          char tmpn1[1024];
1144          memset(tmpn1,0,1024);
1145          if(tmpv1!=NULL){
1146            strncpy(tmpn1,tmpc,strlen(tmpc)-strlen(tmpv1));
1147            tmpn1[strlen(tmpc)-strlen(tmpv1)]=0;
1148            addToMap(tmpmaps->content,tmpn1,tmpv1+1);
1149          }
1150          else{
1151            strncpy(tmpn1,tmpc,strlen(tmpc));
1152            tmpn1[strlen(tmpc)]=0;
1153            map* lmap=getLastMap(tmpmaps->content);
1154            char *tmpValue=(char*)malloc((strlen(tmpv)+strlen(tmpc)+1)*sizeof(char));
1155            sprintf(tmpValue,"%s@%s",tmpv+1,tmpc);
1156            free(lmap->value);
1157            lmap->value=strdup(tmpValue);
1158            free(tmpValue);
1159            tmpc=strtok(NULL,"@");
1160            continue;
1161          }
1162#ifdef DEBUG
1163          fprintf(stderr,"*** NAME NON URL-ENCODED \n***%s***\n",tmpn1);
1164          fprintf(stderr,"*** VALUE NON URL-ENCODED \n***%s***\n",tmpv1+1);
1165#endif
1166          if(strcmp(tmpn1,"xlink:href")!=0)
1167            addToMap(tmpmaps->content,tmpn1,tmpv1+1);
1168          else
1169            if(tmpv1!=NULL){
1170              char *tmpx2=url_decode(tmpv1+1);
1171              if(strncasecmp(tmpx2,"http://",7)!=0 &&
1172                 strncasecmp(tmpx2,"ftp://",6)!=0){
1173                char emsg[1024];
1174                sprintf(emsg,_("Unable to find a valid protocol to download the remote file %s"),tmpv1+1);
1175                errorException(m,emsg,"InternalError");
1176                freeMaps(&m);
1177                free(m);
1178                free(REQUEST);
1179                free(SERVICE_URL);
1180                InternetCloseHandle(hInternet);
1181                freeService(&s1);
1182                free(s1);
1183                return 0;
1184              }
1185#ifdef DEBUG
1186              fprintf(stderr,"REQUIRE TO DOWNLOAD A FILE FROM A SERVER : url(%s)\n",tmpv1+1);
1187#endif
1188              addToMap(tmpmaps->content,tmpn1,tmpx2);
1189             
1190#ifndef WIN32
1191              if(CHECK_INET_HANDLE(hInternet))
1192#endif
1193                {
1194                  if(loadRemoteFile(m,tmpmaps->content,hInternet,tmpx2)<0){
1195                    freeMaps(&m);
1196                    free(m);
1197                    free(REQUEST);
1198                    free(SERVICE_URL);
1199                    InternetCloseHandle(hInternet);
1200                    freeService(&s1);
1201                    free(s1);
1202                    return 0;
1203                  }
1204                }
1205              free(tmpx2);
1206              addToMap(tmpmaps->content,"Reference",tmpv1+1);
1207            }
1208          tmpc=strtok(NULL,"@");
1209        }
1210#ifdef DEBUG
1211        dumpMaps(tmpmaps);
1212        fflush(stderr);
1213#endif
1214        if(request_input_real_format==NULL)
1215          request_input_real_format=dupMaps(&tmpmaps);
1216        else{
1217          maps* testPresence=getMaps(request_input_real_format,tmpmaps->name);
1218          if(testPresence!=NULL){
1219            elements* elem=getElements(s1->inputs,tmpmaps->name);
1220            if(elem!=NULL){
1221              if(appendMapsToMaps(m,request_input_real_format,tmpmaps,elem)<0){
1222                freeMaps(&m);
1223                free(m);
1224                free(REQUEST);
1225                free(SERVICE_URL);
1226                InternetCloseHandle(hInternet);
1227                freeService(&s1);
1228                free(s1);
1229                return 0;
1230              }
1231            }
1232          }
1233          else
1234            addMapsToMaps(&request_input_real_format,tmpmaps);
1235        }
1236        freeMaps(&tmpmaps);
1237        free(tmpmaps);
1238        tmpmaps=NULL;
1239        free(tmp);
1240      }
1241    }
1242    free(inputs_as_text);
1243  }
1244  else {
1245    /**
1246     * Parse XML request
1247     */ 
1248    xmlInitParser();
1249#ifdef DEBUG
1250    fflush(stderr);
1251    fprintf(stderr,"BEFORE %s\n",postRequest->value);
1252    fflush(stderr);
1253#endif
1254    xmlDocPtr doc =
1255      xmlParseMemory(postRequest->value,cgiContentLength);
1256#ifdef DEBUG
1257    fprintf(stderr,"AFTER\n");
1258    fflush(stderr);
1259#endif
1260    /**
1261     * Parse every Input in DataInputs node.
1262     */
1263    xmlXPathObjectPtr tmpsptr=extractFromDoc(doc,"/*/*/*[local-name()='Input']");
1264    xmlNodeSet* tmps=tmpsptr->nodesetval;
1265#ifdef DEBUG
1266    fprintf(stderr,"*****%d*****\n",tmps->nodeNr);
1267#endif
1268    for(int k=0;k<tmps->nodeNr;k++){
1269      maps *tmpmaps=NULL;
1270      xmlNodePtr cur=tmps->nodeTab[k];
1271      if(tmps->nodeTab[k]->type == XML_ELEMENT_NODE) {
1272        /**
1273         * A specific Input node.
1274         */
1275#ifdef DEBUG
1276        fprintf(stderr, "= element 0 node \"%s\"\n", cur->name);
1277#endif
1278        xmlNodePtr cur2=cur->children;
1279        while(cur2!=NULL){
1280          while(cur2!=NULL && cur2->type!=XML_ELEMENT_NODE)
1281            cur2=cur2->next;
1282          if(cur2==NULL)
1283            break;
1284          /**
1285           * Indentifier
1286           */
1287          if(xmlStrncasecmp(cur2->name,BAD_CAST "Identifier",xmlStrlen(cur2->name))==0){
1288            xmlChar *val= xmlNodeListGetString(doc,cur2->xmlChildrenNode,1);
1289            if(tmpmaps==NULL){
1290              tmpmaps=(maps*)malloc(MAPS_SIZE);
1291              if(tmpmaps == NULL){
1292                return errorException(m, _("Unable to allocate memory."), "InternalError");
1293              }
1294              tmpmaps->name=strdup((char*)val);
1295              tmpmaps->content=NULL;
1296              tmpmaps->next=NULL;
1297            }
1298            xmlFree(val);
1299          }
1300          /**
1301           * Title, Asbtract
1302           */
1303          if(xmlStrncasecmp(cur2->name,BAD_CAST "Title",xmlStrlen(cur2->name))==0 ||
1304             xmlStrncasecmp(cur2->name,BAD_CAST "Abstract",xmlStrlen(cur2->name))==0){
1305            xmlChar *val=
1306              xmlNodeListGetString(doc,cur2->xmlChildrenNode,1);
1307            if(tmpmaps==NULL){
1308              tmpmaps=(maps*)malloc(MAPS_SIZE);
1309              if(tmpmaps == NULL){
1310                return errorException(m, _("Unable to allocate memory."), "InternalError");
1311              }
1312              tmpmaps->name=strdup("missingIndetifier");
1313              tmpmaps->content=createMap((char*)cur2->name,(char*)val);
1314              tmpmaps->next=NULL;
1315            }
1316            else{
1317              if(tmpmaps->content!=NULL)
1318                addToMap(tmpmaps->content,
1319                         (char*)cur2->name,(char*)val);
1320              else
1321                tmpmaps->content=
1322                  createMap((char*)cur2->name,(char*)val);
1323            }
1324#ifdef DEBUG
1325            dumpMaps(tmpmaps);
1326#endif
1327            xmlFree(val);
1328          }
1329          /**
1330           * InputDataFormChoice (Reference or Data ?)
1331           */
1332          if(xmlStrcasecmp(cur2->name,BAD_CAST "Reference")==0){
1333            /**
1334             * Get every attribute from a Reference node
1335             * mimeType, encoding, schema, href, method
1336             * Header and Body gesture should be added here
1337             */
1338#ifdef DEBUG
1339            fprintf(stderr,"REFERENCE\n");
1340#endif
1341            const char *refs[5]={"mimeType","encoding","schema","method","href"};
1342            for(int l=0;l<5;l++){
1343#ifdef DEBUG
1344              fprintf(stderr,"*** %s ***",refs[l]);
1345#endif
1346              xmlChar *val=xmlGetProp(cur2,BAD_CAST refs[l]);
1347              if(val!=NULL && xmlStrlen(val)>0){
1348                if(tmpmaps->content!=NULL)
1349                  addToMap(tmpmaps->content,refs[l],(char*)val);
1350                else
1351                  tmpmaps->content=createMap(refs[l],(char*)val);
1352                map* ltmp=getMap(tmpmaps->content,"method");
1353                if(l==4){
1354                  if(!(ltmp!=NULL && strcmp(ltmp->value,"POST")==0)
1355                     && CHECK_INET_HANDLE(hInternet)){
1356                    if(loadRemoteFile(m,tmpmaps->content,hInternet,(char*)val)!=0){
1357                      freeMaps(&m);
1358                      free(m);
1359                      free(REQUEST);
1360                      free(SERVICE_URL);
1361                      InternetCloseHandle(hInternet);
1362                      freeService(&s1);
1363                      free(s1);
1364                      return 0;
1365                    }
1366                  }
1367                }
1368              }
1369#ifdef DEBUG
1370              fprintf(stderr,"%s\n",val);
1371#endif
1372              xmlFree(val);
1373            }
1374#ifdef POST_DEBUG
1375            fprintf(stderr,"Parse Header and Body from Reference \n");
1376#endif
1377            xmlNodePtr cur3=cur2->children;
1378            hInternet.header=NULL;
1379            while(cur3){
1380              while(cur3!=NULL && cur3->type!=XML_ELEMENT_NODE)
1381                cur2=cur3->next;
1382              if(xmlStrcasecmp(cur3->name,BAD_CAST "Header")==0 ){
1383                const char *ha[2];
1384                ha[0]="key";
1385                ha[1]="value";
1386                int hai;
1387                char *has;
1388                char *key;
1389                for(hai=0;hai<2;hai++){
1390                  xmlChar *val=xmlGetProp(cur3,BAD_CAST ha[hai]);
1391#ifdef POST_DEBUG
1392                  fprintf(stderr,"%s = %s\n",ha[hai],(char*)val);
1393#endif
1394                  if(hai==0){
1395                    key=(char*)malloc((1+strlen((char*)val))*sizeof(char));
1396                    snprintf(key,1+strlen((char*)val),"%s",(char*)val);
1397                  }else{
1398                    has=(char*)malloc((3+strlen((char*)val)+strlen(key))*sizeof(char));
1399                    if(has == NULL){
1400                      return errorException(m, _("Unable to allocate memory."), "InternalError");
1401                    }
1402                    snprintf(has,(3+strlen((char*)val)+strlen(key)),"%s: %s",key,(char*)val);
1403#ifdef POST_DEBUG
1404                    fprintf(stderr,"%s\n",has);
1405#endif
1406                  }
1407                }
1408                hInternet.header=curl_slist_append(hInternet.header, has);
1409                free(has);
1410              }
1411              else{
1412#ifdef POST_DEBUG
1413                fprintf(stderr,"Try to fetch the body part of the request ...\n");
1414#endif
1415                if(xmlStrcasecmp(cur3->name,BAD_CAST "Body")==0 ){
1416#ifdef POST_DEBUG
1417                  fprintf(stderr,"Body part found !!!\n",(char*)cur3->content);
1418#endif
1419                  char *tmp=new char[cgiContentLength];
1420                  memset(tmp,0,cgiContentLength);
1421                  xmlNodePtr cur4=cur3->children;
1422                  while(cur4!=NULL){
1423                    while(cur4->type!=XML_ELEMENT_NODE)
1424                      cur4=cur4->next;
1425                    xmlDocPtr bdoc = xmlNewDoc(BAD_CAST "1.0");
1426                    bdoc->encoding = xmlCharStrdup ("UTF-8");
1427                    xmlDocSetRootElement(bdoc,cur4);
1428                    xmlChar* btmps;
1429                    int bsize;
1430                    xmlDocDumpMemory(bdoc,&btmps,&bsize);
1431#ifdef POST_DEBUG
1432                    fprintf(stderr,"Body part found !!! %s %s\n",tmp,(char*)btmps);
1433#endif
1434                    if(btmps!=NULL)
1435                      sprintf(tmp,"%s",(char*)btmps);
1436                    xmlFreeDoc(bdoc);
1437                    cur4=cur4->next;
1438                  }
1439                  map *btmp=getMap(tmpmaps->content,"href");
1440                  if(btmp!=NULL){
1441#ifdef POST_DEBUG
1442                    fprintf(stderr,"%s %s\n",btmp->value,tmp);
1443                    curl_easy_setopt(hInternet.handle, CURLOPT_VERBOSE, 1);
1444#endif
1445                    res=InternetOpenUrl(hInternet,btmp->value,tmp,strlen(tmp),
1446                                        INTERNET_FLAG_NO_CACHE_WRITE,0);
1447                    char* tmpContent = (char*)malloc((res.nDataLen+1)*sizeof(char));
1448                    if(tmpContent == NULL){
1449                      return errorException(m, _("Unable to allocate memory."), "InternalError");
1450                    }
1451                    size_t dwRead;
1452                    InternetReadFile(res, (LPVOID)tmpContent,
1453                                     res.nDataLen, &dwRead);
1454                    tmpContent[res.nDataLen]=0;
1455                    if(hInternet.header!=NULL)
1456                      curl_slist_free_all(hInternet.header);
1457                    addToMap(tmpmaps->content,"value",tmpContent);
1458#ifdef POST_DEBUG
1459                    fprintf(stderr,"DL CONTENT : (%s)\n",tmpContent);
1460#endif
1461                  }
1462                }
1463                else
1464                  if(xmlStrcasecmp(cur3->name,BAD_CAST "BodyReference")==0 ){
1465                    xmlChar *val=xmlGetProp(cur3,BAD_CAST "href");
1466                    HINTERNET bInternet,res1;
1467                    bInternet=InternetOpen(
1468#ifndef WIN32
1469                                           (LPCTSTR)
1470#endif
1471                                           "ZooWPSClient\0",
1472                                           INTERNET_OPEN_TYPE_PRECONFIG,
1473                                           NULL,NULL, 0);
1474                    if(!CHECK_INET_HANDLE(bInternet))
1475                      fprintf(stderr,"WARNING : hInternet handle failed to initialize");
1476#ifdef POST_DEBUG
1477                    curl_easy_setopt(bInternet.handle, CURLOPT_VERBOSE, 1);
1478#endif
1479                    res1=InternetOpenUrl(bInternet,(char*)val,NULL,0,
1480                                         INTERNET_FLAG_NO_CACHE_WRITE,0);
1481                    char* tmp=
1482                      (char*)malloc((res1.nDataLen+1)*sizeof(char));
1483                    if(tmp == NULL){
1484                      return errorException(m, _("Unable to allocate memory."), "InternalError");
1485                    }
1486                    size_t bRead;
1487                    InternetReadFile(res1, (LPVOID)tmp,
1488                                     res1.nDataLen, &bRead);
1489                    tmp[res1.nDataLen]=0;
1490                    InternetCloseHandle(bInternet);
1491                    map *btmp=getMap(tmpmaps->content,"href");
1492                    if(btmp!=NULL){
1493#ifdef POST_DEBUG
1494                      fprintf(stderr,"%s %s\n",btmp->value,tmp);
1495                      curl_easy_setopt(hInternet.handle, CURLOPT_VERBOSE, 1);
1496#endif
1497                      res=InternetOpenUrl(hInternet,btmp->value,tmp,
1498                                          strlen(tmp),
1499                                          INTERNET_FLAG_NO_CACHE_WRITE,0);
1500                      char* tmpContent = (char*)malloc((res.nDataLen+1)*sizeof(char));
1501                      if(tmpContent == NULL){
1502                        return errorException(m, _("Unable to allocate memory."), "InternalError");
1503                      }
1504                      size_t dwRead;
1505                      InternetReadFile(res, (LPVOID)tmpContent,
1506                                       res.nDataLen, &dwRead);
1507                      tmpContent[res.nDataLen]=0;
1508                      if(hInternet.header!=NULL)
1509                        curl_slist_free_all(hInternet.header);
1510                      addToMap(tmpmaps->content,"value",tmpContent);
1511#ifdef POST_DEBUG
1512                      fprintf(stderr,"DL CONTENT : (%s)\n",tmpContent);
1513#endif
1514                    }
1515                  }
1516              }
1517              cur3=cur3->next;
1518            }
1519#ifdef POST_DEBUG
1520            fprintf(stderr,"Header and Body was parsed from Reference \n");
1521#endif
1522#ifdef DEBUG
1523            dumpMap(tmpmaps->content);
1524            fprintf(stderr, "= element 2 node \"%s\" = (%s)\n", 
1525                    cur2->name,cur2->content);
1526#endif
1527          }
1528          else if(xmlStrcasecmp(cur2->name,BAD_CAST "Data")==0){
1529#ifdef DEBUG
1530            fprintf(stderr,"DATA\n");
1531#endif
1532            xmlNodePtr cur4=cur2->children;
1533            while(cur4!=NULL){
1534              while(cur4!=NULL &&cur4->type!=XML_ELEMENT_NODE)
1535                cur4=cur4->next;
1536              if(cur4==NULL)
1537                break;
1538              if(xmlStrcasecmp(cur4->name, BAD_CAST "LiteralData")==0){
1539                /**
1540                 * Get every attribute from a LiteralData node
1541                 * dataType , uom
1542                 */
1543                char *list[2];
1544                list[0]=strdup("dataType");
1545                list[1]=strdup("uom");
1546                for(int l=0;l<2;l++){
1547#ifdef DEBUG
1548                  fprintf(stderr,"*** LiteralData %s ***",list[l]);
1549#endif
1550                  xmlChar *val=xmlGetProp(cur4,BAD_CAST list[l]);
1551                  if(val!=NULL && strlen((char*)val)>0){
1552                    if(tmpmaps->content!=NULL)
1553                      addToMap(tmpmaps->content,list[l],(char*)val);
1554                    else
1555                      tmpmaps->content=createMap(list[l],(char*)val);
1556#ifdef DEBUG
1557                    fprintf(stderr,"%s\n",val);
1558#endif
1559                  }
1560                  xmlFree(val);
1561                  free(list[l]);                 
1562                }
1563              }
1564              else if(xmlStrcasecmp(cur4->name, BAD_CAST "ComplexData")==0){
1565                /**
1566                 * Get every attribute from a Reference node
1567                 * mimeType, encoding, schema
1568                 */
1569                const char *coms[3]={"mimeType","encoding","schema"};
1570                for(int l=0;l<3;l++){
1571#ifdef DEBUG
1572                  fprintf(stderr,"*** ComplexData %s ***\n",coms[l]);
1573#endif
1574                  xmlChar *val=xmlGetProp(cur4,BAD_CAST coms[l]);
1575                  if(val!=NULL && strlen((char*)val)>0){
1576                    if(tmpmaps->content!=NULL)
1577                      addToMap(tmpmaps->content,coms[l],(char*)val);
1578                    else
1579                      tmpmaps->content=createMap(coms[l],(char*)val);
1580#ifdef DEBUG
1581                    fprintf(stderr,"%s\n",val);
1582#endif
1583                  }
1584                  xmlFree(val);
1585                }
1586              }
1587
1588              map* test=getMap(tmpmaps->content,"encoding");
1589              if(test==NULL){
1590                if(tmpmaps->content!=NULL)
1591                  addToMap(tmpmaps->content,"encoding","utf-8");
1592                else
1593                  tmpmaps->content=createMap("encoding","utf-8");
1594                test=getMap(tmpmaps->content,"encoding");
1595              }
1596
1597              if(strcasecmp(test->value,"base64")!=0){
1598                xmlChar* mv=xmlNodeListGetString(doc,cur4->xmlChildrenNode,1);
1599                map* ltmp=getMap(tmpmaps->content,"mimeType");
1600                if(mv==NULL || 
1601                   (xmlStrcasecmp(cur4->name, BAD_CAST "ComplexData")==0 &&
1602                    (ltmp==NULL || strncasecmp(ltmp->value,"text/xml",8)==0) )){
1603                  xmlDocPtr doc1=xmlNewDoc(BAD_CAST "1.0");
1604                  int buffersize;
1605                  xmlNodePtr cur5=cur4->children;
1606                  while(cur5!=NULL &&cur5->type!=XML_ELEMENT_NODE)
1607                    cur5=cur5->next;
1608                  xmlDocSetRootElement(doc1,cur5);
1609                  xmlDocDumpFormatMemoryEnc(doc1, &mv, &buffersize, "utf-8", 1);
1610                  char size[1024];
1611                  sprintf(size,"%d",buffersize);
1612                  addToMap(tmpmaps->content,"size",size);
1613                }
1614                addToMap(tmpmaps->content,"value",(char*)mv);
1615                xmlFree(mv);
1616              }else{
1617                xmlChar* tmp=xmlNodeListGetRawString(doc,cur4->xmlChildrenNode,0);
1618                addToMap(tmpmaps->content,"value",(char*)tmp);
1619                map* tmpv=getMap(tmpmaps->content,"value");
1620                char *res=NULL;
1621                char *curs=tmpv->value;
1622                for(int i=0;i<=strlen(tmpv->value)/64;i++) {
1623                  if(res==NULL)
1624                    res=(char*)malloc(67*sizeof(char));
1625                  else
1626                    res=(char*)realloc(res,(((i+1)*65)+i)*sizeof(char));
1627                  int csize=i*65;
1628                  strncpy(res + csize,curs,64);
1629                  if(i==xmlStrlen(tmp)/64)
1630                    strcat(res,"\n\0");
1631                  else{
1632                    strncpy(res + (((i+1)*64)+i),"\n\0",2);
1633                    curs+=64;
1634                  }
1635                }
1636                free(tmpv->value);
1637                tmpv->value=strdup(res);
1638                free(res);
1639                xmlFree(tmp);
1640              }
1641              cur4=cur4->next;
1642            }
1643          }
1644#ifdef DEBUG
1645          fprintf(stderr,"cur2 next \n");
1646          fflush(stderr);
1647#endif
1648          cur2=cur2->next;
1649        }
1650#ifdef DEBUG
1651        fprintf(stderr,"ADD MAPS TO REQUEST MAPS !\n");
1652        fflush(stderr);
1653#endif
1654
1655        {
1656          maps* testPresence=getMaps(request_input_real_format,tmpmaps->name);
1657          if(testPresence!=NULL){
1658            elements* elem=getElements(s1->inputs,tmpmaps->name);
1659            if(elem!=NULL){
1660              if(appendMapsToMaps(m,request_input_real_format,tmpmaps,elem)<0){
1661                freeMaps(&m);
1662                free(m);
1663                free(REQUEST);
1664                free(SERVICE_URL);
1665                InternetCloseHandle(hInternet);
1666                freeService(&s1);
1667                free(s1);
1668                return 0;
1669              }
1670            }
1671          }
1672          else
1673            addMapsToMaps(&request_input_real_format,tmpmaps);
1674        }
1675       
1676#ifdef DEBUG
1677        fprintf(stderr,"******TMPMAPS*****\n");
1678        dumpMaps(tmpmaps);
1679        fprintf(stderr,"******REQUESTMAPS*****\n");
1680        dumpMaps(request_input_real_format);
1681#endif
1682        freeMaps(&tmpmaps);
1683        free(tmpmaps);
1684        tmpmaps=NULL;         
1685      }
1686#ifdef DEBUG
1687      dumpMaps(tmpmaps); 
1688#endif
1689    }
1690#ifdef DEBUG
1691    fprintf(stderr,"Search for response document node\n");
1692#endif
1693    xmlXPathFreeObject(tmpsptr);
1694   
1695    tmpsptr=extractFromDoc(doc,"/*/*/*[local-name()='ResponseDocument']");
1696    bool asRaw=false;
1697    tmps=tmpsptr->nodesetval;
1698    if(tmps->nodeNr==0){
1699      tmpsptr=extractFromDoc(doc,"/*/*/*[local-name()='RawDataOutput']");
1700      tmps=tmpsptr->nodesetval;
1701      asRaw=true;
1702    }
1703#ifdef DEBUG
1704    fprintf(stderr,"*****%d*****\n",tmps->nodeNr);
1705#endif
1706    for(int k=0;k<tmps->nodeNr;k++){
1707      if(asRaw==true)
1708        addToMap(request_inputs,"RawDataOutput","");
1709      else
1710        addToMap(request_inputs,"ResponseDocument","");
1711      maps *tmpmaps=NULL;
1712      xmlNodePtr cur=tmps->nodeTab[k];
1713      if(cur->type == XML_ELEMENT_NODE) {
1714        /**
1715         * A specific responseDocument node.
1716         */
1717        if(tmpmaps==NULL){
1718          tmpmaps=(maps*)malloc(MAPS_SIZE);
1719          if(tmpmaps == NULL){
1720            return errorException(m, _("Unable to allocate memory."), "InternalError");
1721          }
1722          tmpmaps->name=strdup("unknownIdentifier");
1723          tmpmaps->content=NULL;
1724          tmpmaps->next=NULL;
1725        }
1726        /**
1727         * Get every attribute: storeExecuteResponse, lineage, status
1728         */
1729        const char *ress[3]={"storeExecuteResponse","lineage","status"};
1730        xmlChar *val;
1731        for(int l=0;l<3;l++){
1732#ifdef DEBUG
1733          fprintf(stderr,"*** %s ***\t",ress[l]);
1734#endif
1735          val=xmlGetProp(cur,BAD_CAST ress[l]);
1736          if(val!=NULL && strlen((char*)val)>0){
1737            if(tmpmaps->content!=NULL)
1738              addToMap(tmpmaps->content,ress[l],(char*)val);
1739            else
1740              tmpmaps->content=createMap(ress[l],(char*)val);
1741            addToMap(request_inputs,ress[l],(char*)val);
1742          }
1743#ifdef DEBUG
1744          fprintf(stderr,"%s\n",val);
1745#endif
1746          xmlFree(val);
1747        }
1748        xmlNodePtr cur1=cur->children;
1749        while(cur1!=NULL && cur1->type != XML_ELEMENT_NODE)
1750          cur1=cur1->next;
1751        while(cur1){
1752          /**
1753           * Indentifier
1754           */
1755          if(xmlStrncasecmp(cur1->name,BAD_CAST "Identifier",xmlStrlen(cur1->name))==0){
1756            xmlChar *val=
1757              xmlNodeListGetString(doc,cur1->xmlChildrenNode,1);
1758            if(tmpmaps==NULL){
1759              tmpmaps=(maps*)malloc(MAPS_SIZE);
1760              if(tmpmaps == NULL){
1761                return errorException(m, _("Unable to allocate memory."), "InternalError");
1762              }
1763              tmpmaps->name=strdup((char*)val);
1764              tmpmaps->content=NULL;
1765              tmpmaps->next=NULL;
1766            }
1767            else{
1768              //free(tmpmaps->name);
1769              tmpmaps->name=strdup((char*)val);
1770            }
1771            xmlFree(val);
1772          }
1773          /**
1774           * Title, Asbtract
1775           */
1776          else if(xmlStrncasecmp(cur1->name,BAD_CAST "Title",xmlStrlen(cur1->name))==0 ||
1777                  xmlStrncasecmp(cur1->name,BAD_CAST "Abstract",xmlStrlen(cur1->name))==0){
1778            xmlChar *val=
1779              xmlNodeListGetString(doc,cur1->xmlChildrenNode,1);
1780            if(tmpmaps==NULL){
1781              tmpmaps=(maps*)malloc(MAPS_SIZE);
1782              if(tmpmaps == NULL){
1783                return errorException(m, _("Unable to allocate memory."), "InternalError");
1784              }
1785              tmpmaps->name=strdup("missingIndetifier");
1786              tmpmaps->content=createMap((char*)cur1->name,(char*)val);
1787              tmpmaps->next=NULL;
1788            }
1789            else{
1790              if(tmpmaps->content!=NULL)
1791                addToMap(tmpmaps->content,(char*)cur1->name,(char*)val);
1792              else
1793                tmpmaps->content=createMap((char*)cur1->name,(char*)val);
1794            }
1795            xmlFree(val);
1796          }
1797          else if(xmlStrncasecmp(cur1->name,BAD_CAST "Output",xmlStrlen(cur1->name))==0){
1798            /**
1799             * Get every attribute from a Output node
1800             * mimeType, encoding, schema, uom, asReference
1801             */
1802            const char *outs[5]={"mimeType","encoding","schema","uom","asReference"};
1803            for(int l=0;l<5;l++){
1804#ifdef DEBUG
1805              fprintf(stderr,"*** %s ***\t",outs[l]);
1806#endif
1807              val=xmlGetProp(cur1,BAD_CAST outs[l]);
1808              if(val!=NULL && strlen((char*)val)>0){
1809                if(tmpmaps->content!=NULL)
1810                  addToMap(tmpmaps->content,outs[l],(char*)val);
1811                else
1812                  tmpmaps->content=createMap(outs[l],(char*)val);
1813              }
1814#ifdef DEBUG
1815              fprintf(stderr,"%s\n",val);
1816#endif
1817              xmlFree(val);
1818            }
1819            xmlNodePtr cur2=cur1->children;
1820            while(cur2!=NULL && cur2->type != XML_ELEMENT_NODE)
1821              cur2=cur2->next;
1822            while(cur2){
1823              /**
1824               * Indentifier
1825               */
1826              if(xmlStrncasecmp(cur2->name,BAD_CAST "Identifier",xmlStrlen(cur2->name))==0){
1827                xmlChar *val=
1828                  xmlNodeListGetString(doc,cur2->xmlChildrenNode,1);
1829                if(tmpmaps==NULL){
1830                  tmpmaps=(maps*)malloc(MAPS_SIZE);
1831                  if(tmpmaps == NULL){
1832                    return errorException(m, _("Unable to allocate memory."), "InternalError");
1833                  }
1834                  tmpmaps->name=strdup((char*)val);
1835                  tmpmaps->content=NULL;
1836                  tmpmaps->next=NULL;
1837                }
1838                else{
1839                  if(tmpmaps->name!=NULL)
1840                    free(tmpmaps->name);
1841                  tmpmaps->name=strdup((char*)val);;
1842                }
1843                xmlFree(val);
1844              }
1845              /**
1846               * Title, Asbtract
1847               */
1848              else if(xmlStrncasecmp(cur2->name,BAD_CAST "Title",xmlStrlen(cur2->name))==0 ||
1849                      xmlStrncasecmp(cur2->name,BAD_CAST "Abstract",xmlStrlen(cur2->name))==0){
1850                xmlChar *val=
1851                  xmlNodeListGetString(doc,cur2->xmlChildrenNode,1);
1852                if(tmpmaps==NULL){
1853                  tmpmaps=(maps*)malloc(MAPS_SIZE);
1854                  if(tmpmaps == NULL){
1855                    return errorException(m, _("Unable to allocate memory."), "InternalError");
1856                  }
1857                  tmpmaps->name=strdup("missingIndetifier");
1858                  tmpmaps->content=createMap((char*)cur2->name,(char*)val);
1859                  tmpmaps->next=NULL;
1860                }
1861                else{
1862                  if(tmpmaps->content!=NULL)
1863                    addToMap(tmpmaps->content,
1864                             (char*)cur2->name,(char*)val);
1865                  else
1866                    tmpmaps->content=
1867                      createMap((char*)cur2->name,(char*)val);
1868                }
1869                xmlFree(val);
1870              }
1871              if(request_output_real_format==NULL)
1872                request_output_real_format=dupMaps(&tmpmaps);
1873              else
1874                addMapsToMaps(&request_output_real_format,tmpmaps);
1875              cur2=cur2->next;
1876              while(cur2!=NULL && cur2->type != XML_ELEMENT_NODE)
1877                cur2=cur2->next;
1878            }
1879          }
1880          cur1=cur1->next;
1881          while(cur1!=NULL && cur1->type != XML_ELEMENT_NODE)
1882            cur1=cur1->next;
1883        }
1884      }
1885      if(tmpmaps!=NULL){
1886        freeMaps(&tmpmaps);
1887        free(tmpmaps);
1888        tmpmaps=NULL;
1889      }
1890    }
1891    xmlXPathFreeObject(tmpsptr);
1892    xmlCleanupParser();
1893  }
1894 
1895  //if(CHECK_INET_HANDLE(hInternet))
1896  InternetCloseHandle(hInternet);
1897
1898#ifdef DEBUG
1899  fprintf(stderr,"\n%d\n",__LINE__);
1900  fflush(stderr);
1901  dumpMaps(request_input_real_format);
1902  dumpMaps(request_output_real_format);
1903  dumpMap(request_inputs);
1904  fprintf(stderr,"\n%d\n",__LINE__);
1905  fflush(stderr);
1906#endif
1907
1908  /**
1909   * Ensure that each requested arguments are present in the request
1910   * DataInputs and ResponseDocument / RawDataOutput
1911   */
1912  char *dfv=addDefaultValues(&request_input_real_format,s1->inputs,m,0);
1913  char *dfv1=addDefaultValues(&request_output_real_format,s1->outputs,m,1);
1914  if(strcmp(dfv1,"")!=0 || strcmp(dfv,"")!=0){
1915    char tmps[1024];
1916    if(strcmp(dfv,"")!=0){
1917      snprintf(tmps,1024,_("The <%s> argument was not specified in DataInputs but defined as requested in ZOO ServicesProvider configuration file, please correct your query or the ZOO Configuration file."),dfv);
1918    }
1919    else if(strcmp(dfv1,"")!=0){
1920      snprintf(tmps,1024,_("The <%s> argument was specified as Output identifier but not defined in the ZOO Configuration File. Please, correct your query or the ZOO Configuration File."),dfv1);
1921    }
1922    map* tmpe=createMap("text",tmps);
1923    addToMap(tmpe,"code","MissingParameterValue");
1924    printExceptionReportResponse(m,tmpe);
1925    freeService(&s1);
1926    free(s1);
1927    freeMap(&tmpe);
1928    free(tmpe);
1929    freeMaps(&m);
1930    free(m);
1931    free(REQUEST);
1932    free(SERVICE_URL);
1933    freeMaps(&request_input_real_format);
1934    free(request_input_real_format);
1935    freeMaps(&request_output_real_format);
1936    free(request_output_real_format);
1937    freeMaps(&tmpmaps);
1938    free(tmpmaps);
1939    return 1;
1940  }
1941  maps* tmpReqI=request_input_real_format;
1942  while(tmpReqI!=NULL){
1943    char name[1024];
1944    if(getMap(tmpReqI->content,"isFile")!=NULL){
1945      if (cgiFormFileName(tmpReqI->name, name, sizeof(name)) == cgiFormSuccess) {
1946        int BufferLen=1024;
1947        cgiFilePtr file;
1948        int targetFile;
1949        mode_t mode;
1950        char storageNameOnServer[2048];
1951        char fileNameOnServer[64];
1952        char contentType[1024];
1953        char buffer[1024];
1954        char *tmpStr=NULL;
1955        int size;
1956        int got,t;
1957        map *path=getMapFromMaps(m,"main","tmpPath");
1958        cgiFormFileSize(tmpReqI->name, &size);
1959        cgiFormFileContentType(tmpReqI->name, contentType, sizeof(contentType));
1960        if (cgiFormFileOpen(tmpReqI->name, &file) == cgiFormSuccess) {
1961          t=-1;
1962          while(1){
1963            tmpStr=strstr(name+t+1,"\\");
1964            if(NULL==tmpStr)
1965              tmpStr=strstr(name+t+1,"/");
1966            if(NULL!=tmpStr)
1967              t=(int)(tmpStr-name);
1968            else
1969              break;
1970          }
1971          strcpy(fileNameOnServer,name+t+1);
1972         
1973          sprintf(storageNameOnServer,"%s/%s",path->value,fileNameOnServer);
1974          printf("\n\nName on server %s\n",storageNameOnServer);
1975#ifdef DEBUG
1976          fprintf(stderr,"Name on server %s\n",storageNameOnServer);
1977          fprintf(stderr,"fileNameOnServer: %s\n",fileNameOnServer);
1978#endif
1979          mode=S_IRWXU|S_IRGRP|S_IROTH;
1980          targetFile = open (storageNameOnServer,O_RDWR|O_CREAT|O_TRUNC,S_IRWXU|S_IRGRP|S_IROTH);
1981          if(targetFile<0){
1982#ifdef DEBUG
1983            fprintf(stderr,"could not create the new file,%s\n",fileNameOnServer);         
1984#endif
1985          }else{
1986            while (cgiFormFileRead(file, buffer, BufferLen, &got) ==cgiFormSuccess){
1987              if(got>0)
1988                write(targetFile,buffer,got);
1989            }
1990          }
1991          addToMap(tmpReqI->content,"lref",storageNameOnServer);
1992          cgiFormFileClose(file);
1993          close(targetFile);
1994#ifdef DEBUG
1995          fprintf(stderr,"File \"%s\" has been uploaded",fileNameOnServer);
1996#endif
1997        }
1998      }
1999    }
2000    tmpReqI=tmpReqI->next;
2001  }
2002
2003  ensureDecodedBase64(&request_input_real_format);
2004
2005#ifdef DEBUG
2006  fprintf(stderr,"REQUEST_INPUTS\n");
2007  dumpMaps(request_input_real_format);
2008  fprintf(stderr,"REQUEST_OUTPUTS\n");
2009  dumpMaps(request_output_real_format);
2010#endif
2011
2012  maps* curs=getMaps(m,"env");
2013  if(curs!=NULL){
2014    map* mapcs=curs->content;
2015    while(mapcs!=NULLMAP){
2016#ifndef WIN32
2017      setenv(mapcs->name,mapcs->value,1);
2018#else
2019#ifdef DEBUG
2020      fprintf(stderr,"[ZOO: setenv (%s=%s)]\n",mapcs->name,mapcs->value);
2021#endif
2022      if(mapcs->value[strlen(mapcs->value)-2]=='\r'){
2023#ifdef DEBUG
2024        fprintf(stderr,"[ZOO: Env var finish with \r]\n");
2025#endif
2026        mapcs->value[strlen(mapcs->value)-1]=0;
2027      }
2028#ifdef DEBUG
2029      fflush(stderr);
2030      fprintf(stderr,"setting variable... %s\n",(
2031#endif
2032              SetEnvironmentVariable(mapcs->name,mapcs->value)
2033#ifdef DEBUG
2034              ==0)? "OK" : "FAILED");
2035#else
2036      ;
2037#endif
2038          char* toto=(char*)malloc((strlen(mapcs->name)+strlen(mapcs->value)+2)*sizeof(char));
2039      sprintf(toto,"%s=%s",mapcs->name,mapcs->value);
2040          putenv(toto);
2041#ifdef DEBUG
2042      fflush(stderr);
2043#endif
2044#endif
2045#ifdef DEBUG
2046      fprintf(stderr,"[ZOO: setenv (%s=%s)]\n",mapcs->name,mapcs->value);
2047      fflush(stderr);
2048#endif
2049      mapcs=mapcs->next;
2050    }
2051  }
2052 
2053#ifdef DEBUG
2054  dumpMap(request_inputs);
2055#endif
2056
2057  /**
2058   * Need to check if we need to fork to load a status enabled
2059   */
2060  r_inputs=NULL;
2061  map* store=getMap(request_inputs,"storeExecuteResponse");
2062  map* status=getMap(request_inputs,"status");
2063  /**
2064   * 05-007r7 WPS 1.0.0 page 57 :
2065   * 'If status="true" and storeExecuteResponse is "false" then the service
2066   * shall raise an exception.'
2067   */
2068  if(status!=NULL && strcmp(status->value,"true")==0 && 
2069     store!=NULL && strcmp(store->value,"false")==0){
2070    errorException(m, _("Status cannot be set to true with storeExecuteResponse to false. Please, modify your request parameters."), "InvalidParameterValue");
2071    freeService(&s1);
2072    free(s1);
2073    freeMaps(&m);
2074    free(m);
2075   
2076    freeMaps(&request_input_real_format);
2077    free(request_input_real_format);
2078   
2079    freeMaps(&request_output_real_format);
2080    free(request_output_real_format);
2081   
2082    free(REQUEST);
2083    free(SERVICE_URL);
2084    return 1;
2085  }
2086  r_inputs=getMap(request_inputs,"storeExecuteResponse");
2087  int eres=SERVICE_STARTED;
2088  int cpid=getpid();
2089
2090  maps *_tmpMaps=(maps*)malloc(MAPS_SIZE);
2091  _tmpMaps->name=strdup("lenv");
2092  char tmpBuff[100];
2093  sprintf(tmpBuff,"%i",cpid);
2094  _tmpMaps->content=createMap("sid",tmpBuff);
2095  _tmpMaps->next=NULL;
2096  addToMap(_tmpMaps->content,"status","0");
2097  addToMap(_tmpMaps->content,"cwd",ntmp);
2098  map* ltmp=getMap(request_inputs,"soap");
2099  if(ltmp!=NULL)
2100    addToMap(_tmpMaps->content,"soap",ltmp->value);
2101  else
2102    addToMap(_tmpMaps->content,"soap","false");
2103  if(cgiCookie!=NULL && strlen(cgiCookie)>0){
2104    char *tcook=strdup(cgiCookie);
2105    if(strstr(cgiCookie,";")>0){
2106      char *token,*saveptr;
2107      token=strtok_r(cgiCookie,";",&saveptr);
2108      while(token!=NULL){
2109        if(strcasestr(token,"ID")!=NULL){
2110          if(tcook!=NULL)
2111            free(tcook);
2112          tcook=strdup(token);
2113        }
2114        token=strtok_r(NULL,";",&saveptr);
2115      }
2116    }
2117    addToMap(_tmpMaps->content,"sessid",strstr(tcook,"=")+1);
2118    char session_file_path[1024];
2119    map *tmpPath=getMapFromMaps(m,"main","sessPath");
2120    if(tmpPath==NULL)
2121      tmpPath=getMapFromMaps(m,"main","tmpPath");
2122    char *tmp1=strtok(tcook,";");
2123    if(tmp1!=NULL)
2124      sprintf(session_file_path,"%s/sess_%s.cfg",tmpPath->value,strstr(tmp1,"=")+1);
2125    else
2126      sprintf(session_file_path,"%s/sess_%s.cfg",tmpPath->value,strstr(cgiCookie,"=")+1);
2127    free(tcook);
2128    maps *tmpSess=(maps*)malloc(MAPS_SIZE);
2129    struct stat file_status;
2130    int istat = stat(session_file_path, &file_status);
2131    if(istat==0 && file_status.st_size>0){
2132      conf_read(session_file_path,tmpSess);
2133      addMapsToMaps(&m,tmpSess);
2134      freeMaps(&tmpSess);
2135    }
2136    free(tmpSess);
2137  }
2138  addMapsToMaps(&m,_tmpMaps);
2139  freeMaps(&_tmpMaps);
2140  free(_tmpMaps);
2141
2142#ifdef DEBUG
2143  dumpMap(request_inputs);
2144#endif
2145#ifdef WIN32
2146  char *cgiSidL=NULL;
2147  if(getenv("CGISID")!=NULL)
2148    addToMap(request_inputs,"cgiSid",getenv("CGISID"));
2149  map* test1=getMap(request_inputs,"cgiSid");
2150  if(test1!=NULL){
2151    cgiSid=test1->value;
2152    addToMap(request_inputs,"storeExecuteResponse","true");
2153    addToMap(request_inputs,"status","true");
2154    setMapInMaps(m,"lenv","sid",test1->value);
2155    status=getMap(request_inputs,"status");
2156    printf("cgiSid %s\n",cgiSid);
2157  }
2158#endif
2159  int hrstd=-1;
2160  char *fbkp,*fbkp1;
2161  FILE *f0,*f1;
2162  if(status!=NULL)
2163    if(strcasecmp(status->value,"false")==0)
2164      status=NULLMAP;
2165  if(status==NULLMAP){
2166    loadServiceAndRun(&m,s1,request_inputs,&request_input_real_format,&request_output_real_format,&eres);
2167  }
2168  else{
2169    int   pid;
2170#ifdef DEBUG
2171    fprintf(stderr,"\nPID : %d\n",cpid);
2172#endif
2173
2174#ifndef WIN32
2175    pid = fork ();
2176#else
2177    if(cgiSid==NULL){
2178      createProcess(m,request_inputs,s1,NULL,cpid,request_input_real_format,request_output_real_format);
2179      pid = cpid;
2180    }else{
2181      pid=0;
2182      cpid=atoi(cgiSid);
2183      printf("cgiSid %s\n",cgiSid);
2184    }
2185    //printf("pid cpid %d %d\n",pid,cpid);
2186    //fflush(stderr);
2187#endif
2188    if (pid > 0) {
2189      /**
2190       * dady :
2191       * set status to SERVICE_ACCEPTED
2192       */
2193#ifdef DEBUG
2194      fprintf(stderr,"father pid continue (origin %d) %d ...\n",cpid,getpid());
2195#endif
2196      eres=SERVICE_ACCEPTED;
2197    }else if (pid == 0) {
2198      /**
2199       * son : have to close the stdout, stdin and stderr to let the parent
2200       * process answer to http client.
2201       */
2202      r_inputs=getMapFromMaps(m,"main","tmpPath");
2203      map* r_inputs1=getMap(s1->content,"ServiceProvider");
2204      fbkp=(char*)malloc((strlen(r_inputs->value)+strlen(r_inputs1->value)+1024)*sizeof(char));
2205      sprintf(fbkp,"%s/%s_%d.xml",r_inputs->value,r_inputs1->value,cpid);
2206      char* flog=(char*)malloc((strlen(r_inputs->value)+strlen(r_inputs1->value)+1024)*sizeof(char));
2207      sprintf(flog,"%s/%s_%d_error.log",r_inputs->value,r_inputs1->value,cpid);
2208#ifdef DEBUG
2209      fprintf(stderr,"RUN IN BACKGROUND MODE \n");
2210      fprintf(stderr,"son pid continue (origin %d) %d ...\n",cpid,getpid());
2211      fprintf(stderr,"\nFILE TO STORE DATA %s\n",r_inputs->value);
2212#endif
2213      freopen(flog,"w+",stderr);
2214      f0=freopen(fbkp , "w+", stdout);
2215      fclose(stdin);
2216      free(flog);
2217      /**
2218       * set status to SERVICE_STARTED and flush stdout to ensure full
2219       * content was outputed (the file used to store the ResponseDocument).
2220       * The rewind stdout to restart writing from the bgining of the file,
2221       * this way the data will be updated at the end of the process run.
2222       */
2223      printProcessResponse(m,request_inputs,cpid,
2224                           s1,r_inputs1->value,SERVICE_STARTED,
2225                           request_input_real_format,
2226                           request_output_real_format);
2227#ifndef WIN32
2228      fflush(stdout);
2229      rewind(stdout);
2230#else
2231#endif
2232      fbkp1=(char*)malloc((strlen(r_inputs->value)+strlen(r_inputs1->value)+1024)*sizeof(char));
2233      sprintf(fbkp1,"%s/%s_final_%d.xml",r_inputs->value,r_inputs1->value,cpid);
2234      f1=freopen(fbkp1 , "w+", stdout);
2235      loadServiceAndRun(&m,s1,request_inputs,&request_input_real_format,&request_output_real_format,&eres);
2236    } else {
2237      /**
2238       * error server don't accept the process need to output a valid
2239       * error response here !!!
2240       */
2241      eres=-1;
2242      errorException(m, _("Unable to run the child process properly"), "InternalError");
2243    }
2244  }
2245
2246#ifdef DEBUG
2247  dumpMaps(request_output_real_format);
2248#endif
2249  if(eres!=-1)
2250    outputResponse(s1,request_input_real_format,
2251                   request_output_real_format,request_inputs,
2252                   cpid,m,eres);
2253  fflush(stdout);
2254  /**
2255   * Ensure that if error occurs when freeing memory, no signal will return
2256   * an ExceptionReport document as the result was already returned to the
2257   * client.
2258   */
2259#ifndef USE_GDB
2260  (void) signal(SIGSEGV,donothing);
2261  (void) signal(SIGTERM,donothing);
2262  (void) signal(SIGINT,donothing);
2263  (void) signal(SIGILL,donothing);
2264  (void) signal(SIGFPE,donothing);
2265  (void) signal(SIGABRT,donothing);
2266#endif
2267
2268  if(((int)getpid())!=cpid){
2269    fclose(stdout);
2270    fclose(stderr);
2271    unhandleStatus(m);
2272    /**
2273     * Dump back the final file fbkp1 to fbkp
2274     */
2275    fclose(f0);
2276    fclose(f1);
2277    FILE* f2=fopen(fbkp1,"rb");
2278    FILE* f3=fopen(fbkp,"wb+");
2279    free(fbkp);
2280    free(fbkp1);
2281    fseek(f2,0,SEEK_END);
2282    long flen=ftell(f2);
2283    fseek(f2,0,SEEK_SET);
2284    char *tmps1=(char*)malloc((flen+1)*sizeof(char));
2285    fread(tmps1,flen,1,f2);
2286    fwrite(tmps1,1,flen,f3);
2287    fclose(f2);
2288    fclose(f3);
2289  }
2290
2291  freeService(&s1);
2292  free(s1);
2293  freeMaps(&m);
2294  free(m);
2295 
2296  freeMaps(&request_input_real_format);
2297  free(request_input_real_format);
2298 
2299  freeMaps(&request_output_real_format);
2300  free(request_output_real_format);
2301 
2302  free(REQUEST);
2303  free(SERVICE_URL);
2304#ifdef DEBUG
2305  fprintf(stderr,"Processed response \n");
2306  fflush(stdout);
2307  fflush(stderr);
2308#endif
2309
2310  return 0;
2311}
2312
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