@wooksjs/http-proxy 0.4.26 → 0.4.28
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 +14 -24
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +14 -24
- 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,13 +51,10 @@ 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
|
}
|
|
@@ -81,11 +78,7 @@ const reqHeadersToBlock = [
|
|
|
81
78
|
'upgrade-insecure-requests',
|
|
82
79
|
'cookie',
|
|
83
80
|
];
|
|
84
|
-
const resHeadersToBlock = [
|
|
85
|
-
'transfer-encoding',
|
|
86
|
-
'content-encoding',
|
|
87
|
-
'set-cookie',
|
|
88
|
-
];
|
|
81
|
+
const resHeadersToBlock = ['transfer-encoding', 'content-encoding', 'set-cookie'];
|
|
89
82
|
function useProxy() {
|
|
90
83
|
const status = eventHttp.useStatus();
|
|
91
84
|
const { setHeader, headers: getSetHeaders } = eventHttp.useSetHeaders();
|
|
@@ -99,26 +92,24 @@ function useProxy() {
|
|
|
99
92
|
const url = new URL(path, targetUrl.origin).toString() + targetUrl.search;
|
|
100
93
|
const modifiedHeaders = { ...req.headers, host: targetUrl.hostname };
|
|
101
94
|
const headers = opts?.reqHeaders
|
|
102
|
-
? applyProxyControls(new HeadersIterable(modifiedHeaders), opts
|
|
95
|
+
? applyProxyControls(new HeadersIterable(modifiedHeaders), opts.reqHeaders, reqHeadersToBlock)
|
|
103
96
|
: {};
|
|
104
97
|
const cookies = opts?.reqCookies && req.headers.cookie
|
|
105
|
-
? applyProxyControls(new CookiesIterable(req.headers.cookie), opts
|
|
98
|
+
? applyProxyControls(new CookiesIterable(req.headers.cookie), opts.reqCookies)
|
|
106
99
|
: null;
|
|
107
100
|
if (cookies) {
|
|
108
101
|
headers.cookie = Object.entries(cookies)
|
|
109
|
-
.map(
|
|
102
|
+
.map(v => v.join('='))
|
|
110
103
|
.join('; ');
|
|
111
104
|
}
|
|
112
105
|
const method = opts?.method || req.method;
|
|
113
106
|
if (opts?.debug) {
|
|
114
107
|
logger.info(`${'[32m'}${req.method} ${req.url}${'[33m'} → ${'[36m'}${method} ${url}${'[33m'}`);
|
|
115
|
-
logger.info('[33m'
|
|
108
|
+
logger.info(`${'[33m'}headers:`, JSON.stringify(headers, null, ' '), '[39m');
|
|
116
109
|
}
|
|
117
110
|
const resp = await nodeFetchNative.fetch(url, {
|
|
118
111
|
method,
|
|
119
|
-
body: ['GET', 'HEAD'].includes(method)
|
|
120
|
-
? undefined
|
|
121
|
-
: req,
|
|
112
|
+
body: ['GET', 'HEAD'].includes(method) ? undefined : req,
|
|
122
113
|
headers: headers,
|
|
123
114
|
});
|
|
124
115
|
status.value = resp.status;
|
|
@@ -127,10 +118,10 @@ function useProxy() {
|
|
|
127
118
|
logger.info(`${'[33m'}response headers:${'[39m'}`);
|
|
128
119
|
}
|
|
129
120
|
const resHeaders = opts?.resHeaders
|
|
130
|
-
? applyProxyControls(resp.headers.entries(), opts
|
|
121
|
+
? applyProxyControls(resp.headers.entries(), opts.resHeaders, resHeadersToBlock)
|
|
131
122
|
: null;
|
|
132
123
|
const resCookies = opts?.resCookies
|
|
133
|
-
? applyProxyControls(new CookiesIterable(resp.headers.get('set-cookie') || ''), opts
|
|
124
|
+
? applyProxyControls(new CookiesIterable(resp.headers.get('set-cookie') || ''), opts.resCookies)
|
|
134
125
|
: null;
|
|
135
126
|
if (resHeaders) {
|
|
136
127
|
for (const [name, value] of Object.entries(resHeaders)) {
|
|
@@ -143,8 +134,7 @@ function useProxy() {
|
|
|
143
134
|
}
|
|
144
135
|
}
|
|
145
136
|
if (resCookies) {
|
|
146
|
-
setHeadersObject['set-cookie'] = (setHeadersObject['set-cookie'] ||
|
|
147
|
-
[]);
|
|
137
|
+
setHeadersObject['set-cookie'] = (setHeadersObject['set-cookie'] || []);
|
|
148
138
|
for (const [name, value] of Object.entries(resCookies)) {
|
|
149
139
|
if (name) {
|
|
150
140
|
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,13 +49,10 @@ 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
|
}
|
|
@@ -79,11 +76,7 @@ const reqHeadersToBlock = [
|
|
|
79
76
|
'upgrade-insecure-requests',
|
|
80
77
|
'cookie',
|
|
81
78
|
];
|
|
82
|
-
const resHeadersToBlock = [
|
|
83
|
-
'transfer-encoding',
|
|
84
|
-
'content-encoding',
|
|
85
|
-
'set-cookie',
|
|
86
|
-
];
|
|
79
|
+
const resHeadersToBlock = ['transfer-encoding', 'content-encoding', 'set-cookie'];
|
|
87
80
|
function useProxy() {
|
|
88
81
|
const status = useStatus();
|
|
89
82
|
const { setHeader, headers: getSetHeaders } = useSetHeaders();
|
|
@@ -97,26 +90,24 @@ function useProxy() {
|
|
|
97
90
|
const url = new URL(path, targetUrl.origin).toString() + targetUrl.search;
|
|
98
91
|
const modifiedHeaders = { ...req.headers, host: targetUrl.hostname };
|
|
99
92
|
const headers = opts?.reqHeaders
|
|
100
|
-
? applyProxyControls(new HeadersIterable(modifiedHeaders), opts
|
|
93
|
+
? applyProxyControls(new HeadersIterable(modifiedHeaders), opts.reqHeaders, reqHeadersToBlock)
|
|
101
94
|
: {};
|
|
102
95
|
const cookies = opts?.reqCookies && req.headers.cookie
|
|
103
|
-
? applyProxyControls(new CookiesIterable(req.headers.cookie), opts
|
|
96
|
+
? applyProxyControls(new CookiesIterable(req.headers.cookie), opts.reqCookies)
|
|
104
97
|
: null;
|
|
105
98
|
if (cookies) {
|
|
106
99
|
headers.cookie = Object.entries(cookies)
|
|
107
|
-
.map(
|
|
100
|
+
.map(v => v.join('='))
|
|
108
101
|
.join('; ');
|
|
109
102
|
}
|
|
110
103
|
const method = opts?.method || req.method;
|
|
111
104
|
if (opts?.debug) {
|
|
112
105
|
logger.info(`${'[32m'}${req.method} ${req.url}${'[33m'} → ${'[36m'}${method} ${url}${'[33m'}`);
|
|
113
|
-
logger.info('[33m'
|
|
106
|
+
logger.info(`${'[33m'}headers:`, JSON.stringify(headers, null, ' '), '[39m');
|
|
114
107
|
}
|
|
115
108
|
const resp = await fetch(url, {
|
|
116
109
|
method,
|
|
117
|
-
body: ['GET', 'HEAD'].includes(method)
|
|
118
|
-
? undefined
|
|
119
|
-
: req,
|
|
110
|
+
body: ['GET', 'HEAD'].includes(method) ? undefined : req,
|
|
120
111
|
headers: headers,
|
|
121
112
|
});
|
|
122
113
|
status.value = resp.status;
|
|
@@ -125,10 +116,10 @@ function useProxy() {
|
|
|
125
116
|
logger.info(`${'[33m'}response headers:${'[39m'}`);
|
|
126
117
|
}
|
|
127
118
|
const resHeaders = opts?.resHeaders
|
|
128
|
-
? applyProxyControls(resp.headers.entries(), opts
|
|
119
|
+
? applyProxyControls(resp.headers.entries(), opts.resHeaders, resHeadersToBlock)
|
|
129
120
|
: null;
|
|
130
121
|
const resCookies = opts?.resCookies
|
|
131
|
-
? applyProxyControls(new CookiesIterable(resp.headers.get('set-cookie') || ''), opts
|
|
122
|
+
? applyProxyControls(new CookiesIterable(resp.headers.get('set-cookie') || ''), opts.resCookies)
|
|
132
123
|
: null;
|
|
133
124
|
if (resHeaders) {
|
|
134
125
|
for (const [name, value] of Object.entries(resHeaders)) {
|
|
@@ -141,8 +132,7 @@ function useProxy() {
|
|
|
141
132
|
}
|
|
142
133
|
}
|
|
143
134
|
if (resCookies) {
|
|
144
|
-
setHeadersObject['set-cookie'] = (setHeadersObject['set-cookie'] ||
|
|
145
|
-
[]);
|
|
135
|
+
setHeadersObject['set-cookie'] = (setHeadersObject['set-cookie'] || []);
|
|
146
136
|
for (const [name, value] of Object.entries(resCookies)) {
|
|
147
137
|
if (name) {
|
|
148
138
|
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.28",
|
|
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.28",
|
|
43
|
+
"@wooksjs/event-core": "0.4.28"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"node-fetch-native": "^1.0.1"
|