mirror of
https://github.com/ading2210/libcurl.js.git
synced 2025-05-12 14:00:01 -04:00
implement redirect and referrer support
This commit is contained in:
parent
8aedbcb6b3
commit
741df8fdcf
3 changed files with 32 additions and 4 deletions
1
client/errors.h
Normal file
1
client/errors.h
Normal file
|
@ -0,0 +1 @@
|
||||||
|
#define ERROR_REDIRECT_DISALLOWED -1
|
|
@ -3,8 +3,9 @@
|
||||||
#include <emscripten.h>
|
#include <emscripten.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <curl/curl.h>
|
#include "curl/curl.h"
|
||||||
#include <cjson/cJSON.h>
|
#include "cjson/cJSON.h"
|
||||||
|
#include "errors.h"
|
||||||
|
|
||||||
typedef void(*DataCallback)(char* chunk_ptr, int chunk_size);
|
typedef void(*DataCallback)(char* chunk_ptr, int chunk_size);
|
||||||
typedef void(*EndCallback)(int error);
|
typedef void(*EndCallback)(int error);
|
||||||
|
@ -24,6 +25,7 @@ void perform_request(const char* url, const char* json_params, DataCallback data
|
||||||
CURL *http_handle;
|
CURL *http_handle;
|
||||||
CURLM *multi_handle;
|
CURLM *multi_handle;
|
||||||
int still_running = 1;
|
int still_running = 1;
|
||||||
|
int abort_on_redirect = 0;
|
||||||
|
|
||||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||||
http_handle = curl_easy_init();
|
http_handle = curl_easy_init();
|
||||||
|
@ -70,6 +72,20 @@ void perform_request(const char* url, const char* json_params, DataCallback data
|
||||||
|
|
||||||
curl_easy_setopt(http_handle, CURLOPT_HTTPHEADER, headers_list);
|
curl_easy_setopt(http_handle, CURLOPT_HTTPHEADER, headers_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strcmp(key, "redirect") == 0 && cJSON_IsString(item)) {
|
||||||
|
if (strcmp(item->valuestring, "error") == 0) {
|
||||||
|
abort_on_redirect = 1;
|
||||||
|
curl_easy_setopt(http_handle, CURLOPT_FOLLOWLOCATION, 0);
|
||||||
|
}
|
||||||
|
else if (strcmp(item->valuestring, "manual") == 0) {
|
||||||
|
curl_easy_setopt(http_handle, CURLOPT_FOLLOWLOCATION, 0);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//follow by default
|
||||||
|
curl_easy_setopt(http_handle, CURLOPT_FOLLOWLOCATION, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
cJSON_Delete(json);
|
cJSON_Delete(json);
|
||||||
|
|
||||||
|
@ -99,13 +115,20 @@ void perform_request(const char* url, const char* json_params, DataCallback data
|
||||||
|
|
||||||
} while(still_running);
|
} while(still_running);
|
||||||
|
|
||||||
|
int error = (int) mc;
|
||||||
|
long response_code;
|
||||||
|
curl_easy_getinfo(http_handle, CURLINFO_RESPONSE_CODE, &response_code);
|
||||||
|
|
||||||
|
if (abort_on_redirect && response_code / 100 == 3) {
|
||||||
|
error = ERROR_REDIRECT_DISALLOWED;
|
||||||
|
}
|
||||||
|
|
||||||
curl_slist_free_all(headers_list);
|
curl_slist_free_all(headers_list);
|
||||||
curl_multi_remove_handle(multi_handle, http_handle);
|
curl_multi_remove_handle(multi_handle, http_handle);
|
||||||
curl_easy_cleanup(http_handle);
|
curl_easy_cleanup(http_handle);
|
||||||
curl_multi_cleanup(multi_handle);
|
curl_multi_cleanup(multi_handle);
|
||||||
curl_global_cleanup();
|
curl_global_cleanup();
|
||||||
|
|
||||||
int error = (int) mc;
|
|
||||||
(*end_callback)(error);
|
(*end_callback)(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ function perform_request(url, params, js_data_callback, js_end_callback, body=nu
|
||||||
if (body_ptr) _free(body_ptr);
|
if (body_ptr) _free(body_ptr);
|
||||||
_free(url_ptr);
|
_free(url_ptr);
|
||||||
|
|
||||||
if (error) console.error("request failed with error code "+error);
|
if (error != 0) console.error("request failed with error code " + error);
|
||||||
js_end_callback(error);
|
js_end_callback(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,6 +94,10 @@ function libcurl_fetch(url, params={}) {
|
||||||
}
|
}
|
||||||
params.body = true;
|
params.body = true;
|
||||||
}
|
}
|
||||||
|
if (params.referer) {
|
||||||
|
if (!params.headers) params.headers = {};
|
||||||
|
params.headers["Referer"] = params.referer;
|
||||||
|
}
|
||||||
|
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
let chunks = [];
|
let chunks = [];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue