@wooksjs/http-proxy 0.4.24 → 0.4.27
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/README.md +43 -43
- package/dist/index.cjs +15 -30
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +15 -30
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -22,8 +22,8 @@ Wooks Proxy is composable proxy for [@wooksjs/event-http](https://github.com/woo
|
|
|
22
22
|
```ts
|
|
23
23
|
import { useProxy } from '@wooksjs/http-proxy'
|
|
24
24
|
app.get('/to-proxy', () => {
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
const proxy = useProxy()
|
|
26
|
+
return proxy('https://target-website.com/target-path?query=123')
|
|
27
27
|
})
|
|
28
28
|
```
|
|
29
29
|
|
|
@@ -32,11 +32,11 @@ app.get('/to-proxy', () => {
|
|
|
32
32
|
```ts
|
|
33
33
|
import { useProxy } from '@wooksjs/http-proxy'
|
|
34
34
|
app.get('/to-proxy', () => {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
const proxy = useProxy()
|
|
36
|
+
return proxy('https://target-website.com/target-path?query=123', {
|
|
37
|
+
reqHeaders: { block: ['referer'] }, // block referer header
|
|
38
|
+
reqCookies: { block: '*' }, // block all req cookies
|
|
39
|
+
})
|
|
40
40
|
})
|
|
41
41
|
```
|
|
42
42
|
|
|
@@ -47,10 +47,10 @@ It's easy as `proxy` returns fetch response
|
|
|
47
47
|
```ts
|
|
48
48
|
import { useProxy } from '@wooksjs/http-proxy'
|
|
49
49
|
app.get('/to-proxy', async () => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
const proxy = useProxy()
|
|
51
|
+
const response = proxy('https://mayapi.com/json-api')
|
|
52
|
+
const data = { ...(await response.json()), newField: 'new value' }
|
|
53
|
+
return data
|
|
54
54
|
})
|
|
55
55
|
```
|
|
56
56
|
|
|
@@ -61,38 +61,38 @@ import { useProxy } from '@wooksjs/http-proxy'
|
|
|
61
61
|
import { useRequest } from '@wooksjs/composables'
|
|
62
62
|
//...
|
|
63
63
|
app.get('*', async () => {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
64
|
+
const proxy = useProxy()
|
|
65
|
+
const { url } = useRequest()
|
|
66
|
+
const fetchResponse = await proxy('https://www.google.com' + url, {
|
|
67
|
+
// optional method, be default is set with
|
|
68
|
+
// the original request method
|
|
69
|
+
method: 'GET',
|
|
70
|
+
|
|
71
|
+
// the next four options help to filter out
|
|
72
|
+
// request/response headers/cookies
|
|
73
|
+
// each of the option accepts an object with:
|
|
74
|
+
// - allow: '*' | (string | RegExp)[] - a list to allow (default '*')
|
|
75
|
+
// - block: '*' | (string | RegExp)[] - a list to block
|
|
76
|
+
// - overwrite: Record<string| string> | ((data: object) -> object) - object or fn to overwrite data
|
|
77
|
+
reqHeaders: { block: ['referer'] },
|
|
78
|
+
reqCookies: { allow: ['cookie-to-pass-upstream'] },
|
|
79
|
+
resHeaders: { overwrite: { 'x-proxied-by': 'wooks-proxy' } },
|
|
80
|
+
resCookies: { allow: ['cookie-to-pass-downstream'] },
|
|
81
|
+
|
|
82
|
+
// debug: true - will print proxy paths and headers/cookies
|
|
83
|
+
debug: true,
|
|
84
|
+
})
|
|
85
|
+
return fetchResponse // fetch response is supported, the body will be downstreamed
|
|
86
|
+
|
|
87
|
+
// > you can also return fully buffered body as Uint8Array
|
|
88
|
+
// return new Uint8Array(await fetchResponse.arrayBuffer())
|
|
89
|
+
|
|
90
|
+
// > or as string
|
|
91
|
+
// return fetchResponse.text()
|
|
92
|
+
|
|
93
|
+
// > or change response before return
|
|
94
|
+
// const data = await fetchResponse.text() + '<new data>'
|
|
95
|
+
// return data
|
|
96
96
|
})
|
|
97
97
|
//...
|
|
98
98
|
```
|
package/dist/index.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var nodeFetchNative = require('node-fetch-native');
|
|
4
|
-
var eventHttp = require('@wooksjs/event-http');
|
|
5
3
|
var eventCore = require('@wooksjs/event-core');
|
|
4
|
+
var eventHttp = require('@wooksjs/event-http');
|
|
5
|
+
var nodeFetchNative = require('node-fetch-native');
|
|
6
6
|
|
|
7
7
|
class IterableRecords {
|
|
8
8
|
constructor() {
|
|
@@ -51,25 +51,17 @@ function applyProxyControls(records, controls, additionalBlockers) {
|
|
|
51
51
|
const add = block !== '*' &&
|
|
52
52
|
(!additionalBlockers || !additionalBlockers.includes(name)) &&
|
|
53
53
|
(defaultedAllow === '*' ||
|
|
54
|
-
defaultedAllow.find(
|
|
55
|
-
name.toLowerCase() === item.toLowerCase()) ||
|
|
54
|
+
defaultedAllow.find(item => (typeof item === 'string' && name.toLowerCase() === item.toLowerCase()) ||
|
|
56
55
|
(item instanceof RegExp && item.test(name)))) &&
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
name.toLowerCase() === item.toLowerCase()) ||
|
|
60
|
-
(item instanceof RegExp && item.test(name))));
|
|
56
|
+
!block?.find(item => (typeof item === 'string' && name.toLowerCase() === item.toLowerCase()) ||
|
|
57
|
+
(item instanceof RegExp && item.test(name)));
|
|
61
58
|
if (add) {
|
|
62
59
|
result[name] = value;
|
|
63
60
|
}
|
|
64
61
|
}
|
|
65
62
|
}
|
|
66
63
|
if (overwrite) {
|
|
67
|
-
|
|
68
|
-
result = overwrite(result);
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
result = { ...result, ...overwrite };
|
|
72
|
-
}
|
|
64
|
+
result = typeof overwrite === 'function' ? overwrite(result) : { ...result, ...overwrite };
|
|
73
65
|
}
|
|
74
66
|
return result;
|
|
75
67
|
}
|
|
@@ -81,11 +73,7 @@ const reqHeadersToBlock = [
|
|
|
81
73
|
'upgrade-insecure-requests',
|
|
82
74
|
'cookie',
|
|
83
75
|
];
|
|
84
|
-
const resHeadersToBlock = [
|
|
85
|
-
'transfer-encoding',
|
|
86
|
-
'content-encoding',
|
|
87
|
-
'set-cookie',
|
|
88
|
-
];
|
|
76
|
+
const resHeadersToBlock = ['transfer-encoding', 'content-encoding', 'set-cookie'];
|
|
89
77
|
function useProxy() {
|
|
90
78
|
const status = eventHttp.useStatus();
|
|
91
79
|
const { setHeader, headers: getSetHeaders } = eventHttp.useSetHeaders();
|
|
@@ -99,26 +87,24 @@ function useProxy() {
|
|
|
99
87
|
const url = new URL(path, targetUrl.origin).toString() + targetUrl.search;
|
|
100
88
|
const modifiedHeaders = { ...req.headers, host: targetUrl.hostname };
|
|
101
89
|
const headers = opts?.reqHeaders
|
|
102
|
-
? applyProxyControls(new HeadersIterable(modifiedHeaders), opts
|
|
90
|
+
? applyProxyControls(new HeadersIterable(modifiedHeaders), opts.reqHeaders, reqHeadersToBlock)
|
|
103
91
|
: {};
|
|
104
92
|
const cookies = opts?.reqCookies && req.headers.cookie
|
|
105
|
-
? applyProxyControls(new CookiesIterable(req.headers.cookie), opts
|
|
93
|
+
? applyProxyControls(new CookiesIterable(req.headers.cookie), opts.reqCookies)
|
|
106
94
|
: null;
|
|
107
95
|
if (cookies) {
|
|
108
96
|
headers.cookie = Object.entries(cookies)
|
|
109
|
-
.map(
|
|
97
|
+
.map(v => v.join('='))
|
|
110
98
|
.join('; ');
|
|
111
99
|
}
|
|
112
100
|
const method = opts?.method || req.method;
|
|
113
101
|
if (opts?.debug) {
|
|
114
102
|
logger.info(`${'[32m'}${req.method} ${req.url}${'[33m'} → ${'[36m'}${method} ${url}${'[33m'}`);
|
|
115
|
-
logger.info('[33m'
|
|
103
|
+
logger.info(`${'[33m'}headers:`, JSON.stringify(headers, null, ' '), '[39m');
|
|
116
104
|
}
|
|
117
105
|
const resp = await nodeFetchNative.fetch(url, {
|
|
118
106
|
method,
|
|
119
|
-
body: ['GET', 'HEAD'].includes(method)
|
|
120
|
-
? undefined
|
|
121
|
-
: req,
|
|
107
|
+
body: ['GET', 'HEAD'].includes(method) ? undefined : req,
|
|
122
108
|
headers: headers,
|
|
123
109
|
});
|
|
124
110
|
status.value = resp.status;
|
|
@@ -127,10 +113,10 @@ function useProxy() {
|
|
|
127
113
|
logger.info(`${'[33m'}response headers:${'[39m'}`);
|
|
128
114
|
}
|
|
129
115
|
const resHeaders = opts?.resHeaders
|
|
130
|
-
? applyProxyControls(resp.headers.entries(), opts
|
|
116
|
+
? applyProxyControls(resp.headers.entries(), opts.resHeaders, resHeadersToBlock)
|
|
131
117
|
: null;
|
|
132
118
|
const resCookies = opts?.resCookies
|
|
133
|
-
? applyProxyControls(new CookiesIterable(resp.headers.get('set-cookie') || ''), opts
|
|
119
|
+
? applyProxyControls(new CookiesIterable(resp.headers.get('set-cookie') || ''), opts.resCookies)
|
|
134
120
|
: null;
|
|
135
121
|
if (resHeaders) {
|
|
136
122
|
for (const [name, value] of Object.entries(resHeaders)) {
|
|
@@ -143,8 +129,7 @@ function useProxy() {
|
|
|
143
129
|
}
|
|
144
130
|
}
|
|
145
131
|
if (resCookies) {
|
|
146
|
-
setHeadersObject['set-cookie'] = (setHeadersObject['set-cookie'] ||
|
|
147
|
-
[]);
|
|
132
|
+
setHeadersObject['set-cookie'] = (setHeadersObject['set-cookie'] || []);
|
|
148
133
|
for (const [name, value] of Object.entries(resCookies)) {
|
|
149
134
|
if (name) {
|
|
150
135
|
setHeadersObject['set-cookie'].push(`${name}=${value}`);
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
interface TWooksProxyControls {
|
|
2
2
|
overwrite?: Record<string, string> | ((data: Record<string, string>) => Record<string, string>);
|
|
3
|
-
allow?:
|
|
4
|
-
block?:
|
|
3
|
+
allow?: Array<string | RegExp> | '*';
|
|
4
|
+
block?: Array<string | RegExp> | '*';
|
|
5
5
|
}
|
|
6
6
|
interface TWooksProxyOptions {
|
|
7
7
|
method?: string;
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { fetch } from 'node-fetch-native';
|
|
2
|
-
import { useStatus, useSetHeaders, useHttpContext } from '@wooksjs/event-http';
|
|
3
1
|
import { useEventLogger } from '@wooksjs/event-core';
|
|
2
|
+
import { useStatus, useSetHeaders, useHttpContext } from '@wooksjs/event-http';
|
|
3
|
+
import { fetch } from 'node-fetch-native';
|
|
4
4
|
|
|
5
5
|
class IterableRecords {
|
|
6
6
|
constructor() {
|
|
@@ -49,25 +49,17 @@ function applyProxyControls(records, controls, additionalBlockers) {
|
|
|
49
49
|
const add = block !== '*' &&
|
|
50
50
|
(!additionalBlockers || !additionalBlockers.includes(name)) &&
|
|
51
51
|
(defaultedAllow === '*' ||
|
|
52
|
-
defaultedAllow.find(
|
|
53
|
-
name.toLowerCase() === item.toLowerCase()) ||
|
|
52
|
+
defaultedAllow.find(item => (typeof item === 'string' && name.toLowerCase() === item.toLowerCase()) ||
|
|
54
53
|
(item instanceof RegExp && item.test(name)))) &&
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
name.toLowerCase() === item.toLowerCase()) ||
|
|
58
|
-
(item instanceof RegExp && item.test(name))));
|
|
54
|
+
!block?.find(item => (typeof item === 'string' && name.toLowerCase() === item.toLowerCase()) ||
|
|
55
|
+
(item instanceof RegExp && item.test(name)));
|
|
59
56
|
if (add) {
|
|
60
57
|
result[name] = value;
|
|
61
58
|
}
|
|
62
59
|
}
|
|
63
60
|
}
|
|
64
61
|
if (overwrite) {
|
|
65
|
-
|
|
66
|
-
result = overwrite(result);
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
result = { ...result, ...overwrite };
|
|
70
|
-
}
|
|
62
|
+
result = typeof overwrite === 'function' ? overwrite(result) : { ...result, ...overwrite };
|
|
71
63
|
}
|
|
72
64
|
return result;
|
|
73
65
|
}
|
|
@@ -79,11 +71,7 @@ const reqHeadersToBlock = [
|
|
|
79
71
|
'upgrade-insecure-requests',
|
|
80
72
|
'cookie',
|
|
81
73
|
];
|
|
82
|
-
const resHeadersToBlock = [
|
|
83
|
-
'transfer-encoding',
|
|
84
|
-
'content-encoding',
|
|
85
|
-
'set-cookie',
|
|
86
|
-
];
|
|
74
|
+
const resHeadersToBlock = ['transfer-encoding', 'content-encoding', 'set-cookie'];
|
|
87
75
|
function useProxy() {
|
|
88
76
|
const status = useStatus();
|
|
89
77
|
const { setHeader, headers: getSetHeaders } = useSetHeaders();
|
|
@@ -97,26 +85,24 @@ function useProxy() {
|
|
|
97
85
|
const url = new URL(path, targetUrl.origin).toString() + targetUrl.search;
|
|
98
86
|
const modifiedHeaders = { ...req.headers, host: targetUrl.hostname };
|
|
99
87
|
const headers = opts?.reqHeaders
|
|
100
|
-
? applyProxyControls(new HeadersIterable(modifiedHeaders), opts
|
|
88
|
+
? applyProxyControls(new HeadersIterable(modifiedHeaders), opts.reqHeaders, reqHeadersToBlock)
|
|
101
89
|
: {};
|
|
102
90
|
const cookies = opts?.reqCookies && req.headers.cookie
|
|
103
|
-
? applyProxyControls(new CookiesIterable(req.headers.cookie), opts
|
|
91
|
+
? applyProxyControls(new CookiesIterable(req.headers.cookie), opts.reqCookies)
|
|
104
92
|
: null;
|
|
105
93
|
if (cookies) {
|
|
106
94
|
headers.cookie = Object.entries(cookies)
|
|
107
|
-
.map(
|
|
95
|
+
.map(v => v.join('='))
|
|
108
96
|
.join('; ');
|
|
109
97
|
}
|
|
110
98
|
const method = opts?.method || req.method;
|
|
111
99
|
if (opts?.debug) {
|
|
112
100
|
logger.info(`${'[32m'}${req.method} ${req.url}${'[33m'} → ${'[36m'}${method} ${url}${'[33m'}`);
|
|
113
|
-
logger.info('[33m'
|
|
101
|
+
logger.info(`${'[33m'}headers:`, JSON.stringify(headers, null, ' '), '[39m');
|
|
114
102
|
}
|
|
115
103
|
const resp = await fetch(url, {
|
|
116
104
|
method,
|
|
117
|
-
body: ['GET', 'HEAD'].includes(method)
|
|
118
|
-
? undefined
|
|
119
|
-
: req,
|
|
105
|
+
body: ['GET', 'HEAD'].includes(method) ? undefined : req,
|
|
120
106
|
headers: headers,
|
|
121
107
|
});
|
|
122
108
|
status.value = resp.status;
|
|
@@ -125,10 +111,10 @@ function useProxy() {
|
|
|
125
111
|
logger.info(`${'[33m'}response headers:${'[39m'}`);
|
|
126
112
|
}
|
|
127
113
|
const resHeaders = opts?.resHeaders
|
|
128
|
-
? applyProxyControls(resp.headers.entries(), opts
|
|
114
|
+
? applyProxyControls(resp.headers.entries(), opts.resHeaders, resHeadersToBlock)
|
|
129
115
|
: null;
|
|
130
116
|
const resCookies = opts?.resCookies
|
|
131
|
-
? applyProxyControls(new CookiesIterable(resp.headers.get('set-cookie') || ''), opts
|
|
117
|
+
? applyProxyControls(new CookiesIterable(resp.headers.get('set-cookie') || ''), opts.resCookies)
|
|
132
118
|
: null;
|
|
133
119
|
if (resHeaders) {
|
|
134
120
|
for (const [name, value] of Object.entries(resHeaders)) {
|
|
@@ -141,8 +127,7 @@ function useProxy() {
|
|
|
141
127
|
}
|
|
142
128
|
}
|
|
143
129
|
if (resCookies) {
|
|
144
|
-
setHeadersObject['set-cookie'] = (setHeadersObject['set-cookie'] ||
|
|
145
|
-
[]);
|
|
130
|
+
setHeadersObject['set-cookie'] = (setHeadersObject['set-cookie'] || []);
|
|
146
131
|
for (const [name, value] of Object.entries(resCookies)) {
|
|
147
132
|
if (name) {
|
|
148
133
|
setHeadersObject['set-cookie'].push(`${name}=${value}`);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wooksjs/http-proxy",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.27",
|
|
4
4
|
"description": "Proxy Wooks composable",
|
|
5
5
|
"main": "dist/index.cjs",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"url": "https://github.com/wooksjs/wooksjs/issues"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
|
-
"@wooksjs/event-http": "0.4.
|
|
43
|
-
"@wooksjs/event-core": "0.4.
|
|
42
|
+
"@wooksjs/event-http": "0.4.27",
|
|
43
|
+
"@wooksjs/event-core": "0.4.27"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"node-fetch-native": "^1.0.1"
|