summaryrefslogtreecommitdiffstats
path: root/test/request.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/request.js')
-rw-r--r--test/request.js248
1 files changed, 248 insertions, 0 deletions
diff --git a/test/request.js b/test/request.js
new file mode 100644
index 0000000..d3a2f74
--- /dev/null
+++ b/test/request.js
@@ -0,0 +1,248 @@
+'use strict'
+
+const { createServer } = require('http')
+const { test } = require('tap')
+const { request } = require('..')
+
+test('no-slash/one-slash pathname should be included in req.path', async (t) => {
+ const pathServer = createServer((req, res) => {
+ t.fail('it shouldn\'t be called')
+ res.statusCode = 200
+ res.end('hello')
+ })
+
+ const requestedServer = createServer((req, res) => {
+ t.equal(`/localhost:${pathServer.address().port}`, req.url)
+ t.equal('GET', req.method)
+ t.equal(`localhost:${requestedServer.address().port}`, req.headers.host)
+ res.statusCode = 200
+ res.end('hello')
+ })
+
+ t.teardown(requestedServer.close.bind(requestedServer))
+ t.teardown(pathServer.close.bind(pathServer))
+
+ await Promise.all([
+ requestedServer.listen(0),
+ pathServer.listen(0)
+ ])
+
+ const noSlashPathname = await request({
+ method: 'GET',
+ origin: `http://localhost:${requestedServer.address().port}`,
+ pathname: `localhost:${pathServer.address().port}`
+ })
+ t.equal(noSlashPathname.statusCode, 200)
+ const noSlashPath = await request({
+ method: 'GET',
+ origin: `http://localhost:${requestedServer.address().port}`,
+ path: `localhost:${pathServer.address().port}`
+ })
+ t.equal(noSlashPath.statusCode, 200)
+ const noSlashPath2Arg = await request(
+ `http://localhost:${requestedServer.address().port}`,
+ { path: `localhost:${pathServer.address().port}` }
+ )
+ t.equal(noSlashPath2Arg.statusCode, 200)
+ const oneSlashPathname = await request({
+ method: 'GET',
+ origin: `http://localhost:${requestedServer.address().port}`,
+ pathname: `/localhost:${pathServer.address().port}`
+ })
+ t.equal(oneSlashPathname.statusCode, 200)
+ const oneSlashPath = await request({
+ method: 'GET',
+ origin: `http://localhost:${requestedServer.address().port}`,
+ path: `/localhost:${pathServer.address().port}`
+ })
+ t.equal(oneSlashPath.statusCode, 200)
+ const oneSlashPath2Arg = await request(
+ `http://localhost:${requestedServer.address().port}`,
+ { path: `/localhost:${pathServer.address().port}` }
+ )
+ t.equal(oneSlashPath2Arg.statusCode, 200)
+ t.end()
+})
+
+test('protocol-relative URL as pathname should be included in req.path', async (t) => {
+ const pathServer = createServer((req, res) => {
+ t.fail('it shouldn\'t be called')
+ res.statusCode = 200
+ res.end('hello')
+ })
+
+ const requestedServer = createServer((req, res) => {
+ t.equal(`//localhost:${pathServer.address().port}`, req.url)
+ t.equal('GET', req.method)
+ t.equal(`localhost:${requestedServer.address().port}`, req.headers.host)
+ res.statusCode = 200
+ res.end('hello')
+ })
+
+ t.teardown(requestedServer.close.bind(requestedServer))
+ t.teardown(pathServer.close.bind(pathServer))
+
+ await Promise.all([
+ requestedServer.listen(0),
+ pathServer.listen(0)
+ ])
+
+ const noSlashPathname = await request({
+ method: 'GET',
+ origin: `http://localhost:${requestedServer.address().port}`,
+ pathname: `//localhost:${pathServer.address().port}`
+ })
+ t.equal(noSlashPathname.statusCode, 200)
+ const noSlashPath = await request({
+ method: 'GET',
+ origin: `http://localhost:${requestedServer.address().port}`,
+ path: `//localhost:${pathServer.address().port}`
+ })
+ t.equal(noSlashPath.statusCode, 200)
+ const noSlashPath2Arg = await request(
+ `http://localhost:${requestedServer.address().port}`,
+ { path: `//localhost:${pathServer.address().port}` }
+ )
+ t.equal(noSlashPath2Arg.statusCode, 200)
+ t.end()
+})
+
+test('Absolute URL as pathname should be included in req.path', async (t) => {
+ const pathServer = createServer((req, res) => {
+ t.fail('it shouldn\'t be called')
+ res.statusCode = 200
+ res.end('hello')
+ })
+
+ const requestedServer = createServer((req, res) => {
+ t.equal(`/http://localhost:${pathServer.address().port}`, req.url)
+ t.equal('GET', req.method)
+ t.equal(`localhost:${requestedServer.address().port}`, req.headers.host)
+ res.statusCode = 200
+ res.end('hello')
+ })
+
+ t.teardown(requestedServer.close.bind(requestedServer))
+ t.teardown(pathServer.close.bind(pathServer))
+
+ await Promise.all([
+ requestedServer.listen(0),
+ pathServer.listen(0)
+ ])
+
+ const noSlashPathname = await request({
+ method: 'GET',
+ origin: `http://localhost:${requestedServer.address().port}`,
+ pathname: `http://localhost:${pathServer.address().port}`
+ })
+ t.equal(noSlashPathname.statusCode, 200)
+ const noSlashPath = await request({
+ method: 'GET',
+ origin: `http://localhost:${requestedServer.address().port}`,
+ path: `http://localhost:${pathServer.address().port}`
+ })
+ t.equal(noSlashPath.statusCode, 200)
+ const noSlashPath2Arg = await request(
+ `http://localhost:${requestedServer.address().port}`,
+ { path: `http://localhost:${pathServer.address().port}` }
+ )
+ t.equal(noSlashPath2Arg.statusCode, 200)
+ t.end()
+})
+
+test('DispatchOptions#reset', scope => {
+ scope.plan(4)
+
+ scope.test('Should throw if invalid reset option', t => {
+ t.plan(1)
+
+ t.rejects(request({
+ method: 'GET',
+ origin: 'http://somehost.xyz',
+ reset: 0
+ }), 'invalid reset')
+ })
+
+ scope.test('Should include "connection:close" if reset true', async t => {
+ const server = createServer((req, res) => {
+ t.equal('GET', req.method)
+ t.equal(`localhost:${server.address().port}`, req.headers.host)
+ t.equal(req.headers.connection, 'close')
+ res.statusCode = 200
+ res.end('hello')
+ })
+
+ t.plan(3)
+
+ t.teardown(server.close.bind(server))
+
+ await new Promise((resolve, reject) => {
+ server.listen(0, (err) => {
+ if (err != null) reject(err)
+ else resolve()
+ })
+ })
+
+ await request({
+ method: 'GET',
+ origin: `http://localhost:${server.address().port}`,
+ reset: true
+ })
+ })
+
+ scope.test('Should include "connection:keep-alive" if reset false', async t => {
+ const server = createServer((req, res) => {
+ t.equal('GET', req.method)
+ t.equal(`localhost:${server.address().port}`, req.headers.host)
+ t.equal(req.headers.connection, 'keep-alive')
+ res.statusCode = 200
+ res.end('hello')
+ })
+
+ t.plan(3)
+
+ t.teardown(server.close.bind(server))
+
+ await new Promise((resolve, reject) => {
+ server.listen(0, (err) => {
+ if (err != null) reject(err)
+ else resolve()
+ })
+ })
+
+ await request({
+ method: 'GET',
+ origin: `http://localhost:${server.address().port}`,
+ reset: false
+ })
+ })
+
+ scope.test('Should react to manual set of "connection:close" header', async t => {
+ const server = createServer((req, res) => {
+ t.equal('GET', req.method)
+ t.equal(`localhost:${server.address().port}`, req.headers.host)
+ t.equal(req.headers.connection, 'close')
+ res.statusCode = 200
+ res.end('hello')
+ })
+
+ t.plan(3)
+
+ t.teardown(server.close.bind(server))
+
+ await new Promise((resolve, reject) => {
+ server.listen(0, (err) => {
+ if (err != null) reject(err)
+ else resolve()
+ })
+ })
+
+ await request({
+ method: 'GET',
+ origin: `http://localhost:${server.address().port}`,
+ headers: {
+ connection: 'close'
+ }
+ })
+ })
+})