static int raptor_www_file_fetch(raptor_www* www) { char *filename; FILE *fh; unsigned char *uri_string = raptor_uri_as_string(www->uri); #if defined(HAVE_UNISTD_H) && defined(HAVE_SYS_STAT_H) struct stat buf; #endif www->status_code = 200; filename = raptor_uri_uri_string_to_filename(uri_string); if(!filename) { raptor_www_error(www, "Not a file: URI"); return 1; } #if defined(HAVE_UNISTD_H) && defined(HAVE_SYS_STAT_H) if(!stat(filename, &buf) && S_ISDIR(buf.st_mode)) { raptor_www_error(www, "Cannot read from a directory '%s'", filename); RAPTOR_FREE(cstring, filename); www->status_code = 404; return 1; } #endif fh = fopen(filename, "rb"); if(!fh) { raptor_www_error(www, "file '%s' open failed - %s", filename, strerror(errno)); RAPTOR_FREE(cstring, filename); www->status_code = (errno == EACCES) ? 403: 404; www->failed = 1; return www->failed; } raptor_www_file_handle_fetch(www, fh); fclose(fh); RAPTOR_FREE(cstring, filename); return www->failed; }
int raptor_www_curl_fetch(raptor_www *www) { struct curl_slist *slist=NULL; if(www->proxy) curl_easy_setopt(www->curl_handle, CURLOPT_PROXY, www->proxy); if(www->user_agent) curl_easy_setopt(www->curl_handle, CURLOPT_USERAGENT, www->user_agent); if(www->http_accept) slist=curl_slist_append(slist, (const char*)www->http_accept); /* ALWAYS disable curl default "Pragma: no-cache" */ slist=curl_slist_append(slist, "Pragma:"); if(www->cache_control) slist=curl_slist_append(slist, (const char*)www->cache_control); if(slist) curl_easy_setopt(www->curl_handle, CURLOPT_HTTPHEADER, slist); /* specify URL to get */ curl_easy_setopt(www->curl_handle, CURLOPT_URL, raptor_uri_as_string(www->uri)); if(curl_easy_perform(www->curl_handle)) { /* failed */ www->failed=1; raptor_www_error(www, "Resolving URI failed: %s", www->error_buffer); } else { long lstatus; #ifndef CURLINFO_RESPONSE_CODE #define CURLINFO_RESPONSE_CODE CURLINFO_HTTP_CODE #endif /* Requires pointer to a long */ if(curl_easy_getinfo(www->curl_handle, CURLINFO_RESPONSE_CODE, &lstatus) == CURLE_OK) www->status_code=lstatus; } if(slist) curl_slist_free_all(slist); return www->failed; }
/** * raptor_www_fetch: * @www: WWW object * @uri: URI to read from * * Start a WWW content retrieval for the given URI, returning data via the write_bytes handler. * * Return value: non-0 on failure. **/ int raptor_www_fetch(raptor_www *www, raptor_uri *uri) { int status = 1; www->uri = raptor_new_uri_for_retrieval(uri); www->locator.uri = uri; www->locator.line= -1; www->locator.column= -1; if(www->uri_filter) if(www->uri_filter(www->uri_filter_user_data, uri)) return status; #ifdef RAPTOR_WWW_NONE status = raptor_www_file_fetch(www); #else if(raptor_uri_uri_string_is_file_uri(raptor_uri_as_string(www->uri))) status = raptor_www_file_fetch(www); else { #ifdef RAPTOR_WWW_LIBCURL status = raptor_www_curl_fetch(www); #endif #ifdef RAPTOR_WWW_LIBXML status = raptor_www_libxml_fetch(www); #endif #ifdef RAPTOR_WWW_LIBFETCH status = raptor_www_libfetch_fetch(www); #endif } #endif if(!status && www->status_code && www->status_code != 200){ raptor_www_error(www, "Resolving URI failed with HTTP status %d", www->status_code); status = 1; } www->failed = status; return www->failed; }
int raptor_www_libfetch_fetch(raptor_www *www) { FILE *stream; if(www->proxy) { setenv("HTTP_PROXY", www->proxy, 0); setenv("FTP_PROXY", www->proxy, 0); } if(www->user_agent) setenv("HTTP_USER_AGENT", www->user_agent, 0); stream = fetchXGetURL((const char*)raptor_uri_as_string(www->uri), NULL, NULL); if(!stream) { www->failed = 1; raptor_www_error(www, "%s", fetchLastErrString); return 1; } /* fetch does not give us access to this */ www->status_code = 200; while(!feof(stream)) { size_t len = fread(www->buffer, 1, RAPTOR_WWW_BUFFER_SIZE, stream); www->total_bytes += len; if(www->write_bytes) www->write_bytes(www, www->write_bytes_userdata, www->buffer, len, 1); if(len < RAPTOR_WWW_BUFFER_SIZE) break; } fclose(stream); return www->failed; }