source: branches/prototype-v0/zoo-project/zoo-kernel/ulinet.c @ 890

Last change on this file since 890 was 890, checked in by djay, 5 years ago

Make this ZOO-Kernel working properly on windows platform again.

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc
File size: 21.5 KB
RevLine 
[579]1/*
[1]2 *  ulinet.c
3 *
4 * Author : Gérald FENOY
5 *
[579]6 * Copyright (c) 2008-2015 GeoLabs SARL
[1]7 *
8 * Permission is hereby granted, free of charge, to any person obtaining a copy
9 * of this software and associated documentation files (the "Software"), to deal
10 * in the Software without restriction, including without limitation the rights
11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 * copies of the Software, and to permit persons to whom the Software is
13 * furnished to do so, subject to the following conditions:
14 *
15 * The above copyright notice and this permission notice shall be included in
16 * all copies or substantial portions of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 * THE SOFTWARE.
25 *
26 */
27
28#define _ULINET
[490]29#define MAX_WAIT_MSECS 180*1000 /* Wait max. 180 seconds */
[1]30#include "ulinet.h"
[862]31#include "server_internal.h"
[1]32#include <assert.h>
[817]33#include <ctype.h>
[579]34
35/**
36 * Write the downloaded content to a _HINTERNET structure
37 *
38 * @param buffer the buffer to read
39 * @param size size of each member
40 * @param nmemb number of element to read
41 * @param data the _HINTERNET structure to write in
42 * @return the size red, -1 if buffer is NULL
43 */
[1]44size_t write_data_into(void *buffer, size_t size, size_t nmemb, void *data){
45  size_t realsize = size * nmemb;
[492]46  _HINTERNET *psInternet;
[93]47  if(buffer==NULL){
[1]48    buffer=NULL;
49    return -1;
50  }
[492]51  psInternet=(_HINTERNET *)data;
[1]52  if(psInternet->pabyData){
[446]53    psInternet->pabyData=(unsigned char*)realloc(psInternet->pabyData,psInternet->nDataLen+realsize+1);
[1]54    psInternet->nDataAlloc+=psInternet->nDataLen+realsize+1;
55  }
56  else{
[446]57    psInternet->pabyData=(unsigned char*)malloc(psInternet->nDataLen+realsize+1);
[1]58    psInternet->nDataAlloc=realsize+1;
59  }
60
61  if (psInternet->pabyData) {
62    memcpy( psInternet->pabyData + psInternet->nDataLen, buffer, realsize);
63    psInternet->nDataLen += realsize;
64    psInternet->pabyData[psInternet->nDataLen] = 0;
65  }
66
67  buffer=NULL;
68  return realsize;
69}
70
[579]71/**
[863]72 * Write the downloaded content in the file pouted by the _HINTERNET structure
[862]73 *
74 * @param buffer the buffer to read
75 * @param size size of each member
76 * @param nmemb number of element to read
77 * @param data the _HINTERNET structure to write in
78 * @return the size red, -1 if buffer is NULL
79 */
80size_t write_data_into_file(void *buffer, size_t size, size_t nmemb, void *data) 
81{ 
82   size_t realsize = size * nmemb;
83   int writen=0;
84   _HINTERNET *psInternet;
85   if(buffer==NULL){
86     buffer=NULL;
87     return -1;
88   }
89   psInternet=(_HINTERNET *)data;
90   writen+=fwrite(buffer, size, nmemb, psInternet->file);
[863]91   fflush(psInternet->file);
92   psInternet->nDataLen += realsize;
93
[862]94   buffer=NULL;
95   return realsize;
96}
97
98
99/**
[579]100 * In case of presence of "Set-Cookie" in the headers red, store the cookie
[839]101 * identifier in cookie
[579]102 *
103 * @param buffer the buffer to read
104 * @param size size of each member
105 * @param nmemb number of element to read
106 * @param data the _HINTERNET structure to write in
107 * @return the size red, -1 if buffer is NULL
[839]108 * @see cookie
[579]109 */
[1]110size_t header_write_data(void *buffer, size_t size, size_t nmemb, void *data){
[509]111  if(strncmp("Set-Cookie: ",(char*)buffer,12)==0){
[1]112    int i;
[492]113    char* tmp;
[1]114    for(i=0;i<12;i++)
115#ifndef WIN32
116      buffer++;
117#else
118        ;
119#endif
[839]120    tmp=strtok(buffer,";");
121    int cnt=0;
[797]122    _HINTERNET *psInternet=(_HINTERNET *)data;
[839]123    if(tmp!=NULL && psInternet!=NULL){
124      psInternet->cookie=(char*)malloc(sizeof(char)*(strlen(tmp)+1));
125      sprintf(psInternet->cookie,"%s",tmp);
126    }
[1]127  }
128  return size * nmemb;//write_data_into(buffer,size,nmemb,data,HEADER);
129};
130
[579]131/**
132 * Define the proxy to use for a CURL handler
133 *
134 * @param handle the CURL handler
135 * @param host the proxy host (including http://)
136 * @param port the proxy port
137 */
[1]138void setProxy(CURL* handle,char* host,long port){
[579]139  char* proxyDef=(char*)malloc((strlen(host)+10+2)*sizeof(char));
140  sprintf(proxyDef,"%s:%ld",host,port);
141  curl_easy_setopt(handle,CURLOPT_PROXY,proxyDef);
142  free(proxyDef);
[1]143}
144
145/**
146 * MACOSX
147 */
148#if defined(macintosh) || (defined(__MACH__) && defined(__APPLE__))
149
150
151char* CFStringToCString(CFStringRef dest,char *buffer){
152  CFStringEncoding encoding = kCFStringEncodingUTF8;
153  Boolean bool2 = CFStringGetCString(dest,buffer,1024,encoding);
154  if(bool2){
155    printf("Loaded into local_buffer");
156    return buffer;
157  }
158  return NULL;
159}
160
161OSStatus setProxiesForProtcol(CURL* handle,const char *proto){
162  OSStatus              err;
163  CFDictionaryRef proxyDict;
164  CFArrayRef            proxies;
165 
[446]166  CFStringRef key_enabled = NULL;
167  CFStringRef key_host = NULL;
168  CFStringRef key_port = NULL;
[1]169 
170  bool proxy_enabled;
171  char *proxy_host;
172  long proxy_port;
173 
174  proxyDict = NULL;
175  proxies = NULL;
176
177  err = noErr;
178  proxyDict = SCDynamicStoreCopyProxies(NULL);
179
[446]180  if(strncmp(proto,"http",4)==0){
[1]181      key_enabled=kSCPropNetProxiesHTTPEnable;
182      key_host=kSCPropNetProxiesHTTPProxy;
183      key_port=kSCPropNetProxiesHTTPPort;
184  }
185  else
[446]186    if(strncmp(proto,"https",5)==0){
[1]187      key_enabled=kSCPropNetProxiesHTTPSEnable;
188      key_host=kSCPropNetProxiesHTTPSProxy;
189      key_port=kSCPropNetProxiesHTTPSPort;
190    }
191
192  CFNumberGetValue(CFDictionaryGetValue(proxyDict,key_enabled),kCFNumberIntType,&proxy_enabled);
193  if(proxy_enabled){
194    CFNumberGetValue(CFDictionaryGetValue(proxyDict,key_port),CFNumberGetType(CFDictionaryGetValue(proxyDict,key_port)),&proxy_port);
195    char buffer[1024];
196    CFStringToCString(CFDictionaryGetValue(proxyDict,key_host),buffer);
197    proxy_host=buffer;
198
199#ifdef MSG_LAF_VERBOSE
200    printf("\n**[PROXY SETTINGS DETECTION %s (%d) %s:%li (%s)]**\n",proto,proxy_enabled,(char*)proxy_host,proxy_port,buffer);
201#endif
202
203    if (proxyDict == NULL) {
204      err = coreFoundationUnknownErr;
205    }
206
207    setProxy(handle,proxy_host,proxy_port);
208  }
209  return err;
210}
211#else
212/**
[579]213 * Should autodetect the proxy configuration (do nothing on linux)
214 *
215 * @param handle a CURL handle
216 * @param proto the protocol requiring the use of a proxy
[1]217 */
[820]218int setProxiesForProtcol(CURL* handle,const char *proto){
[1]219#ifdef MSG_LAF_VERBOSE
220  fprintf( stderr, "setProxiesForProtocol (do nothing) ...\n" );
221#endif
[820]222  return 0;
[1]223}
224#endif
225
[579]226/**
227 * Create a HINTERNET
228 *
229 * @param lpszAgent the HTPP User-Agent to use to send requests
230 * @param  dwAccessType type of access required
231 * @param  lpszProxyName the name of the proxy server(s) to use
232 * @param  lpszProxyBypass ip address or host names which should not be routed
233 *  through the proxy
234 * @param  dwFlags Options (INTERNET_FLAG_ASYNC,INTERNET_FLAG_FROM_CACHE,INTERNET_FLAG_OFFLINE)
235 * @return the created HINTERNET
236 */
[492]237HINTERNET InternetOpen(char* lpszAgent,int dwAccessType,char* lpszProxyName,char* lpszProxyBypass,int dwFlags){
[1]238  HINTERNET ret;
[490]239  ret.handle=curl_multi_init();
[890]240  ret.agent=zStrdup(lpszAgent);
[492]241  ret.nb=0;
[854]242  ret.waitingRequests[ret.nb] = NULL;
[492]243  ret.ihandle[ret.nb].header=NULL;
[854]244  ret.ihandle[ret.nb].handle=NULL;
245  ret.ihandle[ret.nb].hasCacheFile=0;
246  ret.ihandle[ret.nb].nDataAlloc = 0;
247  ret.ihandle[ret.nb].url = NULL;
248  ret.ihandle[ret.nb].mimeType = NULL;
249  ret.ihandle[ret.nb].cookie = NULL;
250  ret.ihandle[ret.nb].nDataLen = 0;
251  ret.ihandle[ret.nb].nDataAlloc = 0;
252  ret.ihandle[ret.nb].pabyData = NULL;
253  ret.ihandle[ret.nb].post = NULL;
[1]254  return ret;
255}
256
[579]257/**
[854]258 * Verify if the URL should use a shared cache or not.
259 *
260 * In case the security section contains a key named "shared", then if the
261 * domain listed in the shared key are contained in the url given as parameter
262 * then it return "SHARED" in other cases, it returns "OTHER".
263 *
264 * @param conf the main configuration file maps
265 * @param url the URL to evaluate
266 * @return a string "SHARED" in case the host is in a domain listed in the
267 * shared key, "OTHER" in other cases.
268 */
269char* getProvenance(maps* conf,const char* url){
270  map* sharedCache=getMapFromMaps(conf,"security","shared");
[890]271  char *res="OTHER";
272  char *paths[2]={
273    "mapserverAddress",
274    "tmpUrl"
275  };
[854]276  if(sharedCache!=NULL){
277    char *hosts=sharedCache->value;
278    char *curs=strtok(hosts,",");
279    while(curs!=NULL){
[890]280      if(strstr(url,curs)==NULL){
281        return "SHARED";
[854]282      }
283      curs=strtok(NULL,",");
284    }
285  }
[890]286  for(int i=0;i<2;i++){
287    sharedCache=getMapFromMaps(conf,"main",paths[i]);
288    if(sharedCache!=NULL){
289      if(strstr(url,sharedCache->value)!=NULL){
290        return "LOCAL";
291      }
292    }
293  }
294  return res;
[854]295}
296
297/**
[817]298 * Add missing headers to an existing _HINTERNET
299 *
300 *
301 * @param handle the _HINTERNET pointer
302 * @param key the header parameter name
303 * @param value the header parameter value
304 * @return 0 if the operation succeeded, -1 in other case.
305 */
306int AddMissingHeaderEntry(_HINTERNET* handle,const char* key,const char* value){
307  int length=strlen(key)+strlen(value)+3;
308  char *entry=(char*)malloc((length)*sizeof(char));
309  if(entry==NULL)
310    return -1;
311  snprintf (entry, length, "%s: %s", key, value);
312  handle->header = curl_slist_append (handle->header, entry);
313  free(entry);
314  return 0;
315}
316
317/**
318 * Verify if a host is protected (appear in [security] > hosts)
319 *
320 * @param protectedHosts string containing all the protected hosts (coma separated)
321 * @param url string used to extract the host from
322 * @return 1 if the host is listed as protected, 0 in other case
323 */
324int isProtectedHost(const char* protectedHosts,const char* url){
325  char *token, *saveptr;
326  token = strtok_r (url, "//", &saveptr);
327  int cnt=0;
328  char* host;
329  while(token!=NULL && cnt<=1){
330    if(cnt==1 && strstr(protectedHosts,token)!=NULL){
331      return 1;
332    }
333    token = strtok_r (NULL, "/", &saveptr);
334    cnt+=1;
335  }
336  return 0;
337}
338
339/**
340 * Add headers defined in [security] > attributes to an existing HINTERNET
341 * @see isProtectedHost, AddMissingHeaderEntry
342 *
343 * @param handle the _HINTERNET pointer
344 * @param conf the header parameter name
345 * @param value the header parameter value
346 * @return 0 if the operation succeeded, -1 in other case.
347 */
348void AddHeaderEntries(HINTERNET* handle,maps* conf){
349  map* passThrough=getMapFromMaps(conf,"security","attributes");
350  map* targetHosts=getMapFromMaps(conf,"security","hosts");
351  char* passedHeader[10];
352  int cnt=0;
353  if(passThrough!=NULL && targetHosts!=NULL){
354    char *tmp=zStrdup(passThrough->value);
[820]355    int i;
356    for(i=0;i<handle->nb;i++){
[854]357      if(strstr(targetHosts->value,"*")!=NULL || isProtectedHost(targetHosts->value,handle->ihandle[i].url)==1){
[860]358        char *token, *saveptr;
359        token = strtok_r (tmp, ",", &saveptr);
[817]360        while (token != NULL){
361          int length=strlen(token)+6;
362          char* tmp1=(char*)malloc(length*sizeof(char));
[850]363          map* tmpMap;
[817]364          snprintf(tmp1,6,"HTTP_");
[820]365          int j;
366          for(j=0;token[j]!='\0';j++){
367            if(token[j]!='-')
[846]368              tmp1[5+j]=toupper(token[j]);
[817]369            else
[820]370              tmp1[5+j]='_';
371            tmp1[5+j+1]='\0';
[817]372          }
[854]373          tmpMap = getMapFromMaps(conf,"renv",tmp1);
374          if(tmpMap!=NULL){
375            AddMissingHeaderEntry(&handle->ihandle[i],token,tmpMap->value);
[850]376          }
[817]377          if(handle->ihandle[i].header!=NULL)
378            curl_easy_setopt(handle->ihandle[i].handle,CURLOPT_HTTPHEADER,handle->ihandle[i].header);
[860]379          free(tmp1);
[817]380          cnt+=1;
381          token = strtok_r (NULL, ",", &saveptr);
382        }
383      }
384    }
385    free(tmp);
386  }
387}
388
389/**
[781]390 * Close a HINTERNET connection and free allocated resources
[579]391 *
392 * @param handle0 the HINTERNET connection to close
393 */
[492]394void InternetCloseHandle(HINTERNET* handle0){
395  int i=0;
[854]396  if(handle0!=NULL){
397    for(i=0;i<handle0->nb;i++){
398      _HINTERNET handle=handle0->ihandle[i];
399      if(handle.hasCacheFile>0){
400        fclose(handle.file);
401        unlink(handle.filename);
[862]402        free(handle.filename);
[854]403      }
404      else{
405        handle.pabyData = NULL;
406        handle.nDataAlloc = handle.nDataLen = 0;
407      }
408      if(handle.header!=NULL){
409        curl_slist_free_all(handle.header);
410        handle.header=NULL;
411      }
412      if(handle.post!=NULL){
413        free(handle.post);
414        handle.post=NULL;
415      }
416      if(handle.url!=NULL){
417        free(handle.url);
418        handle.url=NULL;
419      }
420      if(handle.mimeType!=NULL){
421        free(handle.mimeType);
422        handle.mimeType=NULL;
423      }
424      if(handle.cookie!=NULL){
425        free(handle.cookie);
426        handle.cookie=NULL;
427      }
428      if(handle0->waitingRequests[i]!=NULL){
429        free(handle0->waitingRequests[i]);
430        handle0->waitingRequests[i]=NULL;
431      }
[492]432    }
[854]433    if(handle0->handle)
434      curl_multi_cleanup(handle0->handle);
435    if(handle0->agent!=NULL){
436      free(handle0->agent);
437      handle0->agent=NULL;
[492]438    }
[1]439  }
440}
441
[579]442/**
443 * Create a new element in the download queue
444 *
445 * @param hInternet the HINTERNET connection to add the download link
446 * @param lpszUrl the url to download
447 * @param lpszHeaders the additional headers to be sent to the HTTP server
448 * @param dwHeadersLength the size of the additional headers
449 * @param dwFlags desired download mode (INTERNET_FLAG_NO_CACHE_WRITE for not using cache file)
450 * @param dwContext not used
[863]451 * @param conf the main configuration file maps pointer
[862]452 * @return the updated HINTERNET
[579]453 */
[863]454HINTERNET InternetOpenUrl(HINTERNET* hInternet,LPCTSTR lpszUrl,LPCTSTR lpszHeaders,size_t dwHeadersLength,size_t dwFlags,size_t dwContext,const maps* conf){
[1]455
456  char filename[255];
[863]457  int ldwFlags=INTERNET_FLAG_NEED_FILE;
[490]458  struct MemoryStruct header;
[863]459  map* memUse=getMapFromMaps(conf,"main","memory");
[490]460
[492]461  hInternet->ihandle[hInternet->nb].handle=curl_easy_init( );
462  hInternet->ihandle[hInternet->nb].hasCacheFile=0;
463  hInternet->ihandle[hInternet->nb].nDataAlloc = 0;
[817]464  hInternet->ihandle[hInternet->nb].url = NULL;
[492]465  hInternet->ihandle[hInternet->nb].mimeType = NULL;
[839]466  hInternet->ihandle[hInternet->nb].cookie = NULL;
[492]467  hInternet->ihandle[hInternet->nb].nDataLen = 0;
468  hInternet->ihandle[hInternet->nb].id = hInternet->nb;
469  hInternet->ihandle[hInternet->nb].nDataAlloc = 0;
470  hInternet->ihandle[hInternet->nb].pabyData = NULL;
[621]471  hInternet->ihandle[hInternet->nb].post = NULL;
[839]472 
[492]473  curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle, CURLOPT_COOKIEFILE, "ALL");
[490]474#ifndef TIGER
[492]475  curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle, CURLOPT_COOKIELIST, "ALL");
[490]476#endif
[492]477  curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle, CURLOPT_USERAGENT, hInternet->agent);
[490]478 
[492]479  curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle,CURLOPT_FOLLOWLOCATION,1);
480  curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle,CURLOPT_MAXREDIRS,3);
[490]481 
482  header.memory=NULL;
483  header.size = 0;
484
[492]485  curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle, CURLOPT_HEADERFUNCTION, header_write_data);
486  curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle, CURLOPT_WRITEHEADER, (void *)&header);
[490]487
488#ifdef MSG_LAF_VERBOSE
[492]489  curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle, CURLOPT_VERBOSE, 1);
[490]490#endif
[863]491
[890]492  if(memUse==NULL || strcasecmp(memuse->value,"load")==0)
[863]493    ldwFlags=INTERNET_FLAG_NO_CACHE_WRITE;
494 
495  switch(ldwFlags)
[1]496    {
[492]497    case INTERNET_FLAG_NO_CACHE_WRITE:
498      curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle, CURLOPT_WRITEFUNCTION, write_data_into);
499      curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle, CURLOPT_WRITEDATA, (void*)&hInternet->ihandle[hInternet->nb]);
[862]500      hInternet->ihandle[hInternet->nb].hasCacheFile=-1;
[1]501      break;
502    default:
[862]503      memset(filename,0,255);
504      char* tmpUuid=get_uuid();
[863]505      map* tmpPath=NULL;
506      if(conf!=NULL){
507        tmpPath=getMapFromMaps(conf,"main","tmpPath");
508      }
509      if(tmpPath==NULL)
510        sprintf(filename,"/tmp/ZOO_Cache%s", tmpUuid);
511      else
[890]512        sprintf(filename,"%s/ZOO_Cache%s", tmpPath->value,tmpUuid);
[862]513      free(tmpUuid);
[890]514      hInternet->ihandle[hInternet->nb].filename=zStrdup(filename);
[492]515      hInternet->ihandle[hInternet->nb].file=fopen(hInternet->ihandle[hInternet->nb].filename,"w+");
516      hInternet->ihandle[hInternet->nb].hasCacheFile=1;
[862]517      curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle, CURLOPT_WRITEFUNCTION, write_data_into_file);
518      curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle, CURLOPT_WRITEDATA, (void*)&hInternet->ihandle[hInternet->nb]);
[1]519      break;
520    }
521#ifdef ULINET_DEBUG
522  fprintf(stderr,"URL (%s)\nBODY (%s)\n",lpszUrl,lpszHeaders);
523#endif
524  if(lpszHeaders!=NULL && strlen(lpszHeaders)>0){
525#ifdef MSG_LAF_VERBOSE
526    fprintf(stderr,"FROM ULINET !!");
[621]527    fprintf(stderr,"HEADER : [%s] %d\n",lpszHeaders,dwHeadersLength);
[1]528#endif
[492]529    curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle,CURLOPT_POST,1);
[1]530#ifdef ULINET_DEBUG
531    fprintf(stderr,"** (%s) %d **\n",lpszHeaders,dwHeadersLength);
[492]532    curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle,CURLOPT_VERBOSE,1);
[1]533#endif
[890]534    hInternet->ihandle[hInternet->nb].post=zStrdup(lpszHeaders);
[621]535    curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle,CURLOPT_POSTFIELDS,hInternet->ihandle[hInternet->nb].post);
536    curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle,CURLOPT_POSTFIELDSIZE,(long)dwHeadersLength);
[1]537  }
[607]538  if(hInternet->ihandle[hInternet->nb].header!=NULL)
539    curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle,CURLOPT_HTTPHEADER,hInternet->ihandle[hInternet->nb].header);
[1]540
[492]541  curl_easy_setopt(hInternet->ihandle[hInternet->nb].handle,CURLOPT_URL,lpszUrl);
[817]542  hInternet->ihandle[hInternet->nb].url = zStrdup(lpszUrl);
[490]543
[492]544  curl_multi_add_handle(hInternet->handle,hInternet->ihandle[hInternet->nb].handle);
[490]545 
[621]546  hInternet->ihandle[hInternet->nb].header=NULL;
[492]547  ++hInternet->nb;
[854]548  hInternet->ihandle[hInternet->nb].header=NULL;
[490]549
[446]550#ifdef ULINET_DEBUG
551  fprintf(stderr,"DEBUG MIMETYPE: %s\n",hInternet.mimeType);
[478]552  fflush(stderr);
[446]553#endif
[492]554  return *hInternet;
[1]555};
556
[579]557/**
558 * Download all opened urls in the queue
559 *
560 * @param hInternet the HINTERNET structure containing the queue
561 * @return 0
562 */
[492]563int processDownloads(HINTERNET* hInternet){
[862]564  int still_running=0,numfds;
[492]565  int msgs_left=0;
566  int i=0;
567  do{
[862]568    CURLMcode mc;
569    mc = curl_multi_perform(hInternet->handle, &still_running);
570    if(mc==CURLM_OK){
[871]571#if LIBCURL_VERSION_MINOR >= 28
[862]572      mc = curl_multi_wait(hInternet->handle, NULL, 0, 1000, &numfds);
[871]573#else
574      struct timeval timeout;
575      fd_set fdread;
576      fd_set fdwrite;
577      fd_set fdexcep;
578      int maxfd = -1;
579
580      long curl_timeo = -1;
581
582      FD_ZERO(&fdread);
583      FD_ZERO(&fdwrite);
584      FD_ZERO(&fdexcep);
585
586      /* set a suitable timeout to play around with */
587      timeout.tv_sec = 1;
588      timeout.tv_usec = 0;
589
590      curl_multi_timeout(hInternet->handle, &curl_timeo);
591      if(curl_timeo >= 0) {
592        timeout.tv_sec = curl_timeo / 1000;
593        if(timeout.tv_sec > 1)
594          timeout.tv_sec = 1;
595        else
596          timeout.tv_usec = (curl_timeo % 1000) * 1000;
597      }
598
599      /* get file descriptors from the transfers */
600      mc = curl_multi_fdset(hInternet->handle, &fdread, &fdwrite, &fdexcep, &maxfd);
601#endif
[862]602    }
603    if(mc != CURLM_OK) {
604      fprintf(stderr, "curl_multi failed, code %d.n", mc);
605      break;
606    }
[492]607  }while(still_running); 
608  for(i=0;i<hInternet->nb;i++){
[534]609    char *tmp;
610    curl_easy_getinfo(hInternet->ihandle[i].handle,CURLINFO_CONTENT_TYPE,&tmp);
[539]611    if(tmp!=NULL)
[890]612      hInternet->ihandle[i].mimeType=zStrdup(tmp);
[607]613    curl_easy_getinfo(hInternet->ihandle[i].handle,CURLINFO_RESPONSE_CODE,&hInternet->ihandle[i].code);
[492]614    curl_multi_remove_handle(hInternet->handle, hInternet->ihandle[i].handle);
615    curl_easy_cleanup(hInternet->ihandle[i].handle);
616  }
[509]617  return 0;
[492]618}
619
[579]620/**
[839]621 * Initialize the cookie for a specific index (hInternet.nb)
[579]622 *
[839]623 * @param hInternet the HINTERNET structure to know the cookie index to reset
[579]624 * @return 1
625 * @see HINTERNET
626 */
[1]627int freeCookieList(HINTERNET hInternet){
[890]628  hInternet.ihandle[hInternet.nb].cookie=zStrdup("");
[1]629#ifndef TIGER
[492]630  curl_easy_setopt(hInternet.ihandle[hInternet.nb].handle, CURLOPT_COOKIELIST, "ALL");
[1]631#endif
632  return 1;
633}
634
[579]635/**
636 * Copy a downloaded content
637 *
638 * @param hInternet the _HINTERNET structure
639 * @param lpBuffer the memory space to copy the downloaded content
640 * @param dwNumberOfBytesToRead the size of lpBuffer
641 * @param lpdwNumberOfBytesRead number of bytes red
642 * @return 1 on success, 0 if failure
643 */
[492]644int InternetReadFile(_HINTERNET hInternet,LPVOID lpBuffer,int dwNumberOfBytesToRead, size_t *lpdwNumberOfBytesRead){
[1]645  int dwDataSize;
646
647  if(hInternet.hasCacheFile>0){
648    fseek (hInternet.file , 0 , SEEK_END);
649    dwDataSize=ftell(hInternet.file); //taille du ficher
[862]650    //dwDataSize=hInternet.nDataLen;
651    //rewind (hInternet.file);
652    fseek(hInternet.file, 0, SEEK_SET);
[1]653  }
654  else{
655    memset(lpBuffer,0,hInternet.nDataLen+1);
[375]656    memcpy(lpBuffer, hInternet.pabyData, hInternet.nDataLen );
[1]657    dwDataSize=hInternet.nDataLen;
658    free( hInternet.pabyData );
659    hInternet.pabyData=NULL;
660  }
661
[862]662  if( dwNumberOfBytesToRead /* buffer size */ < dwDataSize ){
[1]663    return 0;
[862]664  }
[1]665
666#ifdef MSG_LAF_VERBOSE
[862]667  fprintf(stderr,"\nfile size : %dko\n",dwDataSize/1024);
[1]668#endif
669
670  if(hInternet.hasCacheFile>0){
[862]671    int freadRes = fread(lpBuffer,dwDataSize+1,1,hInternet.file); 
672    *lpdwNumberOfBytesRead = hInternet.nDataLen;
[1]673  }
674  else{
675    *lpdwNumberOfBytesRead = hInternet.nDataLen;
676    free( hInternet.pabyData );
677    hInternet.pabyData = NULL;
678    hInternet.nDataAlloc = hInternet.nDataLen = 0;
679  }
680
681  if( *lpdwNumberOfBytesRead < dwDataSize )
682      return 0;
683  else
684      return 1; // TRUE
685}
686
[607]687
688/**
[781]689 * Use basic authentication for accessing a resource
[607]690 *
691 * @param hInternet the _HINTERNET structure
692 * @param login the login to use to authenticate
693 * @param passwd the password to use to authenticate
694 */
695int setBasicAuth(HINTERNET hInternet,char* login,char* passwd){
696  char *tmp;
697  tmp=(char*)malloc((strlen(login)+strlen(passwd)+2)*sizeof(char));
698  sprintf(tmp,"%s:%s",login,passwd);
699  if(curl_easy_setopt(hInternet.ihandle[hInternet.nb].handle,CURLOPT_USERPWD,tmp)==CURLE_OUT_OF_MEMORY){
700    free(tmp);
701    return -1;
702  }
703  curl_easy_setopt(hInternet.ihandle[hInternet.nb].handle, CURLOPT_HTTPAUTH,CURLAUTH_ANY);
704  free(tmp);
705  return 0;
706}
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