mirror of
https://github.com/zebrajr/node.git
synced 2026-01-15 12:15:26 +00:00
http: res.setHeaders first implementation
PR-URL: https://github.com/nodejs/node/pull/46109 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Paolo Insogna <paolo@cowtech.it> Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
This commit is contained in:
@@ -2969,6 +2969,48 @@ Sets a single header value. If the header already exists in the to-be-sent
|
||||
headers, its value will be replaced. Use an array of strings to send multiple
|
||||
headers with the same name.
|
||||
|
||||
### `outgoingMessage.setHeaders(headers)`
|
||||
|
||||
<!-- YAML
|
||||
added: REPLACEME
|
||||
-->
|
||||
|
||||
* `headers` {Headers|Map}
|
||||
* Returns: {http.ServerResponse}
|
||||
|
||||
Returns the response object.
|
||||
|
||||
Sets multiple header values for implicit headers.
|
||||
`headers` must be an instance of [`Headers`][] or `Map`,
|
||||
if a header already exists in the to-be-sent headers,
|
||||
its value will be replaced.
|
||||
|
||||
```js
|
||||
const headers = new Headers({ foo: 'bar' });
|
||||
response.setHeaders(headers);
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```js
|
||||
const headers = new Map([['foo', 'bar']]);
|
||||
res.setHeaders(headers);
|
||||
```
|
||||
|
||||
When headers have been set with [`outgoingMessage.setHeaders()`][],
|
||||
they will be merged with any headers passed to [`response.writeHead()`][],
|
||||
with the headers passed to [`response.writeHead()`][] given precedence.
|
||||
|
||||
```js
|
||||
// Returns content-type = text/plain
|
||||
const server = http.createServer((req, res) => {
|
||||
const headers = new Headers({ 'Content-Type': 'text/html' });
|
||||
res.setHeaders(headers);
|
||||
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
||||
res.end('ok');
|
||||
});
|
||||
```
|
||||
|
||||
### `outgoingMessage.setTimeout(msesc[, callback])`
|
||||
|
||||
<!-- YAML
|
||||
@@ -3760,6 +3802,7 @@ Set the maximum number of idle HTTP parsers. **Default:** `1000`.
|
||||
[`Buffer.byteLength()`]: buffer.md#static-method-bufferbytelengthstring-encoding
|
||||
[`Duplex`]: stream.md#class-streamduplex
|
||||
[`HPE_HEADER_OVERFLOW`]: errors.md#hpe_header_overflow
|
||||
[`Headers`]: globals.md#class-headers
|
||||
[`TypeError`]: errors.md#class-typeerror
|
||||
[`URL`]: url.md#the-whatwg-url-api
|
||||
[`agent.createConnection()`]: #agentcreateconnectionoptions-callback
|
||||
@@ -3786,6 +3829,7 @@ Set the maximum number of idle HTTP parsers. **Default:** `1000`.
|
||||
[`net.createConnection()`]: net.md#netcreateconnectionoptions-connectlistener
|
||||
[`new URL()`]: url.md#new-urlinput-base
|
||||
[`outgoingMessage.setHeader(name, value)`]: #outgoingmessagesetheadername-value
|
||||
[`outgoingMessage.setHeaders()`]: #outgoingmessagesetheadersheaders
|
||||
[`outgoingMessage.socket`]: #outgoingmessagesocket
|
||||
[`removeHeader(name)`]: #requestremoveheadername
|
||||
[`request.destroy()`]: #requestdestroyerror
|
||||
|
||||
@@ -673,6 +673,28 @@ OutgoingMessage.prototype.setHeader = function setHeader(name, value) {
|
||||
return this;
|
||||
};
|
||||
|
||||
OutgoingMessage.prototype.setHeaders = function setHeaders(headers) {
|
||||
if (this._header) {
|
||||
throw new ERR_HTTP_HEADERS_SENT('set');
|
||||
}
|
||||
|
||||
|
||||
if (
|
||||
!headers ||
|
||||
ArrayIsArray(headers) ||
|
||||
typeof headers.keys !== 'function' ||
|
||||
typeof headers.get !== 'function'
|
||||
) {
|
||||
throw new ERR_INVALID_ARG_TYPE('headers', ['Headers', 'Map'], headers);
|
||||
}
|
||||
|
||||
for (const key of headers.keys()) {
|
||||
this.setHeader(key, headers.get(key));
|
||||
}
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
OutgoingMessage.prototype.appendHeader = function appendHeader(name, value) {
|
||||
if (this._header) {
|
||||
throw new ERR_HTTP_HEADERS_SENT('append');
|
||||
|
||||
@@ -378,9 +378,6 @@ function writeHead(statusCode, reason, obj) {
|
||||
if (k) this.setHeader(k, obj[k]);
|
||||
}
|
||||
}
|
||||
if (k === undefined && this._header) {
|
||||
throw new ERR_HTTP_HEADERS_SENT('render');
|
||||
}
|
||||
// Only progressive api is used
|
||||
headers = this[kOutHeaders];
|
||||
} else {
|
||||
|
||||
131
test/parallel/test-http-response-setheaders.js
Normal file
131
test/parallel/test-http-response-setheaders.js
Normal file
@@ -0,0 +1,131 @@
|
||||
'use strict';
|
||||
const common = require('../common');
|
||||
const http = require('http');
|
||||
const assert = require('assert');
|
||||
|
||||
{
|
||||
const server = http.createServer({ requireHostHeader: false }, common.mustCall((req, res) => {
|
||||
res.writeHead(200); // Headers already sent
|
||||
const headers = new globalThis.Headers({ foo: '1' });
|
||||
assert.throws(() => {
|
||||
res.setHeaders(headers);
|
||||
}, {
|
||||
code: 'ERR_HTTP_HEADERS_SENT'
|
||||
});
|
||||
res.end();
|
||||
}));
|
||||
|
||||
server.listen(0, common.mustCall(() => {
|
||||
http.get({ port: server.address().port }, (res) => {
|
||||
assert.strictEqual(res.headers.foo, undefined);
|
||||
res.resume().on('end', common.mustCall(() => {
|
||||
server.close();
|
||||
}));
|
||||
});
|
||||
}));
|
||||
}
|
||||
|
||||
{
|
||||
const server = http.createServer({ requireHostHeader: false }, common.mustCall((req, res) => {
|
||||
assert.throws(() => {
|
||||
res.setHeaders(['foo', '1']);
|
||||
}, {
|
||||
code: 'ERR_INVALID_ARG_TYPE'
|
||||
});
|
||||
assert.throws(() => {
|
||||
res.setHeaders({ foo: '1' });
|
||||
}, {
|
||||
code: 'ERR_INVALID_ARG_TYPE'
|
||||
});
|
||||
assert.throws(() => {
|
||||
res.setHeaders(null);
|
||||
}, {
|
||||
code: 'ERR_INVALID_ARG_TYPE'
|
||||
});
|
||||
assert.throws(() => {
|
||||
res.setHeaders(undefined);
|
||||
}, {
|
||||
code: 'ERR_INVALID_ARG_TYPE'
|
||||
});
|
||||
assert.throws(() => {
|
||||
res.setHeaders('test');
|
||||
}, {
|
||||
code: 'ERR_INVALID_ARG_TYPE'
|
||||
});
|
||||
assert.throws(() => {
|
||||
res.setHeaders(1);
|
||||
}, {
|
||||
code: 'ERR_INVALID_ARG_TYPE'
|
||||
});
|
||||
res.end();
|
||||
}));
|
||||
|
||||
server.listen(0, common.mustCall(() => {
|
||||
http.get({ port: server.address().port }, (res) => {
|
||||
assert.strictEqual(res.headers.foo, undefined);
|
||||
res.resume().on('end', common.mustCall(() => {
|
||||
server.close();
|
||||
}));
|
||||
});
|
||||
}));
|
||||
}
|
||||
|
||||
{
|
||||
const server = http.createServer({ requireHostHeader: false }, common.mustCall((req, res) => {
|
||||
const headers = new globalThis.Headers({ foo: '1', bar: '2' });
|
||||
res.setHeaders(headers);
|
||||
res.writeHead(200);
|
||||
res.end();
|
||||
}));
|
||||
|
||||
server.listen(0, common.mustCall(() => {
|
||||
http.get({ port: server.address().port }, (res) => {
|
||||
assert.strictEqual(res.statusCode, 200);
|
||||
assert.strictEqual(res.headers.foo, '1');
|
||||
assert.strictEqual(res.headers.bar, '2');
|
||||
res.resume().on('end', common.mustCall(() => {
|
||||
server.close();
|
||||
}));
|
||||
});
|
||||
}));
|
||||
}
|
||||
|
||||
{
|
||||
const server = http.createServer({ requireHostHeader: false }, common.mustCall((req, res) => {
|
||||
const headers = new globalThis.Headers({ foo: '1', bar: '2' });
|
||||
res.setHeaders(headers);
|
||||
res.writeHead(200, ['foo', '3']);
|
||||
res.end();
|
||||
}));
|
||||
|
||||
server.listen(0, common.mustCall(() => {
|
||||
http.get({ port: server.address().port }, (res) => {
|
||||
assert.strictEqual(res.statusCode, 200);
|
||||
assert.strictEqual(res.headers.foo, '3'); // Override by writeHead
|
||||
assert.strictEqual(res.headers.bar, '2');
|
||||
res.resume().on('end', common.mustCall(() => {
|
||||
server.close();
|
||||
}));
|
||||
});
|
||||
}));
|
||||
}
|
||||
|
||||
{
|
||||
const server = http.createServer({ requireHostHeader: false }, common.mustCall((req, res) => {
|
||||
const headers = new Map([['foo', '1'], ['bar', '2']]);
|
||||
res.setHeaders(headers);
|
||||
res.writeHead(200);
|
||||
res.end();
|
||||
}));
|
||||
|
||||
server.listen(0, common.mustCall(() => {
|
||||
http.get({ port: server.address().port }, (res) => {
|
||||
assert.strictEqual(res.statusCode, 200);
|
||||
assert.strictEqual(res.headers.foo, '1');
|
||||
assert.strictEqual(res.headers.bar, '2');
|
||||
res.resume().on('end', common.mustCall(() => {
|
||||
server.close();
|
||||
}));
|
||||
});
|
||||
}));
|
||||
}
|
||||
Reference in New Issue
Block a user