@ossiana/node-libcurl 1.0.6-alpha-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/binding.gyp +89 -0
- package/dist/src/export.d.ts +3 -0
- package/dist/src/export.js +8 -0
- package/dist/src/export.js.map +1 -0
- package/dist/src/fetch.d.ts +32 -0
- package/dist/src/fetch.js +90 -0
- package/dist/src/fetch.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/libcurl.d.ts +31 -0
- package/dist/src/libcurl.js +149 -0
- package/dist/src/libcurl.js.map +1 -0
- package/index.js +1 -0
- package/package.json +29 -0
- package/readme.md +68 -0
- package/src/export.ts +4 -0
- package/src/fetch.ts +116 -0
- package/src/libcurl/bao_curl.cpp +263 -0
- package/src/libcurl/bao_curl_node_addon.cpp +427 -0
- package/src/libcurl/curlAsyncWorker.cpp +31 -0
- package/src/libcurl/include/bao_curl.h +82 -0
- package/src/libcurl/include/curl/Makefile.am +39 -0
- package/src/libcurl/include/curl/curl.h +3103 -0
- package/src/libcurl/include/curl/curlver.h +77 -0
- package/src/libcurl/include/curl/easy.h +123 -0
- package/src/libcurl/include/curl/mprintf.h +50 -0
- package/src/libcurl/include/curl/multi.h +457 -0
- package/src/libcurl/include/curl/options.h +68 -0
- package/src/libcurl/include/curl/stdcheaders.h +33 -0
- package/src/libcurl/include/curl/system.h +504 -0
- package/src/libcurl/include/curl/typecheck-gcc.h +707 -0
- package/src/libcurl/include/curl/urlapi.h +145 -0
- package/src/libcurl/include/curlAysncWorker.h +14 -0
- package/src/libcurl/include/request_tls_utils.h +30 -0
- package/src/libcurl/include/utils.h +13 -0
- package/src/libcurl/lib/Release/libcurl.dll +0 -0
- package/src/libcurl/lib/Release/libcurl_imp.lib +0 -0
- package/src/libcurl/utils.cpp +41 -0
- package/src/libcurl.ts +235 -0
- package/tsconfig.json +31 -0
package/binding.gyp
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
{
|
|
2
|
+
'variables': {
|
|
3
|
+
'libcurl_libraries%': '',
|
|
4
|
+
},
|
|
5
|
+
"targets": [
|
|
6
|
+
{
|
|
7
|
+
"target_name": "bao_curl_node_addon",
|
|
8
|
+
"cflags!": [],
|
|
9
|
+
"cflags_cc!": [],
|
|
10
|
+
"sources": [
|
|
11
|
+
"./src/libcurl/bao_curl_node_addon.cpp",
|
|
12
|
+
"./src/libcurl/bao_curl.cpp",
|
|
13
|
+
"./src/libcurl/utils.cpp",
|
|
14
|
+
"./src/libcurl/curlAsyncWorker.cpp",
|
|
15
|
+
],
|
|
16
|
+
"include_dirs": [
|
|
17
|
+
"<!@(node -p \"require('node-addon-api').include\")",
|
|
18
|
+
"./src/libcurl/include"
|
|
19
|
+
],
|
|
20
|
+
'defines': ["NAPI_CPP_EXCEPTIONS",
|
|
21
|
+
"CURL_STATICLIB",
|
|
22
|
+
"NGHTTP2_STATICLIB"],
|
|
23
|
+
'conditions':[
|
|
24
|
+
['OS=="win"', {
|
|
25
|
+
|
|
26
|
+
"configurations": {
|
|
27
|
+
'Release': {
|
|
28
|
+
'msvs_settings': {
|
|
29
|
+
'VCCLCompilerTool': {
|
|
30
|
+
'DisableSpecificWarnings':['4530','4819'],
|
|
31
|
+
'RuntimeLibrary': '2',
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
'Debug': {
|
|
36
|
+
'msvs_settings': {
|
|
37
|
+
'VCCLCompilerTool': {
|
|
38
|
+
'DisableSpecificWarnings':['4530','4819'],
|
|
39
|
+
'RuntimeLibrary': '3',
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
'libraries': [
|
|
45
|
+
# "<(module_root_dir)/src/libcurl/lib/Debug/libcurl-d_imp.lib"
|
|
46
|
+
"<(module_root_dir)/src/libcurl/lib/Release/libcurl_imp.lib"
|
|
47
|
+
],
|
|
48
|
+
"copies": [
|
|
49
|
+
# {
|
|
50
|
+
# "destination": "<(module_root_dir)/build/Debug/",
|
|
51
|
+
# "files": [
|
|
52
|
+
# "<(module_root_dir)/src/libcurl/lib/Debug/libcurl-d.dll"
|
|
53
|
+
# ]
|
|
54
|
+
# },
|
|
55
|
+
{
|
|
56
|
+
"destination": "<(module_root_dir)/build/Release/",
|
|
57
|
+
"files": [
|
|
58
|
+
"<(module_root_dir)/src/libcurl/lib/Release/libcurl.dll"
|
|
59
|
+
]
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
|
|
63
|
+
}]
|
|
64
|
+
],
|
|
65
|
+
|
|
66
|
+
# "configurations":{
|
|
67
|
+
# "Release": {
|
|
68
|
+
# "msvs_settings": {
|
|
69
|
+
# "VCCLCompilerTool": {
|
|
70
|
+
# # 多线程 DLL (/MD)
|
|
71
|
+
# #'RuntimeLibrary': '2',
|
|
72
|
+
# 'ExceptionHandling': '1',
|
|
73
|
+
# 'Optimization': 2, # /O2 safe optimization
|
|
74
|
+
# 'FavorSizeOrSpeed': 1, # /Ot, favour speed over size
|
|
75
|
+
# 'InlineFunctionExpansion': 2, # /Ob2, inline anything eligible
|
|
76
|
+
# # /GL, whole program optimization, needed for LTCG
|
|
77
|
+
# 'WholeProgramOptimization': 'true',
|
|
78
|
+
# 'OmitFramePointers': 'true',
|
|
79
|
+
# 'EnableFunctionLevelLinking': 'true',
|
|
80
|
+
# 'EnableIntrinsicFunctions': 'true',
|
|
81
|
+
# 'AdditionalOptions':[
|
|
82
|
+
# ]
|
|
83
|
+
# }
|
|
84
|
+
# }
|
|
85
|
+
# }
|
|
86
|
+
# }
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fetch = exports.LibCurl = void 0;
|
|
4
|
+
const libcurl_1 = require("./libcurl");
|
|
5
|
+
Object.defineProperty(exports, "LibCurl", { enumerable: true, get: function () { return libcurl_1.LibCurl; } });
|
|
6
|
+
const fetch_1 = require("./fetch");
|
|
7
|
+
Object.defineProperty(exports, "fetch", { enumerable: true, get: function () { return fetch_1.fetch; } });
|
|
8
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/export.ts"],"names":[],"mappings":";;;AAAA,uCAAoC;AAG3B,wFAHA,iBAAO,OAGA;AAFhB,mCAA+B;AAEb,sFAFT,aAAK,OAES"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { LibCurl, LibCurl_HTTP_VERSION } from "./libcurl";
|
|
2
|
+
type LibCurlHeadersInfo = [string, string][] | object | string;
|
|
3
|
+
type LibCurlBodyInfo = string | Uint8Array | any;
|
|
4
|
+
type LibCurlCookiesInfo = string | object;
|
|
5
|
+
type LibCurlHttpVersionInfo = LibCurl_HTTP_VERSION;
|
|
6
|
+
type LibCurlProxyWithAccountInfo = {
|
|
7
|
+
proxy: string;
|
|
8
|
+
username: string;
|
|
9
|
+
password: string;
|
|
10
|
+
};
|
|
11
|
+
type LibCurlProxyInfo = string | LibCurlProxyWithAccountInfo;
|
|
12
|
+
interface LibCurlRequestInfo {
|
|
13
|
+
method?: string;
|
|
14
|
+
headers?: LibCurlHeadersInfo;
|
|
15
|
+
body?: LibCurlBodyInfo;
|
|
16
|
+
redirect?: boolean;
|
|
17
|
+
cookies?: LibCurlCookiesInfo;
|
|
18
|
+
httpVersion?: LibCurlHttpVersionInfo;
|
|
19
|
+
openInnerLog?: boolean;
|
|
20
|
+
proxy?: LibCurlProxyInfo;
|
|
21
|
+
instance?: LibCurl;
|
|
22
|
+
}
|
|
23
|
+
interface LibCurlResponseInfo {
|
|
24
|
+
status: () => number;
|
|
25
|
+
arraybuffer: () => ArrayBuffer;
|
|
26
|
+
text: () => string;
|
|
27
|
+
json: () => object;
|
|
28
|
+
jsonp: (callbackName?: string) => object;
|
|
29
|
+
headers: () => string;
|
|
30
|
+
}
|
|
31
|
+
export declare function fetch(url: string | URL, request: LibCurlRequestInfo): Promise<LibCurlResponseInfo>;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.fetch = void 0;
|
|
13
|
+
const libcurl_1 = require("./libcurl");
|
|
14
|
+
function fetch(url, request) {
|
|
15
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
16
|
+
request.instance || (request.instance = new libcurl_1.LibCurl());
|
|
17
|
+
const curl = request.instance;
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
const { method = "GET", headers = [], redirect = false, httpVersion = 0, openInnerLog = false, proxy, body, cookies } = request;
|
|
20
|
+
curl.open(method, url + '', true);
|
|
21
|
+
if (Array.isArray(headers)) {
|
|
22
|
+
headers.forEach(([key, value]) => {
|
|
23
|
+
curl.setRequestHeader(key, value);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
else if (typeof headers == 'object') {
|
|
27
|
+
Object.keys(headers).forEach((key) => {
|
|
28
|
+
curl.setRequestHeader(key, headers[key]);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
curl.setRequestHeaders(headers);
|
|
33
|
+
}
|
|
34
|
+
if (redirect) {
|
|
35
|
+
curl.setRedirect(true);
|
|
36
|
+
}
|
|
37
|
+
if (httpVersion) {
|
|
38
|
+
curl.setHttpVersion(httpVersion);
|
|
39
|
+
}
|
|
40
|
+
if (openInnerLog) {
|
|
41
|
+
curl.printInnerLogger();
|
|
42
|
+
}
|
|
43
|
+
if (cookies) {
|
|
44
|
+
const { hostname } = new URL(url);
|
|
45
|
+
if (typeof cookies == 'string') {
|
|
46
|
+
cookies.replace(/\s+/g, '')
|
|
47
|
+
.split(';')
|
|
48
|
+
.reverse()
|
|
49
|
+
.map(e => e.split('=', 2))
|
|
50
|
+
.forEach(([key, value]) => {
|
|
51
|
+
curl.setCookie(key, value, hostname);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
Object.keys(cookies).forEach(key => {
|
|
56
|
+
curl.setCookie(key, cookies[key], hostname);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (proxy) {
|
|
61
|
+
if (typeof proxy == "string") {
|
|
62
|
+
curl.setProxy(proxy);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
const { proxy: proxy_, username, password, } = proxy;
|
|
66
|
+
curl.setProxy(proxy_, username, password);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
let promise;
|
|
70
|
+
if (body) {
|
|
71
|
+
promise = curl.send(body);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
promise = curl.send();
|
|
75
|
+
}
|
|
76
|
+
promise.then(() => {
|
|
77
|
+
resolve({
|
|
78
|
+
status: () => curl.getResponseStatus(),
|
|
79
|
+
arraybuffer: () => curl.getResponseBody().buffer,
|
|
80
|
+
text: () => curl.getResponseString(),
|
|
81
|
+
json: () => curl.getResponseJson(),
|
|
82
|
+
jsonp: (callbackName) => curl.getResponseJsonp(callbackName),
|
|
83
|
+
headers: () => curl.getResponseHeaders(),
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
exports.fetch = fetch;
|
|
90
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;AAAA,uCAAmC;AAEnC,kBAAe,iBAAO,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export declare enum LibCurl_HTTP_VERSION {
|
|
2
|
+
http1_1 = 0,
|
|
3
|
+
http2 = 1
|
|
4
|
+
}
|
|
5
|
+
export declare class LibCurl {
|
|
6
|
+
private m_libCurl_impl_;
|
|
7
|
+
private m_isAsync_;
|
|
8
|
+
private m_isSending_;
|
|
9
|
+
constructor();
|
|
10
|
+
private checkSending;
|
|
11
|
+
open(method: string, url: string, async?: boolean): void;
|
|
12
|
+
setRequestHeader(key: string, value: string): void;
|
|
13
|
+
setRequestHeaders(headers: string): void;
|
|
14
|
+
setProxy(proxy: string, username?: string, password?: string): void;
|
|
15
|
+
setTimeout(connectTime: number, sendTime: number): void;
|
|
16
|
+
setCookie(key: string, value: string, domain: string): void;
|
|
17
|
+
removeCookie(key: string, domain: string): void;
|
|
18
|
+
getCookies(): string;
|
|
19
|
+
getCookie(key: string): string;
|
|
20
|
+
getResponseHeaders(): string;
|
|
21
|
+
getResponseStatus(): number;
|
|
22
|
+
reset(): void;
|
|
23
|
+
setRedirect(isAllow: boolean): void;
|
|
24
|
+
printInnerLogger(): void;
|
|
25
|
+
setHttpVersion(version: LibCurl_HTTP_VERSION): void;
|
|
26
|
+
send(body?: string | Uint8Array | any): Promise<undefined> | undefined;
|
|
27
|
+
getResponseBody(): Uint8Array;
|
|
28
|
+
getResponseString(): string;
|
|
29
|
+
getResponseJson(): Object;
|
|
30
|
+
getResponseJsonp(callbackName?: string): Object;
|
|
31
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LibCurl = exports.LibCurl_HTTP_VERSION = void 0;
|
|
7
|
+
const bindings_1 = __importDefault(require("bindings"));
|
|
8
|
+
const { BaoLibCurl } = (0, bindings_1.default)('bao_curl_node_addon');
|
|
9
|
+
var LibCurl_HTTP_VERSION;
|
|
10
|
+
(function (LibCurl_HTTP_VERSION) {
|
|
11
|
+
LibCurl_HTTP_VERSION[LibCurl_HTTP_VERSION["http1_1"] = 0] = "http1_1";
|
|
12
|
+
LibCurl_HTTP_VERSION[LibCurl_HTTP_VERSION["http2"] = 1] = "http2";
|
|
13
|
+
})(LibCurl_HTTP_VERSION = exports.LibCurl_HTTP_VERSION || (exports.LibCurl_HTTP_VERSION = {}));
|
|
14
|
+
class LibCurl {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.m_libCurl_impl_ = new BaoLibCurl();
|
|
17
|
+
}
|
|
18
|
+
checkSending() {
|
|
19
|
+
if (this.m_isSending_) {
|
|
20
|
+
throw new Error('the last request is sending, don\'t send one more request on one instance!');
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
open(method, url, async = true) {
|
|
24
|
+
this.checkSending();
|
|
25
|
+
this.m_libCurl_impl_.open(method, url);
|
|
26
|
+
this.m_isAsync_ = async;
|
|
27
|
+
}
|
|
28
|
+
setRequestHeader(key, value) {
|
|
29
|
+
this.checkSending();
|
|
30
|
+
this.m_libCurl_impl_.setRequestHeader(key, value);
|
|
31
|
+
}
|
|
32
|
+
setRequestHeaders(headers) {
|
|
33
|
+
this.checkSending();
|
|
34
|
+
this.m_libCurl_impl_.setRequestHeaders(headers);
|
|
35
|
+
}
|
|
36
|
+
setProxy(proxy, username, password) {
|
|
37
|
+
this.checkSending();
|
|
38
|
+
if (username && password) {
|
|
39
|
+
this.m_libCurl_impl_.setProxy(proxy, username, password);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
this.m_libCurl_impl_.setProxy(proxy);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
setTimeout(connectTime, sendTime) {
|
|
46
|
+
this.checkSending();
|
|
47
|
+
if (connectTime > sendTime) {
|
|
48
|
+
throw new Error('连接时间大于发送等待时间.');
|
|
49
|
+
}
|
|
50
|
+
this.m_libCurl_impl_.setTimeout(connectTime, sendTime);
|
|
51
|
+
}
|
|
52
|
+
setCookie(key, value, domain) {
|
|
53
|
+
this.checkSending();
|
|
54
|
+
this.m_libCurl_impl_.setCookie(key, value, domain);
|
|
55
|
+
}
|
|
56
|
+
removeCookie(key, domain) {
|
|
57
|
+
this.checkSending();
|
|
58
|
+
this.m_libCurl_impl_.removeCookie(key, domain);
|
|
59
|
+
}
|
|
60
|
+
getCookies() {
|
|
61
|
+
this.checkSending();
|
|
62
|
+
return this.m_libCurl_impl_.getCookies();
|
|
63
|
+
}
|
|
64
|
+
getCookie(key) {
|
|
65
|
+
this.checkSending();
|
|
66
|
+
return this.m_libCurl_impl_.getCookie(key);
|
|
67
|
+
}
|
|
68
|
+
getResponseHeaders() {
|
|
69
|
+
this.checkSending();
|
|
70
|
+
return this.m_libCurl_impl_.getResponseHeaders();
|
|
71
|
+
}
|
|
72
|
+
getResponseStatus() {
|
|
73
|
+
this.checkSending();
|
|
74
|
+
return this.m_libCurl_impl_.getResponseStatus();
|
|
75
|
+
}
|
|
76
|
+
reset() {
|
|
77
|
+
this.checkSending();
|
|
78
|
+
this.m_libCurl_impl_.reset();
|
|
79
|
+
}
|
|
80
|
+
setRedirect(isAllow) {
|
|
81
|
+
this.checkSending();
|
|
82
|
+
this.m_libCurl_impl_.setRedirect(isAllow);
|
|
83
|
+
}
|
|
84
|
+
printInnerLogger() {
|
|
85
|
+
this.checkSending();
|
|
86
|
+
this.m_libCurl_impl_.printInnerLogger();
|
|
87
|
+
}
|
|
88
|
+
setHttpVersion(version) {
|
|
89
|
+
this.checkSending();
|
|
90
|
+
this.m_libCurl_impl_.setHttpVersion(version);
|
|
91
|
+
}
|
|
92
|
+
send(body) {
|
|
93
|
+
this.checkSending();
|
|
94
|
+
this.m_isSending_ = true;
|
|
95
|
+
if (this.m_isAsync_) {
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
97
|
+
const callback = () => {
|
|
98
|
+
this.m_isSending_ = false;
|
|
99
|
+
resolve(void 0);
|
|
100
|
+
};
|
|
101
|
+
if (body) {
|
|
102
|
+
this.m_libCurl_impl_.sendAsync(body, callback);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
this.m_libCurl_impl_.sendAsync(callback);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
if (body) {
|
|
110
|
+
this.m_libCurl_impl_.send(body);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
this.m_libCurl_impl_.send();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
getResponseBody() {
|
|
117
|
+
this.checkSending();
|
|
118
|
+
return this.m_libCurl_impl_.getResponseBody();
|
|
119
|
+
}
|
|
120
|
+
getResponseString() {
|
|
121
|
+
this.checkSending();
|
|
122
|
+
return this.m_libCurl_impl_.getResponseString();
|
|
123
|
+
}
|
|
124
|
+
getResponseJson() {
|
|
125
|
+
this.checkSending();
|
|
126
|
+
return JSON.parse(this.getResponseString());
|
|
127
|
+
}
|
|
128
|
+
getResponseJsonp(callbackName) {
|
|
129
|
+
this.checkSending();
|
|
130
|
+
const str = this.getResponseString();
|
|
131
|
+
let jsonstr = str;
|
|
132
|
+
if (callbackName) {
|
|
133
|
+
[, jsonstr] = new RegExp(`\s*${callbackName}[\s\S]*(.*)[\s\S]*`, 'g').exec(str);
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
try {
|
|
137
|
+
eval(str);
|
|
138
|
+
throw new Error('it seem not a jsonp');
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
[, callbackName] = /(.*) is not defined/g.exec(error.message);
|
|
142
|
+
return this.getResponseJsonp(callbackName);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return eval(jsonstr);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.LibCurl = LibCurl;
|
|
149
|
+
//# sourceMappingURL=libcurl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"libcurl.js","sourceRoot":"","sources":["../../src/libcurl.ts"],"names":[],"mappings":"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"}
|
package/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = require('./dist/src/export.js')
|
package/package.json
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ossiana/node-libcurl",
|
|
3
|
+
"version": "1.0.6-alpha-2",
|
|
4
|
+
"dependencies": {
|
|
5
|
+
"bindings": "^1.5.0",
|
|
6
|
+
"node-addon-api": "^5.0.0",
|
|
7
|
+
"node-gyp": "^9.3.1"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"test": "node ./test/requests_tls.js",
|
|
11
|
+
"build:dev": "node-gyp configure --node_use_openssl=false --openssl_quic=false --node_shared_openssl=false && node-gyp -j 16 build --release",
|
|
12
|
+
"unittest": "mocha"
|
|
13
|
+
},
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@types/node": "^18.11.18",
|
|
16
|
+
"body-parser": "^1.20.1",
|
|
17
|
+
"chai": "^4.3.7",
|
|
18
|
+
"express": "^4.18.2",
|
|
19
|
+
"mocha": "^10.2.0",
|
|
20
|
+
"typescript": "^4.9.4"
|
|
21
|
+
},
|
|
22
|
+
"author": {
|
|
23
|
+
"name": "Ossian"
|
|
24
|
+
},
|
|
25
|
+
"repository": {
|
|
26
|
+
"type": "git",
|
|
27
|
+
"url": "git@github.com/Ossianaa/node-libcurl.git"
|
|
28
|
+
}
|
|
29
|
+
}
|
package/readme.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# node-libcurl
|
|
2
|
+
|
|
3
|
+
## different with Nodejs fetch api
|
|
4
|
+
* JA3 FingerPrint is the same as chrome 108,it modified the BoringSSL extension, set the custom cipher suite with Libcurl
|
|
5
|
+
* Now only support on Windows, linux and MacOS will be supported in the future
|
|
6
|
+
|
|
7
|
+
------------
|
|
8
|
+
## how to build
|
|
9
|
+
> npm i @ossiana/node-libcurl -g
|
|
10
|
+
|
|
11
|
+
#### Some Problems on Windows
|
|
12
|
+
You should install Python 2.7 and the Visual Studio compiler;
|
|
13
|
+
> npm i -g --production windows-build-tools
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
## Use Sample
|
|
18
|
+
|
|
19
|
+
### import
|
|
20
|
+
```javascript
|
|
21
|
+
import { LibCurl, fetch } from '@ossiana/node-libcurl'
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### browser fetch style
|
|
25
|
+
```javascript
|
|
26
|
+
fetch("https://xxx.io/api/graphql/", {
|
|
27
|
+
proxy: "127.0.0.1:8888",
|
|
28
|
+
method: "POST",
|
|
29
|
+
headers: {
|
|
30
|
+
"Host": "xxx.io",
|
|
31
|
+
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
|
|
32
|
+
"Content-Type": "application/json",
|
|
33
|
+
"Referer": "https://xxx.io/",
|
|
34
|
+
"Accept": "*/*",
|
|
35
|
+
"Accept-Encoding": "gzip, deflate, br",
|
|
36
|
+
"Accept-Language": "zh-CN,zh;q=0.9",
|
|
37
|
+
},
|
|
38
|
+
cookies: 'a=b&c=d',//{ a : 'b' ,c : 'd'},
|
|
39
|
+
redirect: true,//if like http status code 302 redirect to 200, then content with status code 200 is returned
|
|
40
|
+
body: { type : "GetStyle" },
|
|
41
|
+
httpVersion: 0,//0 is http1.1, 1 is http2
|
|
42
|
+
openInnerLog: false,//open curl logger
|
|
43
|
+
//instance:curl, //curl connect persistent
|
|
44
|
+
}).then(e => e.json()).then(e => {
|
|
45
|
+
console.log('style is %s', e.style);
|
|
46
|
+
}).catch((err) => {
|
|
47
|
+
console.error('fetch error : %s', err.message);
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
### winhttp style
|
|
54
|
+
```javascript
|
|
55
|
+
const curl = new LibCurl();
|
|
56
|
+
curl.open('POST', 'https://xxx.io/api/graphql/', true);
|
|
57
|
+
curl.setRequestHeaders(`Host: xxx.io
|
|
58
|
+
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36
|
|
59
|
+
Content-Type: application/octet-stream
|
|
60
|
+
Referer: https://opensea.io/
|
|
61
|
+
Accept-Encoding: gzip, deflate, br
|
|
62
|
+
Accept-Language: zh-CN,zh;q=0.9
|
|
63
|
+
`);
|
|
64
|
+
curl.send(new Uint8Array([1, 255, 188]))
|
|
65
|
+
.then(e => {
|
|
66
|
+
console.log(curl.getResponseString());
|
|
67
|
+
});
|
|
68
|
+
```
|
package/src/export.ts
ADDED
package/src/fetch.ts
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { LibCurl, LibCurl_HTTP_VERSION } from "./libcurl";
|
|
2
|
+
|
|
3
|
+
type LibCurlHeadersInfo = [string, string][] | object | string;
|
|
4
|
+
type LibCurlBodyInfo = string | Uint8Array | any;
|
|
5
|
+
type LibCurlCookiesInfo = string | object;
|
|
6
|
+
type LibCurlHttpVersionInfo = LibCurl_HTTP_VERSION;
|
|
7
|
+
|
|
8
|
+
type LibCurlProxyWithAccountInfo = {
|
|
9
|
+
proxy: string;
|
|
10
|
+
username: string;
|
|
11
|
+
password: string;
|
|
12
|
+
};
|
|
13
|
+
type LibCurlProxyInfo = string | LibCurlProxyWithAccountInfo;
|
|
14
|
+
|
|
15
|
+
interface LibCurlRequestInfo {
|
|
16
|
+
method?: string;
|
|
17
|
+
headers?: LibCurlHeadersInfo;
|
|
18
|
+
body?: LibCurlBodyInfo;
|
|
19
|
+
redirect?: boolean;
|
|
20
|
+
cookies?: LibCurlCookiesInfo;
|
|
21
|
+
httpVersion?: LibCurlHttpVersionInfo;
|
|
22
|
+
openInnerLog?: boolean;
|
|
23
|
+
proxy?: LibCurlProxyInfo;
|
|
24
|
+
/**
|
|
25
|
+
* 传入LibCurl实例可以做持久化连接
|
|
26
|
+
*/
|
|
27
|
+
instance?: LibCurl;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
interface LibCurlResponseInfo {
|
|
31
|
+
status: () => number;
|
|
32
|
+
arraybuffer: () => ArrayBuffer;
|
|
33
|
+
text: () => string;
|
|
34
|
+
json: () => object;
|
|
35
|
+
jsonp: (callbackName?: string) => object;
|
|
36
|
+
headers: () => string;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function fetch(url: string | URL, request: LibCurlRequestInfo): Promise<LibCurlResponseInfo> {
|
|
40
|
+
request.instance ||= new LibCurl();
|
|
41
|
+
const curl = request.instance;
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
const { method = "GET",
|
|
44
|
+
headers = [], redirect = false, httpVersion = 0,
|
|
45
|
+
openInnerLog = false, proxy, body, cookies } = request;
|
|
46
|
+
curl.open(method, url + '', true);
|
|
47
|
+
if (Array.isArray(headers)) {
|
|
48
|
+
headers.forEach(([key, value]) => {
|
|
49
|
+
curl.setRequestHeader(key, value);
|
|
50
|
+
});
|
|
51
|
+
} else if (typeof headers == 'object') {
|
|
52
|
+
Object.keys(headers).forEach((key: string) => {
|
|
53
|
+
curl.setRequestHeader(key, headers[key]);
|
|
54
|
+
})
|
|
55
|
+
} else {
|
|
56
|
+
curl.setRequestHeaders(headers);
|
|
57
|
+
}
|
|
58
|
+
if (redirect) {
|
|
59
|
+
curl.setRedirect(true);
|
|
60
|
+
}
|
|
61
|
+
if (httpVersion) {
|
|
62
|
+
curl.setHttpVersion(httpVersion);
|
|
63
|
+
}
|
|
64
|
+
if (openInnerLog) {
|
|
65
|
+
curl.printInnerLogger();
|
|
66
|
+
}
|
|
67
|
+
if (cookies) {
|
|
68
|
+
const { hostname } = new URL(url);
|
|
69
|
+
if (typeof cookies == 'string') {
|
|
70
|
+
cookies.replace(/\s+/g, '')
|
|
71
|
+
.split(';')
|
|
72
|
+
.reverse()//保证顺序不颠倒
|
|
73
|
+
.map(e => e.split('=', 2))
|
|
74
|
+
.forEach(([key, value]) => {
|
|
75
|
+
curl.setCookie(key, value, hostname)
|
|
76
|
+
});
|
|
77
|
+
} else {
|
|
78
|
+
Object.keys(cookies).forEach(key => {
|
|
79
|
+
curl.setCookie(key, cookies[key], hostname);
|
|
80
|
+
})
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (proxy) {
|
|
84
|
+
if (typeof proxy == "string") {
|
|
85
|
+
curl.setProxy(proxy);
|
|
86
|
+
} else {
|
|
87
|
+
const {
|
|
88
|
+
proxy: proxy_,
|
|
89
|
+
username,
|
|
90
|
+
password,
|
|
91
|
+
} = proxy;
|
|
92
|
+
curl.setProxy(proxy_, username, password);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
let promise: Promise<undefined>;
|
|
96
|
+
if (body) {
|
|
97
|
+
promise = curl.send(body);
|
|
98
|
+
} else {
|
|
99
|
+
promise = curl.send();
|
|
100
|
+
}
|
|
101
|
+
promise.then(() => {
|
|
102
|
+
|
|
103
|
+
resolve(
|
|
104
|
+
{
|
|
105
|
+
status: () => curl.getResponseStatus(),
|
|
106
|
+
arraybuffer: () => curl.getResponseBody().buffer,
|
|
107
|
+
text: () => curl.getResponseString(),
|
|
108
|
+
json: () => curl.getResponseJson(),
|
|
109
|
+
jsonp: (callbackName?: string) => curl.getResponseJsonp(callbackName),
|
|
110
|
+
headers: () => curl.getResponseHeaders(),
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
})
|
|
116
|
+
}
|