35#include <libFreeWRL.h>
46#define strncasecmp _strnicmp
49bool is_url(
const char *url)
52 static const char *protos[MAX_PROTOS] = {
"ftp",
"http",
"https",
"urn" };
56 unsigned long delta = 0;
58 pat = strstr(url,
"://");
63 delta = (long)pat - (
long)url;
68 for (i = 0; i < MAX_PROTOS ; i++) {
69 if (strncasecmp(protos[i], url, strlen(protos[i])) == 0) {
80static char *RFC1738_unsafe =
" <>{}|\\^~[]`#%";
81static int is_unsafe(
char c){
86 for(j=0;j<strlen(RFC1738_unsafe);j++){
87 if( c == RFC1738_unsafe[j]){
95static int count_unsafe(
char *str){
97 len = (int)strlen(str);
100 if(is_unsafe(str[i]))
104static char *hexdigits =
"0123456789ABCDEF";
105static char *replace_unsafe(
char *str){
108 len = (int)strlen(str);
109 n = count_unsafe(str);
110 if(n == 0)
return strdup(str);
112 s = malloc(n*3 + len - n +1);
115 if(is_unsafe(str[i])){
117 s[j+1] = hexdigits[str[i] >> 4];
118 s[j+2] = hexdigits[str[i] & 0x0f];
144#if defined(HAVE_LIBCURL)
160#include <curl/curl.h>
162int with_libcurl = TRUE;
164static int curl_initialized = 0;
178 if ( (c=curl_global_init(CURL_GLOBAL_ALL)) != 0 ) {
179 ERROR_MSG(
"Curl init failed: %d\n", (
int)c);
180 curl_initialized = 0;
183 curl_initialized = 1;
188char* download_url_curl_OLD(
char *parsed_request,
char *temp_dir)
196 temp = STRDUP(temp_dir);
198 temp = TEMPNAM(gglobal()->Mainloop.tmpFileLocation,
"freewrl_download_curl_XXXXXXXX");
200 PERROR_MSG(
"download_url_curl: can't create temporary name.\n");
205 file = fopen(temp,
"w");
208 ERROR_MSG(
"Cannot create temp file (fopen)\n");
212 if (curl_initialized != 0) {
216 curl_h = curl_easy_init();
222 curl_easy_setopt(curl_h, CURLOPT_URL, parsed_request);
224 curl_easy_setopt(curl_h, CURLOPT_WRITEDATA, file);
226 success = curl_easy_perform(curl_h);
228 if (success != CURLE_OK) {
229 ERROR_MSG(
"Download failed for url %s\n", parsed_request);
230 fprintf(stderr,
"curl_easy_perform() failed: %s\n", curl_easy_strerror(success));
236#ifdef TRACE_DOWNLOADS
237 TRACE_MSG(
"Download sucessfull [curl] for url %s\n", parsed_request);
244char* download_url_curl(
char *parsed_request,
char *temp_dir)
248 char *temp, *safe_url;
252 temp = STRDUP(temp_dir);
254 temp = TEMPNAM(gglobal()->Mainloop.tmpFileLocation,
"freewrl_download_curl_XXXXXXXX");
256 PERROR_MSG(
"download_url_curl: can't create temporary name.\n");
261 file = fopen(temp,
"w");
264 ERROR_MSG(
"Cannot create temp file (fopen)\n");
271 curl_h = curl_easy_init();
274 safe_url = replace_unsafe(parsed_request);
279 curl_easy_setopt(curl_h, CURLOPT_URL, safe_url);
281 curl_easy_setopt(curl_h, CURLOPT_WRITEDATA, file);
283 success = curl_easy_perform(curl_h);
285 if(success == CURLE_OK){
292 curl_easy_getinfo(curl_h, CURLINFO_RESPONSE_CODE, &response_code);
293 if(response_code == 200){
296 curl_easy_cleanup(curl_h);
306 curl_easy_cleanup(curl_h);
314#if defined(HAVE_WININET)
323static HINTERNET hWinInet = NULL;
324HINTERNET winInetInit()
336 hWinInet = InternetOpen(
"freewrl",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
339void closeWinInetHandle()
341 InternetCloseHandle(hWinInet);
348char* download_url_WinInet(
char *parsed_request,
char *temp_dir)
354 hWinInet = winInetInit();
360 DWORD dataLength, len;
364 DWORD InfoLevel, Index;
368 static FILE* fp = NULL;
369 if (!fp) fp = fopen(
"http_log.txt",
"w+");
370 fprintf(fp,
"[%s]\n", parsed_request);
372 hOpenUrl=InternetOpenUrl(hWinInet,parsed_request,NULL,0,0,0);
389 InfoLevel = HTTP_QUERY_RAW_HEADERS_CRLF;
390 if(HttpQueryInfo(hOpenUrl,InfoLevel,buffer,&buflen,NULL)){
392 if(strstr(buffer,
"404 Not Found")){
394 ERROR_MSG(
"Download failed1 for url %s\n", parsed_request);
407 ERROR_MSG(
"Download failed2 for url %s\n", parsed_request);
415 temp = STRDUP(temp_dir);
419 tmp1 = _tempnam(NULL,
"freewrl_download_XXXXXXXX");
421 PERROR_MSG(
"download_url: can't create temporary name.\n");
428 file = fopen(temp,
"wb");
431 ERROR_MSG(
"Cannot create temp file (fopen)\n");
438 while((InternetQueryDataAvailable(hOpenUrl,&dataLength,0,0))&&(dataLength>0))
440 void *
block = MALLOC(
void *, dataLength);
441 if ((InternetReadFile(hOpenUrl,(
void*)
block,dataLength,&len))&&(len>0))
443 fwrite(
block,dataLength,1,file);
447 InternetCloseHandle(hOpenUrl);
471char* download_url_wget(
char *parsed_request,
char *temp_dir)
473 char *temp, *wgetcmd, *safe;
482 #define WGET_OPTIONS "--no-check-certificate"
483 #define WGET_OUTPUT_DIRECT "-O"
489 temp = STRDUP(temp_dir);
491 temp = TEMPNAM(gglobal()->Mainloop.tmpFileLocation,
"freewrl_download_wget_XXXXXXXX");
493 PERROR_MSG(
"download_url_wget: can't create temporary name.\n");
499 safe = replace_unsafe(parsed_request);
500 wgetcmd = MALLOC(
void *, strlen(WGET) +
501 strlen(WGET_OPTIONS) +
503 strlen(temp) + 6 +1+1);
510 sprintf(wgetcmd,
"%s %s %s %s %s", WGET, WGET_OPTIONS, safe, WGET_OUTPUT_DIRECT, temp);
518 ret = freewrlSystem(wgetcmd);
520 ERROR_MSG(
"Error in wget (%s)\n", wgetcmd);
537void close_internetHandles()
540 closeWinInetHandle();
543void download_url(
void *res)
545 char *temp_dir, *parsed_request, *actual_file;
546 parsed_request = fwl_resitem_getURL(res);
547 temp_dir = fwl_resitem_getTempDir(res);
550#if defined(HAVE_LIBCURL)
552 actual_file = download_url_curl(parsed_request,temp_dir);
555 actual_file = download_url_wget(parsed_request,temp_dir);
558#elif defined (HAVE_WGET)
559 actual_file = download_url_wget(parsed_request,temp_dir);
562#elif defined (HAVE_WININET)
563 actual_file = download_url_WinInet(parsed_request,temp_dir);
570 fwl_resitem_setStatus(res,ress_downloaded);
571 fwl_resitem_setActualFile(res,actual_file);
585 fwl_resitem_setStatus(res,ress_failed);
586 ERROR_MSG(
"resource_fetch: download failed for url: %s\n", parsed_request);