Skip to content

Commit f576dbd

Browse files
committed
feat: http2 support
1 parent 364bcf2 commit f576dbd

File tree

4 files changed

+131
-66
lines changed

4 files changed

+131
-66
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ jobs:
88
test:
99
runs-on: ubuntu-20.04
1010
strategy:
11+
fail-fast: false
1112
matrix:
1213
name:
1314
- Node.js 0.8
@@ -72,11 +73,11 @@ jobs:
7273

7374
- name: Node.js 6.x
7475
node-version: "6.17"
75-
76+
7677

7778
- name: Node.js 7.x
7879
node-version: "7.10"
79-
80+
8081

8182
- name: Node.js 8.x
8283
node-version: "8.17"

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
"event",
99
"headers",
1010
"http",
11+
"http2",
1112
"onheaders"
1213
],
1314
"repository": "jshttp/on-headers",
@@ -21,7 +22,7 @@
2122
"eslint-plugin-standard": "4.0.1",
2223
"mocha": "10.2.0",
2324
"nyc": "15.1.0",
24-
"supertest": "4.0.2"
25+
"supertest": "6.3.4"
2526
},
2627
"files": [
2728
"LICENSE",
@@ -34,7 +35,7 @@
3435
},
3536
"scripts": {
3637
"lint": "eslint --plugin markdown --ext js,md .",
37-
"test": "mocha --reporter spec --bail --check-leaks test/",
38+
"test": "mocha --reporter spec --check-leaks test/",
3839
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
3940
"test-cov": "nyc --reporter=html --reporter=text npm test",
4041
"version": "node scripts/version-history.js && git add HISTORY.md"

test/support/servers.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
var http = require('http')
2+
var http2
3+
4+
var onHeaders = require('../..')
5+
6+
try {
7+
http2 = require('http2')
8+
} catch (e) {}
9+
10+
exports.createHTTPServer = createHTTPServer
11+
exports.createHTTP2Server = createHTTP2Server
12+
13+
function createHTTPServer (listener, handler) {
14+
var fn = handler || echoHandler
15+
16+
return http.createServer(function (req, res) {
17+
try {
18+
onHeaders(res, listener)
19+
fn(req, res)
20+
res.statusCode = 200
21+
} catch (err) {
22+
res.statusCode = 500
23+
res.write(err.message)
24+
} finally {
25+
res.end()
26+
}
27+
})
28+
}
29+
30+
function createHTTP2Server (listener, handler) {
31+
var fn = handler || echoHandler
32+
33+
return http2.createServer(function (req, res) {
34+
try {
35+
onHeaders(res, listener)
36+
fn(req, res)
37+
res.statusCode = 200
38+
} catch (err) {
39+
res.statusCode = 500
40+
res.write(err.message)
41+
} finally {
42+
res.end()
43+
}
44+
})
45+
}
46+
47+
function echoHandler (req, res) {
48+
res.setHeader('X-Outgoing', 'test')
49+
}

test/test.js

Lines changed: 76 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,39 @@
11

22
var assert = require('assert')
33
var http = require('http')
4+
var http2
45
var onHeaders = require('..')
56
var request = require('supertest')
7+
var server = require('./support/servers')
68

7-
describe('onHeaders(res, listener)', function () {
8-
it('should fire after setHeader', function (done) {
9-
var server = createServer(echoListener)
9+
try {
10+
http2 = require('http2')
11+
} catch (e) {}
12+
13+
var createHTTPServer = server.createHTTPServer
14+
var createHTTP2Server = server.createHTTP2Server
15+
16+
// TODO: status message is not supported
17+
18+
var topDescribe = function (type, createServer) {
19+
var wrapper = function wrapper (req) {
20+
if (type === 'http2') {
21+
return req.http2()
22+
}
23+
24+
return req
25+
}
1026

11-
request(server)
12-
.get('/')
27+
describe('onHeaders(res, listener)', function () {
28+
it('should fire after setHeader', function (done) {
29+
wrapper(request(createServer(echoListener)).get('/'))
30+
.expect('X-Outgoing-Echo', 'test')
31+
.expect(200, done)
32+
})
33+
})
34+
35+
it('should fire after setHeader', function (done) {
36+
wrapper(request(createServer(echoListener)).get('/'))
1337
.expect('X-Outgoing-Echo', 'test')
1438
.expect(200, done)
1539
})
@@ -22,8 +46,7 @@ describe('onHeaders(res, listener)', function () {
2246
res.write('1')
2347
}
2448

25-
request(server)
26-
.get('/')
49+
wrapper(request(server).get('/'))
2750
.expect('X-Outgoing-Echo', 'test')
2851
.expect(200, '1', done)
2952
})
@@ -37,8 +60,7 @@ describe('onHeaders(res, listener)', function () {
3760
this.setHeader('X-Headers', getAllHeaderNames(this).join(','))
3861
}
3962

40-
request(server)
41-
.get('/')
63+
wrapper(request(server).get('/'))
4264
.expect('X-Headers', '')
4365
.expect(200, done)
4466
})
@@ -57,8 +79,7 @@ describe('onHeaders(res, listener)', function () {
5779
count++
5880
}
5981

60-
request(server)
61-
.get('/')
82+
wrapper(request(server).get('/'))
6283
.expect(200, function (err) {
6384
if (err) return done(err)
6485
assert.strictEqual(count, 1)
@@ -76,8 +97,7 @@ describe('onHeaders(res, listener)', function () {
7697
res.setHeader('X-Outgoing', 'test')
7798
}
7899

79-
request(server)
80-
.get('/')
100+
wrapper(request(server).get('/'))
81101
.expect('X-Outgoing-Echo', 'test,3,2,1')
82102
.expect(200, done)
83103
})
@@ -93,16 +113,15 @@ describe('onHeaders(res, listener)', function () {
93113
it('should be required', function (done) {
94114
var server = createServer()
95115

96-
request(server)
97-
.get('/')
116+
wrapper(request(server)
117+
.get('/'))
98118
.expect(500, /listener.*function/, done)
99119
})
100120

101121
it('should only accept function', function (done) {
102122
var server = createServer(42)
103123

104-
request(server)
105-
.get('/')
124+
wrapper(request(server).get('/'))
106125
.expect(500, /listener.*function/, done)
107126
})
108127
})
@@ -112,8 +131,7 @@ describe('onHeaders(res, listener)', function () {
112131
it('should be available in listener', function (done) {
113132
var server = createServer(echoListener)
114133

115-
request(server)
116-
.get('/')
134+
wrapper(request(server).get('/'))
117135
.expect('X-Outgoing-Echo', 'test')
118136
.expect(200, done)
119137
})
@@ -131,8 +149,7 @@ describe('onHeaders(res, listener)', function () {
131149
this.setHeader('X-Status', this.statusCode)
132150
}
133151

134-
request(server)
135-
.get('/')
152+
wrapper(request(server).get('/'))
136153
.expect('X-Status', '201')
137154
.expect(201, done)
138155
})
@@ -149,8 +166,7 @@ describe('onHeaders(res, listener)', function () {
149166
this.statusCode = 202
150167
}
151168

152-
request(server)
153-
.get('/')
169+
wrapper(request(server).get('/'))
154170
.expect('X-Status', '201')
155171
.expect(202, done)
156172
})
@@ -162,26 +178,33 @@ describe('onHeaders(res, listener)', function () {
162178
res.writeHead() // error
163179
}
164180

165-
request(server)
166-
.get('/')
181+
wrapper(request(server).get('/'))
167182
.expect(500, done)
168183
})
169184

170185
it('should retain return value', function (done) {
171-
var server = http.createServer(function (req, res) {
186+
function callbackServer (req, res) {
172187
if (req.url === '/attach') {
173188
onHeaders(res, appendHeader(1))
174189
}
175190

176191
res.end(typeof res.writeHead(200))
177-
})
192+
}
178193

179-
request(server)
180-
.get('/')
194+
var server
195+
if (type === 'http') {
196+
server = http.createServer(callbackServer)
197+
} else {
198+
server = http2.createServer(callbackServer)
199+
}
200+
201+
wrapper(request(server).get('/'))
181202
.expect(200, function (err, res) {
203+
// return done(err)
182204
if (err) return done(err)
183-
request(server)
184-
.get('/attach')
205+
206+
wrapper(request(server)
207+
.get('/attach'))
185208
.expect(200, res.text, done)
186209
})
187210
})
@@ -196,8 +219,7 @@ describe('onHeaders(res, listener)', function () {
196219
res.writeHead(200, 'OK')
197220
}
198221

199-
request(server)
200-
.get('/')
222+
wrapper(request(server).get('/'))
201223
.expect('X-Outgoing-Echo', 'test')
202224
.expect(200, done)
203225
})
@@ -211,8 +233,7 @@ describe('onHeaders(res, listener)', function () {
211233
res.writeHead(200, 'OK', { 'X-Outgoing': 'test' })
212234
}
213235

214-
request(server)
215-
.get('/')
236+
wrapper(request(server).get('/'))
216237
.expect('X-Outgoing-Echo', 'test')
217238
.expect(200, done)
218239
})
@@ -231,8 +252,7 @@ describe('onHeaders(res, listener)', function () {
231252
this.setHeader('X-Outgoing-Echo', this.getHeader('X-Outgoing'))
232253
}
233254

234-
request(server)
235-
.get('/')
255+
wrapper(request(server).get('/'))
236256
.expect('X-Status', '201')
237257
.expect('X-Outgoing-Echo', 'test')
238258
.expect(201, done)
@@ -250,8 +270,7 @@ describe('onHeaders(res, listener)', function () {
250270
this.setHeader('X-Outgoing-Echo', this.getHeader('X-Outgoing'))
251271
}
252272

253-
request(server)
254-
.get('/')
273+
wrapper(request(server).get('/'))
255274
.expect('X-Status', '201')
256275
.expect('X-Outgoing-Echo', 'test')
257276
.expect(201, done)
@@ -271,30 +290,12 @@ describe('onHeaders(res, listener)', function () {
271290
this.setHeader('X-Outgoing-Echo', this.getHeader('X-Outgoing'))
272291
}
273292

274-
request(server)
275-
.get('/')
293+
wrapper(request(server).get('/'))
276294
.expect('X-Status', '201')
277295
.expect('X-Outgoing-Echo', 'test')
278296
.expect(201, done)
279297
})
280298
})
281-
})
282-
283-
function createServer (listener, handler) {
284-
var fn = handler || echoHandler
285-
286-
return http.createServer(function (req, res) {
287-
try {
288-
onHeaders(res, listener)
289-
fn(req, res)
290-
res.statusCode = 200
291-
} catch (err) {
292-
res.statusCode = 500
293-
res.write(err.message)
294-
} finally {
295-
res.end()
296-
}
297-
})
298299
}
299300

300301
function appendHeader (num) {
@@ -303,10 +304,6 @@ function appendHeader (num) {
303304
}
304305
}
305306

306-
function echoHandler (req, res) {
307-
res.setHeader('X-Outgoing', 'test')
308-
}
309-
310307
function echoListener () {
311308
this.setHeader('X-Outgoing-Echo', this.getHeader('X-Outgoing'))
312309
}
@@ -316,3 +313,20 @@ function getAllHeaderNames (res) {
316313
? Object.keys(this._headers || {})
317314
: res.getHeaderNames()
318315
}
316+
317+
var servers = [
318+
['http', createHTTPServer]
319+
]
320+
321+
var nodeVersion = process.versions.node.split('.').map(Number)
322+
323+
// `superagent` only supports `http2` since Node.js@10
324+
if (http2 && nodeVersion[0] >= 10) {
325+
servers.push(['http2', createHTTP2Server])
326+
}
327+
328+
for (var i = 0; i < servers.length; i++) {
329+
var tests = topDescribe.bind(undefined, servers[i][0], servers[i][1])
330+
331+
describe(servers[i][0], tests)
332+
}

0 commit comments

Comments
 (0)