@opra/core 0.20.3 → 0.22.0
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/cjs/adapter/adapter.js +2 -2
- package/cjs/adapter/http/express-adapter.js +29 -7
- package/cjs/adapter/http/helpers/common.js +66 -0
- package/cjs/adapter/http/helpers/convert-to-headers.js +65 -0
- package/cjs/adapter/http/helpers/convert-to-raw-headers.js +25 -0
- package/cjs/adapter/http/helpers/match-known-fields.js +47 -0
- package/cjs/adapter/http/http-adapter.js +82 -440
- package/cjs/adapter/http/impl/http-incoming-message-host.js +127 -0
- package/cjs/adapter/http/impl/http-outgoing-message-host.js +210 -0
- package/cjs/adapter/http/impl/http-server-request.js +125 -0
- package/cjs/adapter/http/impl/http-server-response.js +226 -0
- package/cjs/adapter/http/request-parsers/batch-request-parser.js +169 -0
- package/cjs/adapter/http/request-parsers/parse-collection-request.js +165 -0
- package/cjs/adapter/http/request-parsers/parse-request.js +24 -0
- package/cjs/adapter/http/request-parsers/parse-singleton-request.js +96 -0
- package/cjs/adapter/request-context.host.js +17 -3
- package/cjs/adapter/request.host.js +6 -3
- package/cjs/adapter/response.host.js +5 -3
- package/cjs/index.js +4 -2
- package/esm/adapter/adapter.js +2 -2
- package/esm/adapter/http/express-adapter.js +6 -6
- package/esm/adapter/http/helpers/common.js +60 -0
- package/esm/adapter/http/helpers/convert-to-headers.js +60 -0
- package/esm/adapter/http/helpers/convert-to-raw-headers.js +21 -0
- package/esm/adapter/http/helpers/match-known-fields.js +43 -0
- package/esm/adapter/http/http-adapter.js +83 -441
- package/esm/adapter/http/impl/http-incoming-message-host.js +122 -0
- package/esm/adapter/http/impl/http-outgoing-message-host.js +205 -0
- package/esm/adapter/http/impl/http-server-request.js +121 -0
- package/esm/adapter/http/impl/http-server-response.js +222 -0
- package/esm/adapter/http/request-parsers/batch-request-parser.js +169 -0
- package/esm/adapter/http/request-parsers/parse-collection-request.js +161 -0
- package/esm/adapter/http/request-parsers/parse-request.js +20 -0
- package/esm/adapter/http/request-parsers/parse-singleton-request.js +92 -0
- package/esm/adapter/request-context.host.js +17 -3
- package/esm/adapter/request.host.js +6 -3
- package/esm/adapter/response.host.js +5 -3
- package/esm/index.js +4 -2
- package/package.json +19 -15
- package/types/adapter/adapter.d.ts +1 -1
- package/types/adapter/http/helpers/common.d.ts +17 -0
- package/types/adapter/http/helpers/convert-to-headers.d.ts +2 -0
- package/types/adapter/http/helpers/convert-to-raw-headers.d.ts +3 -0
- package/types/adapter/http/helpers/match-known-fields.d.ts +6 -0
- package/types/adapter/http/http-adapter.d.ts +7 -12
- package/types/adapter/http/impl/http-incoming-message-host.d.ts +58 -0
- package/types/adapter/http/impl/http-outgoing-message-host.d.ts +72 -0
- package/types/adapter/http/{http-request-message.d.ts → impl/http-server-request.d.ts} +52 -85
- package/types/adapter/http/impl/http-server-response.d.ts +137 -0
- package/types/adapter/http/request-parsers/batch-request-parser.d.ts +0 -0
- package/types/adapter/http/request-parsers/parse-collection-request.d.ts +4 -0
- package/types/adapter/http/request-parsers/parse-request.d.ts +4 -0
- package/types/adapter/http/request-parsers/parse-singleton-request.d.ts +4 -0
- package/types/adapter/interfaces/request-context.interface.d.ts +14 -10
- package/types/adapter/interfaces/request.interface.d.ts +3 -2
- package/types/adapter/interfaces/response.interface.d.ts +2 -2
- package/types/adapter/request-context.host.d.ts +9 -6
- package/types/adapter/request.host.d.ts +8 -4
- package/types/adapter/response.host.d.ts +6 -4
- package/types/index.d.ts +4 -2
- package/cjs/adapter/http/http-message.host.js +0 -251
- package/cjs/adapter/http/http-request-context.host.js +0 -28
- package/cjs/adapter/http/http-request-message.js +0 -152
- package/cjs/adapter/http/http-request.host.js +0 -14
- package/cjs/adapter/http/http-response-message.js +0 -238
- package/cjs/adapter/http/http-response.host.js +0 -14
- package/esm/adapter/http/http-message.host.js +0 -246
- package/esm/adapter/http/http-request-context.host.js +0 -24
- package/esm/adapter/http/http-request-message.js +0 -148
- package/esm/adapter/http/http-request.host.js +0 -10
- package/esm/adapter/http/http-response-message.js +0 -233
- package/esm/adapter/http/http-response.host.js +0 -10
- package/types/adapter/http/http-message.host.d.ts +0 -122
- package/types/adapter/http/http-request-context.host.d.ts +0 -16
- package/types/adapter/http/http-request.host.d.ts +0 -7
- package/types/adapter/http/http-response-message.d.ts +0 -321
- package/types/adapter/http/http-response.host.d.ts +0 -7
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { ARRAY_FIELD, COMMA_DELIMITED_FIELD, matchKnownFields, SEMICOLON_DELIMITED_FIELD } from './match-known-fields.js';
|
|
2
|
+
export function convertToHeaders(src, dst, joinDuplicateHeaders) {
|
|
3
|
+
for (let n = 0; n < src.length; n += 2) {
|
|
4
|
+
addHeaderLine(src[n], src[n + 1], dst, joinDuplicateHeaders);
|
|
5
|
+
}
|
|
6
|
+
return dst;
|
|
7
|
+
}
|
|
8
|
+
export function convertToHeadersDistinct(src, dst) {
|
|
9
|
+
const count = src.length % 2;
|
|
10
|
+
for (let n = 0; n < count; n += 2) {
|
|
11
|
+
addHeaderLineDistinct(src[n], src[n + 1], dst);
|
|
12
|
+
}
|
|
13
|
+
return dst;
|
|
14
|
+
}
|
|
15
|
+
function addHeaderLine(field, value, dest, joinDuplicateHeaders) {
|
|
16
|
+
if (value == null)
|
|
17
|
+
return;
|
|
18
|
+
field = field.toLowerCase();
|
|
19
|
+
const [, flag] = matchKnownFields(field);
|
|
20
|
+
// comma(0) or semicolon(2) delimited field
|
|
21
|
+
if (flag === COMMA_DELIMITED_FIELD || flag === SEMICOLON_DELIMITED_FIELD) {
|
|
22
|
+
// Make a delimited list
|
|
23
|
+
if (typeof dest[field] === 'string') {
|
|
24
|
+
dest[field] += (flag === COMMA_DELIMITED_FIELD ? ', ' : '; ') + value;
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
dest[field] = value;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
else if (flag === ARRAY_FIELD) {
|
|
31
|
+
// Array header -- only Set-Cookie at the moment
|
|
32
|
+
if (dest['set-cookie'] !== undefined) {
|
|
33
|
+
dest['set-cookie'].push(value);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
dest['set-cookie'] = [value];
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else if (joinDuplicateHeaders) {
|
|
40
|
+
if (dest[field] === undefined) {
|
|
41
|
+
dest[field] = value;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
dest[field] += ', ' + value;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else if (dest[field] === undefined) {
|
|
48
|
+
// Drop duplicates
|
|
49
|
+
dest[field] = value;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function addHeaderLineDistinct(field, value, dest) {
|
|
53
|
+
field = field.toLowerCase();
|
|
54
|
+
if (!dest[field]) {
|
|
55
|
+
dest[field] = [value];
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
dest[field].push(value);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ARRAY_FIELD, COMMA_DELIMITED_FIELD, matchKnownFields, SEMICOLON_DELIMITED_FIELD } from './match-known-fields.js';
|
|
2
|
+
export function convertToRawHeaders(src) {
|
|
3
|
+
return Object.entries(src)
|
|
4
|
+
.reduce((a, [field, v]) => {
|
|
5
|
+
const [name, flag] = matchKnownFields(field);
|
|
6
|
+
if (flag === ARRAY_FIELD) {
|
|
7
|
+
if (Array.isArray(v))
|
|
8
|
+
v.forEach(x => a.push(name, String(x)));
|
|
9
|
+
else
|
|
10
|
+
a.push(name, String(v));
|
|
11
|
+
return a;
|
|
12
|
+
}
|
|
13
|
+
if (flag === COMMA_DELIMITED_FIELD || flag === SEMICOLON_DELIMITED_FIELD) {
|
|
14
|
+
v = Array.isArray(v) ? v.join(flag === COMMA_DELIMITED_FIELD ? ', ' : '; ') : String(v);
|
|
15
|
+
}
|
|
16
|
+
else
|
|
17
|
+
v = Array.isArray(v) ? String(v[0]) : String(v);
|
|
18
|
+
a.push(name, v);
|
|
19
|
+
return a;
|
|
20
|
+
}, []);
|
|
21
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { HttpHeaderCodes } from '@opra/common';
|
|
2
|
+
export const NO_DUPLICATES_FIELD = 0;
|
|
3
|
+
export const COMMA_DELIMITED_FIELD = 1;
|
|
4
|
+
export const SEMICOLON_DELIMITED_FIELD = 2;
|
|
5
|
+
export const ARRAY_FIELD = 3;
|
|
6
|
+
const ARRAY_HEADERS = [
|
|
7
|
+
'set-cookie'
|
|
8
|
+
];
|
|
9
|
+
const NO_DUPLICATES_HEADERS = [
|
|
10
|
+
'age',
|
|
11
|
+
'from',
|
|
12
|
+
'etag',
|
|
13
|
+
'server',
|
|
14
|
+
'referer',
|
|
15
|
+
'referrer',
|
|
16
|
+
'expires',
|
|
17
|
+
'location',
|
|
18
|
+
'user-agent',
|
|
19
|
+
'retry-after',
|
|
20
|
+
'content-type',
|
|
21
|
+
'content-length',
|
|
22
|
+
'max-forwards',
|
|
23
|
+
'last-modified',
|
|
24
|
+
'authorization',
|
|
25
|
+
'proxy-authorization',
|
|
26
|
+
'if-modified-since',
|
|
27
|
+
'if-unmodified-since',
|
|
28
|
+
];
|
|
29
|
+
const SEMICOLON_DELIMITED_HEADERS = ['cookie'];
|
|
30
|
+
const KNOWN_FIELDS = Object.values(HttpHeaderCodes)
|
|
31
|
+
.reduce((o, k) => {
|
|
32
|
+
const n = k.toLowerCase();
|
|
33
|
+
o[n] = [k,
|
|
34
|
+
(NO_DUPLICATES_HEADERS.includes(n) ? NO_DUPLICATES_FIELD :
|
|
35
|
+
(ARRAY_HEADERS.includes(n) ? ARRAY_FIELD :
|
|
36
|
+
(SEMICOLON_DELIMITED_HEADERS.includes(n) ? SEMICOLON_DELIMITED_FIELD : COMMA_DELIMITED_FIELD)))
|
|
37
|
+
];
|
|
38
|
+
return o;
|
|
39
|
+
}, {});
|
|
40
|
+
export function matchKnownFields(field) {
|
|
41
|
+
const x = KNOWN_FIELDS[field.toLowerCase()];
|
|
42
|
+
return x ? x : [field, COMMA_DELIMITED_FIELD];
|
|
43
|
+
}
|