206 lines
4 KiB
Markdown
206 lines
4 KiB
Markdown
|
# http-headers
|
||
|
|
||
|
[![Build status](https://travis-ci.org/watson/http-headers.svg?branch=master)](https://travis-ci.org/watson/http-headers)
|
||
|
[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat)](https://github.com/feross/standard)
|
||
|
|
||
|
Parse the start-line and headers from an HTTP request or reponse.
|
||
|
|
||
|
Converts:
|
||
|
|
||
|
```http
|
||
|
HTTP/1.1 200 OK
|
||
|
Date: Tue, 10 Jun 2014 07:19:27 GMT
|
||
|
Connection: keep-alive
|
||
|
Transfer-Encoding: chunked
|
||
|
|
||
|
Hello World
|
||
|
```
|
||
|
|
||
|
To this:
|
||
|
|
||
|
```js
|
||
|
{
|
||
|
version: { major: 1, minor: 1 },
|
||
|
statusCode: 200,
|
||
|
statusMessage: 'OK',
|
||
|
headers: {
|
||
|
date: 'Tue, 10 Jun 2014 07:19:27 GMT',
|
||
|
connection: 'keep-alive',
|
||
|
'transfer-encoding': 'chunked'
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
**Features:**
|
||
|
|
||
|
- Auto-detects and ignores body if present
|
||
|
- Fully [RFC 2068](http://www.rfc-base.org/txt/rfc-2068.txt) compliant
|
||
|
(please [open an issue](https://github.com/watson/http-headers/issues)
|
||
|
if you find a discrepancy)
|
||
|
- Support multi-line headers (lines will be joined with a space)
|
||
|
- Support repeating headers
|
||
|
|
||
|
## Installation
|
||
|
|
||
|
```
|
||
|
npm install http-headers --save
|
||
|
```
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
```js
|
||
|
var net = require('net')
|
||
|
var httpHeaders = require('http-headers')
|
||
|
|
||
|
// create TCP server
|
||
|
net.createServer(function (c) {
|
||
|
var buffers = []
|
||
|
c.on('data', buffers.push.bind(buffers))
|
||
|
c.on('end', function () {
|
||
|
var data = Buffer.concat(buffers)
|
||
|
|
||
|
// parse incoming data as an HTTP request and extra HTTP headers
|
||
|
console.log(httpHeaders(data))
|
||
|
})
|
||
|
}).listen(8080)
|
||
|
```
|
||
|
|
||
|
### `http.ServerReponse` support
|
||
|
|
||
|
If given an instance of `http.ServerResponse`, the reponse headers is
|
||
|
automatically extracted, parsed and returned:
|
||
|
|
||
|
```js
|
||
|
var http = require('http')
|
||
|
var httpHeaders = require('http-headers')
|
||
|
|
||
|
http.createServer(function (req, res) {
|
||
|
res.end('Hello World')
|
||
|
console.log(httpHeaders(res))
|
||
|
}).listen(8080)
|
||
|
```
|
||
|
|
||
|
#### Why?
|
||
|
|
||
|
If you've ever needed to log or in another way access the headers sent
|
||
|
to the client on a `http.ServerResponse` in Node.js, you know it's not
|
||
|
as easy as with the `http.IncomingMessage` headers (which you just
|
||
|
access via `request.headers['content-type']`).
|
||
|
|
||
|
Response headers are not directly available on the `response` object.
|
||
|
Instead all headers are preprocessed as a string on the private
|
||
|
`response._header` property and needs to be processed in order to be
|
||
|
available as an object.
|
||
|
|
||
|
This module makes the task super simple.
|
||
|
|
||
|
## API
|
||
|
|
||
|
The http-headers module exposes a single parser function:
|
||
|
|
||
|
```js
|
||
|
httpHeaders(data[, onlyHeaders])
|
||
|
```
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
- `data` - A string, buffer or instance of `http.ServerReponse`
|
||
|
- `onlyHeaders` - An optional boolean. If `true`, only the headers
|
||
|
object will be returned. Defaults to `false`
|
||
|
|
||
|
### Request example
|
||
|
|
||
|
If given a request as input:
|
||
|
|
||
|
```http
|
||
|
GET /foo HTTP/1.1
|
||
|
Date: Tue, 10 Jun 2014 07:19:27 GMT
|
||
|
Connection: keep-alive
|
||
|
Transfer-Encoding: chunked
|
||
|
|
||
|
Hello World
|
||
|
```
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
```js
|
||
|
{
|
||
|
method: 'GET',
|
||
|
url: '/foo',
|
||
|
version: { major: 1, minor: 1 },
|
||
|
headers: {
|
||
|
date: 'Tue, 10 Jun 2014 07:19:27 GMT',
|
||
|
connection: 'keep-alive',
|
||
|
'transfer-encoding': 'chunked'
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Response example
|
||
|
|
||
|
If given a request as input:
|
||
|
|
||
|
```http
|
||
|
HTTP/1.1 200 OK
|
||
|
Date: Tue, 10 Jun 2014 07:19:27 GMT
|
||
|
Connection: keep-alive
|
||
|
Transfer-Encoding: chunked
|
||
|
|
||
|
Hello World
|
||
|
```
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
```js
|
||
|
{
|
||
|
version: { major: 1, minor: 1 },
|
||
|
statusCode: 200,
|
||
|
statusMessage: 'OK',
|
||
|
headers: {
|
||
|
date: 'Tue, 10 Jun 2014 07:19:27 GMT',
|
||
|
connection: 'keep-alive',
|
||
|
'transfer-encoding': 'chunked'
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### `onlyHeaders` example
|
||
|
|
||
|
If the optional second argument is set to `true`, only headers are
|
||
|
returned no matter the type of input:
|
||
|
|
||
|
```js
|
||
|
{
|
||
|
date: 'Tue, 10 Jun 2014 07:19:27 GMT',
|
||
|
connection: 'keep-alive',
|
||
|
'transfer-encoding': 'chunked'
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### No Start-Line
|
||
|
|
||
|
If the `data` given does not contain an HTTP Start-Line, only the
|
||
|
headers are returned, even if the `onlyHeaders` argument is `false`:
|
||
|
|
||
|
```http
|
||
|
Date: Tue, 10 Jun 2014 07:19:27 GMT
|
||
|
Connection: keep-alive
|
||
|
Transfer-Encoding: chunked
|
||
|
|
||
|
Hello World
|
||
|
```
|
||
|
|
||
|
Returns:
|
||
|
|
||
|
```js
|
||
|
{
|
||
|
date: 'Tue, 10 Jun 2014 07:19:27 GMT',
|
||
|
connection: 'keep-alive',
|
||
|
'transfer-encoding': 'chunked'
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## License
|
||
|
|
||
|
MIT
|