Skip to content

Commit

Permalink
fix: Do not allow OBS fold in headers by default. (nodejs#352)
Browse files Browse the repository at this point in the history
  • Loading branch information
ShogunPanda authored and erikolofsson committed Apr 5, 2024
1 parent 34831a3 commit 0d285c4
Show file tree
Hide file tree
Showing 9 changed files with 103 additions and 14 deletions.
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "llhttp",
"version": "2.1.8",
"version": "2.1.9",
"description": "HTTP parser in LLVM IR",
"main": "lib/llhttp.js",
"types": "lib/llhttp.d.ts",
Expand Down
13 changes: 8 additions & 5 deletions src/llhttp/http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -599,11 +599,14 @@ export class HTTP {
'Missing expected LF after header value'));

n('header_value_lws')
.peek([ ' ', '\t' ],
this.load('header_state', {
[HEADER_STATE.TRANSFER_ENCODING_CHUNKED]:
this.resetHeaderState(span.headerValue.start(n('header_value_start'))),
}, span.headerValue.start(n('header_value_start'))))
.peek(
[ ' ', '\t' ],
this.testFlags(FLAGS.LENIENT, {
1: this.load('header_state', {
[HEADER_STATE.TRANSFER_ENCODING_CHUNKED]:
this.resetHeaderState(span.headerValue.start(n('header_value_start'))),
}, span.headerValue.start(n('header_value_start'))),
}, p.error(ERROR.INVALID_HEADER_TOKEN, 'Unexpected whitespace after header value')))
.otherwise(this.setHeaderFlags('header_field_start'));

const checkTrailing = this.testFlags(FLAGS.TRAILING, {
Expand Down
4 changes: 2 additions & 2 deletions test/request/connection.md
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ off=75 message complete

### Multiple tokens with folding

<!-- meta={"type": "request"} -->
<!-- meta={"type": "request-lenient-headers"} -->
```http
GET /demo HTTP/1.1
Host: example.com
Expand Down Expand Up @@ -326,7 +326,7 @@ off=75 error code=22 reason="Pause on CONNECT/Upgrade"

### Multiple tokens with folding, LWS, and CRLF

<!-- meta={"type": "request"} -->
<!-- meta={"type": "request-lenient-headers"} -->
```http
GET /demo HTTP/1.1
Connection: keep-alive, \r\n upgrade
Expand Down
87 changes: 86 additions & 1 deletion test/request/invalid.md
Original file line number Diff line number Diff line change
Expand Up @@ -254,4 +254,89 @@ off=22 len=9 span[header_value]="localhost"
off=33 len=5 span[header_field]="Dummy"
off=40 len=1 span[header_value]="x"
off=41 error code=10 reason="Invalid header value char"
```
```

### Spaces before headers

<!-- meta={ "type": "request" } -->

```http
POST /hello HTTP/1.1
Host: localhost
Foo: bar
Content-Length: 38
GET /bye HTTP/1.1
Host: localhost
```

```log
off=0 message begin
off=0 len=4 span[method]="POST"
off=4 method complete
off=5 len=6 span[url]="/hello"
off=12 url complete
off=17 len=3 span[version]="1.1"
off=20 version complete
off=22 len=4 span[header_field]="Host"
off=27 header_field complete
off=28 len=9 span[header_value]="localhost"
off=39 header_value complete
off=39 len=3 span[header_field]="Foo"
off=43 header_field complete
off=44 len=3 span[header_value]="bar"
off=49 error code=10 reason="Unexpected whitespace after header value"
```

### Spaces before headers (lenient)

<!-- meta={ "type": "request-lenient-headers" } -->

```http
POST /hello HTTP/1.1
Host: localhost
Foo: bar
Content-Length: 38
GET /bye HTTP/1.1
Host: localhost
```

```log
off=0 message begin
off=0 len=4 span[method]="POST"
off=4 method complete
off=5 len=6 span[url]="/hello"
off=12 url complete
off=17 len=3 span[version]="1.1"
off=20 version complete
off=22 len=4 span[header_field]="Host"
off=27 header_field complete
off=28 len=9 span[header_value]="localhost"
off=39 header_value complete
off=39 len=3 span[header_field]="Foo"
off=43 header_field complete
off=44 len=3 span[header_value]="bar"
off=49 len=19 span[header_value]=" Content-Length: 38"
off=70 header_value complete
off=72 headers complete method=3 v=1/1 flags=0 content_length=0
off=72 message complete
off=72 reset
off=72 message begin
off=72 len=3 span[method]="GET"
off=75 method complete
off=76 len=4 span[url]="/bye"
off=81 url complete
off=86 len=3 span[version]="1.1"
off=89 version complete
off=91 len=4 span[header_field]="Host"
off=96 header_field complete
off=97 len=9 span[header_value]="localhost"
off=108 header_value complete
off=110 headers complete method=1 v=1/1 flags=0 content_length=0
off=110 message complete
```
2 changes: 1 addition & 1 deletion test/request/sample.md
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ off=61 message complete

See nodejs/test/parallel/test-http-headers-obstext.js

<!-- meta={"type": "request"} -->
<!-- meta={"type": "request-lenient-headers"} -->
```http
GET / HTTP/1.1
X-SSL-Nonsense: -----BEGIN CERTIFICATE-----
Expand Down
2 changes: 1 addition & 1 deletion test/request/transfer-encoding.md
Original file line number Diff line number Diff line change
Expand Up @@ -518,7 +518,7 @@ off=50 error code=12 reason="Invalid character in chunk size"

## Invalid OBS fold after chunked value

<!-- meta={"type": "request", "mode": "strict"} -->
<!-- meta={"type": "request-lenient-headers", "mode": "strict"} -->
```http
PUT /url HTTP/1.1
Transfer-Encoding: chunked
Expand Down
2 changes: 1 addition & 1 deletion test/response/transfer-encoding.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ off=78 len=1 span[body]=lf

## Invalid OBS fold after chunked value

<!-- meta={"type": "response" } -->
<!-- meta={"type": "response-lenient-headers" } -->
```http
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Expand Down
3 changes: 2 additions & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
"outDir": "./lib",
"declaration": true,
"pretty": true,
"sourceMap": true
"sourceMap": true,
"skipLibCheck": true
},
"include": [
"src/**/*.ts"
Expand Down

0 comments on commit 0d285c4

Please sign in to comment.