1'use strict';
2
3require('../common');
4const assert = require('assert');
5const { MIMEType, MIMEParams } = require('util');
6
7
8const WHITESPACES = '\t\n\f\r ';
9const NOT_HTTP_TOKEN_CODE_POINT = ',';
10const NOT_HTTP_QUOTED_STRING_CODE_POINT = '\n';
11
12const mime = new MIMEType('application/ecmascript; ');
13const mime_descriptors = Object.getOwnPropertyDescriptors(mime);
14const mime_proto = Object.getPrototypeOf(mime);
15const mime_impersonator = Object.create(mime_proto);
16for (const key of Object.keys(mime_descriptors)) {
17  const descriptor = mime_descriptors[key];
18  if (descriptor.get) {
19    assert.throws(descriptor.get.call(mime_impersonator), /Invalid receiver/i);
20  }
21  if (descriptor.set) {
22    assert.throws(descriptor.set.call(mime_impersonator, 'x'), /Invalid receiver/i);
23  }
24}
25
26
27assert.strictEqual(
28  JSON.stringify(mime),
29  JSON.stringify('application/ecmascript'));
30assert.strictEqual(`${mime}`, 'application/ecmascript');
31assert.strictEqual(mime.essence, 'application/ecmascript');
32assert.strictEqual(mime.type, 'application');
33assert.strictEqual(mime.subtype, 'ecmascript');
34assert.ok(mime.params);
35assert.deepStrictEqual([], [...mime.params]);
36assert.strictEqual(mime.params.has('not found'), false);
37assert.strictEqual(mime.params.get('not found'), null);
38assert.strictEqual(mime.params.delete('not found'), undefined);
39
40
41mime.type = 'text';
42assert.strictEqual(mime.type, 'text');
43assert.strictEqual(JSON.stringify(mime), JSON.stringify('text/ecmascript'));
44assert.strictEqual(`${mime}`, 'text/ecmascript');
45assert.strictEqual(mime.essence, 'text/ecmascript');
46
47assert.throws(() => {
48  mime.type = `${WHITESPACES}text`;
49}, /ERR_INVALID_MIME_SYNTAX/);
50
51assert.throws(() => mime.type = '', /type/i);
52assert.throws(() => mime.type = '/', /type/i);
53assert.throws(() => mime.type = 'x/', /type/i);
54assert.throws(() => mime.type = '/x', /type/i);
55assert.throws(() => mime.type = NOT_HTTP_TOKEN_CODE_POINT, /type/i);
56assert.throws(() => mime.type = `${NOT_HTTP_TOKEN_CODE_POINT}/`, /type/i);
57assert.throws(() => mime.type = `/${NOT_HTTP_TOKEN_CODE_POINT}`, /type/i);
58
59
60mime.subtype = 'javascript';
61assert.strictEqual(mime.type, 'text');
62assert.strictEqual(JSON.stringify(mime), JSON.stringify('text/javascript'));
63assert.strictEqual(`${mime}`, 'text/javascript');
64assert.strictEqual(mime.essence, 'text/javascript');
65assert.strictEqual(`${mime.params}`, '');
66assert.strictEqual(`${new MIMEParams()}`, '');
67assert.strictEqual(`${new MIMEParams(mime.params)}`, '');
68assert.strictEqual(`${new MIMEParams(`${mime.params}`)}`, '');
69
70assert.throws(() => {
71  mime.subtype = `javascript${WHITESPACES}`;
72}, /ERR_INVALID_MIME_SYNTAX/);
73
74assert.throws(() => mime.subtype = '', /subtype/i);
75assert.throws(() => mime.subtype = ';', /subtype/i);
76assert.throws(() => mime.subtype = 'x;', /subtype/i);
77assert.throws(() => mime.subtype = ';x', /subtype/i);
78assert.throws(() => mime.subtype = NOT_HTTP_TOKEN_CODE_POINT, /subtype/i);
79assert.throws(
80  () => mime.subtype = `${NOT_HTTP_TOKEN_CODE_POINT};`,
81  /subtype/i);
82assert.throws(
83  () => mime.subtype = `;${NOT_HTTP_TOKEN_CODE_POINT}`,
84  /subtype/i);
85
86
87const params = mime.params;
88params.set('charset', 'utf-8');
89assert.strictEqual(params.has('charset'), true);
90assert.strictEqual(params.get('charset'), 'utf-8');
91assert.deepStrictEqual([...params], [['charset', 'utf-8']]);
92assert.strictEqual(
93  JSON.stringify(mime),
94  JSON.stringify('text/javascript;charset=utf-8'));
95assert.strictEqual(`${mime}`, 'text/javascript;charset=utf-8');
96assert.strictEqual(mime.essence, 'text/javascript');
97assert.strictEqual(`${mime.params}`, 'charset=utf-8');
98assert.strictEqual(`${new MIMEParams(mime.params)}`, '');
99assert.strictEqual(`${new MIMEParams(`${mime.params}`)}`, '');
100
101params.set('goal', 'module');
102assert.strictEqual(params.has('goal'), true);
103assert.strictEqual(params.get('goal'), 'module');
104assert.deepStrictEqual([...params], [['charset', 'utf-8'], ['goal', 'module']]);
105assert.strictEqual(
106  JSON.stringify(mime),
107  JSON.stringify('text/javascript;charset=utf-8;goal=module'));
108assert.strictEqual(`${mime}`, 'text/javascript;charset=utf-8;goal=module');
109assert.strictEqual(mime.essence, 'text/javascript');
110assert.strictEqual(`${mime.params}`, 'charset=utf-8;goal=module');
111assert.strictEqual(`${new MIMEParams(mime.params)}`, '');
112assert.strictEqual(`${new MIMEParams(`${mime.params}`)}`, '');
113
114assert.throws(() => {
115  params.set(`${WHITESPACES}goal`, 'module');
116}, /ERR_INVALID_MIME_SYNTAX/);
117
118params.set('charset', 'iso-8859-1');
119assert.strictEqual(params.has('charset'), true);
120assert.strictEqual(params.get('charset'), 'iso-8859-1');
121assert.deepStrictEqual(
122  [...params],
123  [['charset', 'iso-8859-1'], ['goal', 'module']]);
124assert.strictEqual(
125  JSON.stringify(mime),
126  JSON.stringify('text/javascript;charset=iso-8859-1;goal=module'));
127assert.strictEqual(`${mime}`, 'text/javascript;charset=iso-8859-1;goal=module');
128assert.strictEqual(mime.essence, 'text/javascript');
129
130params.delete('charset');
131assert.strictEqual(params.has('charset'), false);
132assert.strictEqual(params.get('charset'), null);
133assert.deepStrictEqual([...params], [['goal', 'module']]);
134assert.strictEqual(
135  JSON.stringify(mime),
136  JSON.stringify('text/javascript;goal=module'));
137assert.strictEqual(`${mime}`, 'text/javascript;goal=module');
138assert.strictEqual(mime.essence, 'text/javascript');
139
140params.set('x', '');
141assert.strictEqual(params.has('x'), true);
142assert.strictEqual(params.get('x'), '');
143assert.deepStrictEqual([...params], [['goal', 'module'], ['x', '']]);
144assert.strictEqual(
145  JSON.stringify(mime),
146  JSON.stringify('text/javascript;goal=module;x=""'));
147assert.strictEqual(`${mime}`, 'text/javascript;goal=module;x=""');
148assert.strictEqual(mime.essence, 'text/javascript');
149
150assert.throws(() => params.set('', 'x'), /parameter name/i);
151assert.throws(() => params.set('=', 'x'), /parameter name/i);
152assert.throws(() => params.set('x=', 'x'), /parameter name/i);
153assert.throws(() => params.set('=x', 'x'), /parameter name/i);
154assert.throws(() => params.set(`${NOT_HTTP_TOKEN_CODE_POINT}=`, 'x'), /parameter name/i);
155assert.throws(() => params.set(`${NOT_HTTP_TOKEN_CODE_POINT}x`, 'x'), /parameter name/i);
156assert.throws(() => params.set(`x${NOT_HTTP_TOKEN_CODE_POINT}`, 'x'), /parameter name/i);
157
158assert.throws(() => params.set('x', `${NOT_HTTP_QUOTED_STRING_CODE_POINT};`), /parameter value/i);
159assert.throws(() => params.set('x', `${NOT_HTTP_QUOTED_STRING_CODE_POINT}x`), /parameter value/i);
160assert.throws(() => params.set('x', `x${NOT_HTTP_QUOTED_STRING_CODE_POINT}`), /parameter value/i);
161