/** * Register javascript scheme fetcher with fetcher factory. * * \return NSERROR_OK on success or appropriate error code on faliure. */ nserror fetch_javascript_register(void) { lwc_string *scheme = lwc_string_ref(corestring_lwc_javascript); const struct fetcher_operation_table fetcher_ops = { .initialise = fetch_javascript_initialise, .acceptable = fetch_javascript_can_fetch, .setup = fetch_javascript_setup, .start = fetch_javascript_start, .abort = fetch_javascript_abort, .free = fetch_javascript_free, .poll = fetch_javascript_poll, .finalise = fetch_javascript_finalise }; return fetcher_add(scheme, &fetcher_ops); }
/* exported function documented in content/fetchers/curl.h */ nserror fetch_curl_register(void) { CURLcode code; curl_version_info_data *data; int i; lwc_string *scheme; const struct fetcher_operation_table fetcher_ops = { .initialise = fetch_curl_initialise, .acceptable = fetch_curl_can_fetch, .setup = fetch_curl_setup, .start = fetch_curl_start, .abort = fetch_curl_abort, .free = fetch_curl_free, .poll = fetch_curl_poll, .fdset = fetch_curl_fdset, .finalise = fetch_curl_finalise }; LOG("curl_version %s", curl_version()); code = curl_global_init(CURL_GLOBAL_ALL); if (code != CURLE_OK) { LOG("curl_global_init failed."); return NSERROR_INIT_FAILED; } fetch_curl_multi = curl_multi_init(); if (!fetch_curl_multi) { LOG("curl_multi_init failed."); return NSERROR_INIT_FAILED; } #if LIBCURL_VERSION_NUM >= 0x071e00 /* built against 7.30.0 or later: configure caching */ { CURLMcode mcode; int maxconnects = nsoption_int(max_fetchers) + nsoption_int(max_cached_fetch_handles); #undef SETOPT #define SETOPT(option, value) \ mcode = curl_multi_setopt(fetch_curl_multi, option, value); \ if (mcode != CURLM_OK) \ goto curl_multi_setopt_failed; SETOPT(CURLMOPT_MAXCONNECTS, maxconnects); SETOPT(CURLMOPT_MAX_TOTAL_CONNECTIONS, maxconnects); SETOPT(CURLMOPT_MAX_HOST_CONNECTIONS, nsoption_int(max_fetchers_per_host)); } #endif /* Create a curl easy handle with the options that are common to all * fetches. */ fetch_blank_curl = curl_easy_init(); if (!fetch_blank_curl) { LOG("curl_easy_init failed"); return NSERROR_INIT_FAILED; } #undef SETOPT #define SETOPT(option, value) \ code = curl_easy_setopt(fetch_blank_curl, option, value); \ if (code != CURLE_OK) \ goto curl_easy_setopt_failed; if (verbose_log) { SETOPT(CURLOPT_VERBOSE, 1); } else { SETOPT(CURLOPT_VERBOSE, 0); } SETOPT(CURLOPT_ERRORBUFFER, fetch_error_buffer); if (nsoption_bool(suppress_curl_debug)) { SETOPT(CURLOPT_DEBUGFUNCTION, fetch_curl_ignore_debug); } SETOPT(CURLOPT_WRITEFUNCTION, fetch_curl_data); SETOPT(CURLOPT_HEADERFUNCTION, fetch_curl_header); SETOPT(CURLOPT_PROGRESSFUNCTION, fetch_curl_progress); SETOPT(CURLOPT_NOPROGRESS, 0); SETOPT(CURLOPT_USERAGENT, user_agent_string()); SETOPT(CURLOPT_ENCODING, "gzip"); SETOPT(CURLOPT_LOW_SPEED_LIMIT, 1L); SETOPT(CURLOPT_LOW_SPEED_TIME, 180L); SETOPT(CURLOPT_NOSIGNAL, 1L); SETOPT(CURLOPT_CONNECTTIMEOUT, nsoption_uint(curl_fetch_timeout)); if (nsoption_charp(ca_bundle) && strcmp(nsoption_charp(ca_bundle), "")) { LOG("ca_bundle: '%s'", nsoption_charp(ca_bundle)); SETOPT(CURLOPT_CAINFO, nsoption_charp(ca_bundle)); } if (nsoption_charp(ca_path) && strcmp(nsoption_charp(ca_path), "")) { LOG("ca_path: '%s'", nsoption_charp(ca_path)); SETOPT(CURLOPT_CAPATH, nsoption_charp(ca_path)); } /* Detect whether the SSL CTX function API works */ curl_with_openssl = true; code = curl_easy_setopt(fetch_blank_curl, CURLOPT_SSL_CTX_FUNCTION, NULL); if (code != CURLE_OK) { curl_with_openssl = false; } LOG("cURL %slinked against openssl", curl_with_openssl ? "" : "not "); /* cURL initialised okay, register the fetchers */ data = curl_version_info(CURLVERSION_NOW); for (i = 0; data->protocols[i]; i++) { if (strcmp(data->protocols[i], "http") == 0) { scheme = lwc_string_ref(corestring_lwc_http); } else if (strcmp(data->protocols[i], "https") == 0) { scheme = lwc_string_ref(corestring_lwc_https); } else { /* Ignore non-http(s) protocols */ continue; } if (fetcher_add(scheme, &fetcher_ops) != NSERROR_OK) { LOG("Unable to register cURL fetcher for %s", data->protocols[i]); } } return NSERROR_OK; curl_easy_setopt_failed: LOG("curl_easy_setopt failed."); return NSERROR_INIT_FAILED; #if LIBCURL_VERSION_NUM >= 0x071e00 curl_multi_setopt_failed: LOG("curl_multi_setopt failed."); return NSERROR_INIT_FAILED; #endif }