35 #include <libFreeWRL.h>
46 #define strncasecmp _strnicmp
49 bool 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) {
80 static char *RFC1738_unsafe =
" <>{}|\\^~[]`#%";
81 static int is_unsafe(
char c){
86 for(j=0;j<strlen(RFC1738_unsafe);j++){
87 if( c == RFC1738_unsafe[j]){
95 static int count_unsafe(
char *str){
97 len = (int)strlen(str);
100 if(is_unsafe(str[i]))
104 static char *hexdigits =
"0123456789ABCDEF";
105 static 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>
162 int with_libcurl = TRUE;
164 static int curl_initialized = 0;
175 if ( (c=curl_global_init(CURL_GLOBAL_ALL)) != 0 ) {
176 ERROR_MSG(
"Curl init failed: %d\n", (
int)c);
177 curl_initialized = 0;
180 curl_initialized = 1;
186 char* download_url_curl_OLD(
char *parsed_request,
char *temp_dir)
194 temp = STRDUP(temp_dir);
196 temp = tempnam(gglobal()->Mainloop.tmpFileLocation,
"freewrl_download_curl_XXXXXXXX");
198 PERROR_MSG(
"download_url_curl: can't create temporary name.\n");
203 file = fopen(temp,
"w");
206 ERROR_MSG(
"Cannot create temp file (fopen)\n");
210 if (curl_initialized != 0) {
214 curl_h = curl_easy_init();
220 curl_easy_setopt(curl_h, CURLOPT_URL, parsed_request);
222 curl_easy_setopt(curl_h, CURLOPT_WRITEDATA, file);
224 success = curl_easy_perform(curl_h);
226 if (success != CURLE_OK) {
227 ERROR_MSG(
"Download failed for url %s\n", res->parsed_request);
228 fprintf(stderr,
"curl_easy_perform() failed: %s\n", curl_easy_strerror(success));
234 #ifdef TRACE_DOWNLOADS
235 TRACE_MSG(
"Download sucessfull [curl] for url %s\n", parsed_request);
242 char* download_url_curl(
char *parsed_request,
char *temp_dir)
244 static CURL *curl_h = NULL;
246 char *temp, *safe_url;
250 temp = STRDUP(temp_dir);
252 temp = tempnam(gglobal()->Mainloop.tmpFileLocation,
"freewrl_download_curl_XXXXXXXX");
254 PERROR_MSG(
"download_url_curl: can't create temporary name.\n");
259 file = fopen(temp,
"w");
262 ERROR_MSG(
"Cannot create temp file (fopen)\n");
266 if (curl_initialized == 0) {
268 curl_h = curl_easy_init();
272 safe_url = replace_unsafe(parsed_request);
277 curl_easy_setopt(curl_h, CURLOPT_URL, safe_url);
279 curl_easy_setopt(curl_h, CURLOPT_WRITEDATA, file);
281 success = curl_easy_perform(curl_h);
283 if(success == CURLE_OK){
290 curl_easy_getinfo(curl_h, CURLINFO_RESPONSE_CODE, &response_code);
291 if(response_code == 200){
310 #if defined(HAVE_WININET)
319 static HINTERNET hWinInet = NULL;
320 HINTERNET winInetInit()
332 hWinInet = InternetOpen(
"freewrl",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
335 void closeWinInetHandle()
337 InternetCloseHandle(hWinInet);
344 char* download_url_WinInet(
char *parsed_request,
char *temp_dir)
350 hWinInet = winInetInit();
356 DWORD dataLength, len;
360 DWORD InfoLevel, Index;
364 static FILE* fp = NULL;
365 if (!fp) fp = fopen(
"http_log.txt",
"w+");
366 fprintf(fp,
"[%s]\n", parsed_request);
368 hOpenUrl=InternetOpenUrl(hWinInet,parsed_request,NULL,0,0,0);
385 InfoLevel = HTTP_QUERY_RAW_HEADERS_CRLF;
386 if(HttpQueryInfo(hOpenUrl,InfoLevel,buffer,&buflen,NULL)){
388 if(strstr(buffer,
"404 Not Found")){
390 ERROR_MSG(
"Download failed1 for url %s\n", parsed_request);
403 ERROR_MSG(
"Download failed2 for url %s\n", parsed_request);
411 temp = STRDUP(temp_dir);
415 tmp1 = _tempnam(NULL,
"freewrl_download_XXXXXXXX");
417 PERROR_MSG(
"download_url: can't create temporary name.\n");
424 file = fopen(temp,
"wb");
427 ERROR_MSG(
"Cannot create temp file (fopen)\n");
434 while((InternetQueryDataAvailable(hOpenUrl,&dataLength,0,0))&&(dataLength>0))
436 void *
block = MALLOC(
void *, dataLength);
437 if ((InternetReadFile(hOpenUrl,(
void*)block,dataLength,&len))&&(len>0))
439 fwrite(block,dataLength,1,file);
443 InternetCloseHandle(hOpenUrl);
467 char* download_url_wget(
char *parsed_request,
char *temp_dir)
469 char *temp, *wgetcmd, *safe;
478 #define WGET_OPTIONS "--no-check-certificate"
479 #define WGET_OUTPUT_DIRECT "-O"
485 temp = STRDUP(temp_dir);
487 temp = tempnam(gglobal()->Mainloop.tmpFileLocation,
"freewrl_download_wget_XXXXXXXX");
489 PERROR_MSG(
"download_url_wget: can't create temporary name.\n");
495 safe = replace_unsafe(parsed_request);
496 wgetcmd = MALLOC(
void *, strlen(WGET) +
497 strlen(WGET_OPTIONS) +
499 strlen(temp) + 6 +1+1);
506 sprintf(wgetcmd,
"%s %s %s %s %s", WGET, WGET_OPTIONS, safe, WGET_OUTPUT_DIRECT, temp);
514 ret = freewrlSystem(wgetcmd);
516 ERROR_MSG(
"Error in wget (%s)\n", wgetcmd);
533 void close_internetHandles()
536 closeWinInetHandle();
539 void download_url(
void *res)
541 char *temp_dir, *parsed_request, *actual_file;
542 parsed_request = fwl_resitem_getURL(res);
543 temp_dir = fwl_resitem_getTempDir(res);
546 #if defined(HAVE_LIBCURL)
548 actual_file = download_url_curl(parsed_request,temp_dir);
550 actual_file = download_url_wget(parsed_request,temp_dir);
553 #elif defined (HAVE_WGET)
554 actual_file = download_url_wget(parsed_request,temp_dir);
557 #elif defined (HAVE_WININET)
558 actual_file = download_url_WinInet(parsed_request,temp_dir);
565 fwl_resitem_setStatus(res,ress_downloaded);
566 fwl_resitem_setActualFile(res,actual_file);
580 fwl_resitem_setStatus(res,ress_failed);
581 ERROR_MSG(
"resource_fetch: download failed for url: %s\n", parsed_request);