Skip to main content
IncomingMessage - node__http.d.ts - Node documentation
class IncomingMessage
extends stream.Readable

Usage in Deno

```typescript import { IncomingMessage } from "node:node__http.d.ts"; ```
An `IncomingMessage` object is created by [Server](../.././node__http.d.ts/~/Server) or [ClientRequest](../.././node__http.d.ts/~/ClientRequest) and passed as the first argument to the `'request'` and `'response'` event respectively. It may be used to access response status, headers, and data. Different from its `socket` value which is a subclass of `stream.Duplex`, the `IncomingMessage` itself extends `stream.Readable` and is created separately to parse and emit the incoming HTTP headers and payload, as the underlying socket may be reused multiple times in case of keep-alive.

Constructors

new
IncomingMessage(socket: Socket)

Properties

deprecated
aborted: boolean
The `message.aborted` property will be `true` if the request has been aborted.
complete: boolean
The `message.complete` property will be `true` if a complete HTTP message has been received and successfully parsed. This property is particularly useful as a means of determining if a client or server fully transmitted a message before a connection was terminated: ```js const req = http.request({ host: '127.0.0.1', port: 8080, method: 'POST', }, (res) => { res.resume(); res.on('end', () => { if (!res.complete) console.error( 'The connection was terminated while the message was still being sent'); }); }); ```
deprecated
connection: Socket
Alias for `message.socket`.
The request/response headers object. Key-value pairs of header names and values. Header names are lower-cased. ```js // Prints something like: // // { 'user-agent': 'curl/7.22.0', // host: '127.0.0.1:8000', // accept: '*' } console.log(request.headers); ``` Duplicates in raw headers are handled in the following ways, depending on the header name: * Duplicates of `age`, `authorization`, `content-length`, `content-type`, `etag`, `expires`, `from`, `host`, `if-modified-since`, `if-unmodified-since`, `last-modified`, `location`, `max-forwards`, `proxy-authorization`, `referer`, `retry-after`, `server`, or `user-agent` are discarded. To allow duplicate values of the headers listed above to be joined, use the option `joinDuplicateHeaders` in [request](../.././node__http.d.ts/~/request) and [createServer](../.././node__http.d.ts/~/createServer). See RFC 9110 Section 5.3 for more information. * `set-cookie` is always an array. Duplicates are added to the array. * For duplicate `cookie` headers, the values are joined together with `; `. * For all other headers, the values are joined together with `, `.
headersDistinct: Dict<string[]>
Similar to `message.headers`, but there is no join logic and the values are always arrays of strings, even for headers received just once. ```js // Prints something like: // // { 'user-agent': ['curl/7.22.0'], // host: ['127.0.0.1:8000'], // accept: ['*'] } console.log(request.headersDistinct); ```
httpVersion: string
In case of server request, the HTTP version sent by the client. In the case of client response, the HTTP version of the connected-to server. Probably either `'1.1'` or `'1.0'`. Also `message.httpVersionMajor` is the first integer and `message.httpVersionMinor` is the second.
abstract
method: string | undefined
**Only valid for request obtained from [Server](../.././node__http.d.ts/~/Server).** The request method as a string. Read only. Examples: `'GET'`, `'DELETE'`.
rawHeaders: string[]
The raw request/response headers list exactly as they were received. The keys and values are in the same list. It is _not_ a list of tuples. So, the even-numbered offsets are key values, and the odd-numbered offsets are the associated values. Header names are not lowercased, and duplicates are not merged. ```js // Prints something like: // // [ 'user-agent', // 'this is invalid because there can be only one', // 'User-Agent', // 'curl/7.22.0', // 'Host', // '127.0.0.1:8000', // 'ACCEPT', // '*' ] console.log(request.rawHeaders); ```
rawTrailers: string[]
The raw request/response trailer keys and values exactly as they were received. Only populated at the `'end'` event.
The `net.Socket` object associated with the connection. With HTTPS support, use `request.socket.getPeerCertificate()` to obtain the client's authentication details. This property is guaranteed to be an instance of the `net.Socket` class, a subclass of `stream.Duplex`, unless the user specified a socket type other than `net.Socket` or internally nulled.
abstract
statusCode: number | undefined
**Only valid for response obtained from [ClientRequest](../.././node__http.d.ts/~/ClientRequest).** The 3-digit HTTP response status code. E.G. `404`.
abstract
statusMessage: string | undefined
**Only valid for response obtained from [ClientRequest](../.././node__http.d.ts/~/ClientRequest).** The HTTP response status message (reason phrase). E.G. `OK` or `Internal Server Error`.
trailers: Dict<string>
The request/response trailers object. Only populated at the `'end'` event.
trailersDistinct: Dict<string[]>
Similar to `message.trailers`, but there is no join logic and the values are always arrays of strings, even for headers received just once. Only populated at the `'end'` event.
abstract
url: string | undefined
**Only valid for request obtained from [Server](../.././node__http.d.ts/~/Server).** Request URL string. This contains only the URL that is present in the actual HTTP request. Take the following request: ```http GET /status?name=ryan HTTP/1.1 Accept: text/plain ``` To parse the URL into its parts: ```js new URL(`http://${process.env.HOST ?? 'localhost'}${request.url}`); ``` When `request.url` is `'/status?name=ryan'` and `process.env.HOST` is undefined: ```console $ node > new URL(`http://${process.env.HOST ?? 'localhost'}${request.url}`); URL { href: 'http://localhost/status?name=ryan', origin: 'http://localhost', protocol: 'http:', username: '', password: '', host: 'localhost', hostname: 'localhost', port: '', pathname: '/status', search: '?name=ryan', searchParams: URLSearchParams { 'name' => 'ryan' }, hash: '' } ``` Ensure that you set `process.env.HOST` to the server's host name, or consider replacing this part entirely. If using `req.headers.host`, ensure proper validation is used, as clients may specify a custom `Host` header.

Methods

destroy(error?: Error): this
Calls `destroy()` on the socket that received the `IncomingMessage`. If `error` is provided, an `'error'` event is emitted on the socket and `error` is passed as an argument to any listeners on the event.
setTimeout(
msecs: number,
callback?: () => void,
): this
Calls `message.socket.setTimeout(msecs, callback)`.