@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.
Files changed (41) hide show
  1. package/binding.gyp +89 -0
  2. package/dist/src/export.d.ts +3 -0
  3. package/dist/src/export.js +8 -0
  4. package/dist/src/export.js.map +1 -0
  5. package/dist/src/fetch.d.ts +32 -0
  6. package/dist/src/fetch.js +90 -0
  7. package/dist/src/fetch.js.map +1 -0
  8. package/dist/src/index.d.ts +2 -0
  9. package/dist/src/index.js +5 -0
  10. package/dist/src/index.js.map +1 -0
  11. package/dist/src/libcurl.d.ts +31 -0
  12. package/dist/src/libcurl.js +149 -0
  13. package/dist/src/libcurl.js.map +1 -0
  14. package/index.js +1 -0
  15. package/package.json +29 -0
  16. package/readme.md +68 -0
  17. package/src/export.ts +4 -0
  18. package/src/fetch.ts +116 -0
  19. package/src/libcurl/bao_curl.cpp +263 -0
  20. package/src/libcurl/bao_curl_node_addon.cpp +427 -0
  21. package/src/libcurl/curlAsyncWorker.cpp +31 -0
  22. package/src/libcurl/include/bao_curl.h +82 -0
  23. package/src/libcurl/include/curl/Makefile.am +39 -0
  24. package/src/libcurl/include/curl/curl.h +3103 -0
  25. package/src/libcurl/include/curl/curlver.h +77 -0
  26. package/src/libcurl/include/curl/easy.h +123 -0
  27. package/src/libcurl/include/curl/mprintf.h +50 -0
  28. package/src/libcurl/include/curl/multi.h +457 -0
  29. package/src/libcurl/include/curl/options.h +68 -0
  30. package/src/libcurl/include/curl/stdcheaders.h +33 -0
  31. package/src/libcurl/include/curl/system.h +504 -0
  32. package/src/libcurl/include/curl/typecheck-gcc.h +707 -0
  33. package/src/libcurl/include/curl/urlapi.h +145 -0
  34. package/src/libcurl/include/curlAysncWorker.h +14 -0
  35. package/src/libcurl/include/request_tls_utils.h +30 -0
  36. package/src/libcurl/include/utils.h +13 -0
  37. package/src/libcurl/lib/Release/libcurl.dll +0 -0
  38. package/src/libcurl/lib/Release/libcurl_imp.lib +0 -0
  39. package/src/libcurl/utils.cpp +41 -0
  40. package/src/libcurl.ts +235 -0
  41. 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,3 @@
1
+ import { LibCurl } from "./libcurl";
2
+ import { fetch } from "./fetch";
3
+ export { LibCurl, fetch };
@@ -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,2 @@
1
+ import { LibCurl } from './libcurl';
2
+ export { LibCurl };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const libcurl_1 = require("./libcurl");
4
+ exports.default = libcurl_1.LibCurl;
5
+ //# sourceMappingURL=index.js.map
@@ -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
@@ -0,0 +1,4 @@
1
+ import { LibCurl } from "./libcurl";
2
+ import { fetch } from "./fetch"
3
+
4
+ export { LibCurl, fetch };
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
+ }