@wiajs/request 3.0.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/.github/ISSUE_TEMPLATE.md +56 -0
  2. package/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  3. package/.github/stale.yml +19 -0
  4. package/.swcrc +57 -0
  5. package/.travis.yml +21 -0
  6. package/CHANGELOG.md +717 -0
  7. package/CONTRIBUTING.md +81 -0
  8. package/biome.json +44 -0
  9. package/codecov.yml +2 -0
  10. package/disabled.appveyor.yml +36 -0
  11. package/dist/request.cjs +1476 -0
  12. package/dist/request.mjs +1474 -0
  13. package/examples/README.md +135 -0
  14. package/gulpfile.js +71 -0
  15. package/package.json +1 -2
  16. package/release.sh +45 -0
  17. package/tests/browser/karma.conf.js +57 -0
  18. package/tests/browser/ssl/ca.crt +14 -0
  19. package/tests/browser/ssl/server.crt +14 -0
  20. package/tests/browser/ssl/server.key +15 -0
  21. package/tests/browser/start.js +37 -0
  22. package/tests/browser/test.js +34 -0
  23. package/tests/fixtures/har.json +158 -0
  24. package/tests/googledoodle.jpg +0 -0
  25. package/tests/server.js +142 -0
  26. package/tests/squid.conf +76 -0
  27. package/tests/ssl/ca/README.md +8 -0
  28. package/tests/ssl/ca/ca.cnf +20 -0
  29. package/tests/ssl/ca/ca.crl +0 -0
  30. package/tests/ssl/ca/ca.crt +17 -0
  31. package/tests/ssl/ca/ca.csr +13 -0
  32. package/tests/ssl/ca/ca.key +18 -0
  33. package/tests/ssl/ca/ca.srl +1 -0
  34. package/tests/ssl/ca/client-enc.key +30 -0
  35. package/tests/ssl/ca/client.cnf +20 -0
  36. package/tests/ssl/ca/client.crt +20 -0
  37. package/tests/ssl/ca/client.csr +18 -0
  38. package/tests/ssl/ca/client.key +27 -0
  39. package/tests/ssl/ca/gen-all-certs.sh +6 -0
  40. package/tests/ssl/ca/gen-client.sh +25 -0
  41. package/tests/ssl/ca/gen-localhost.sh +22 -0
  42. package/tests/ssl/ca/gen-server.sh +18 -0
  43. package/tests/ssl/ca/localhost.cnf +20 -0
  44. package/tests/ssl/ca/localhost.crt +20 -0
  45. package/tests/ssl/ca/localhost.csr +18 -0
  46. package/tests/ssl/ca/localhost.js +33 -0
  47. package/tests/ssl/ca/localhost.key +27 -0
  48. package/tests/ssl/ca/server.cnf +19 -0
  49. package/tests/ssl/ca/server.crt +25 -0
  50. package/tests/ssl/ca/server.csr +29 -0
  51. package/tests/ssl/ca/server.js +34 -0
  52. package/tests/ssl/ca/server.key +51 -0
  53. package/tests/ssl/npm-ca.crt +16 -0
  54. package/tests/ssl/test.crt +15 -0
  55. package/tests/ssl/test.key +15 -0
  56. package/tests/test-agent.js +102 -0
  57. package/tests/test-agentOptions.js +51 -0
  58. package/tests/test-api.js +33 -0
  59. package/tests/test-aws.js +123 -0
  60. package/tests/test-baseUrl.js +133 -0
  61. package/tests/test-basic-auth.js +221 -0
  62. package/tests/test-bearer-auth.js +187 -0
  63. package/tests/test-body.js +154 -0
  64. package/tests/test-cookies.js +130 -0
  65. package/tests/test-defaults.js +340 -0
  66. package/tests/test-digest-auth.js +232 -0
  67. package/tests/test-emptyBody.js +56 -0
  68. package/tests/test-errors.js +108 -0
  69. package/tests/test-event-forwarding.js +39 -0
  70. package/tests/test-follow-all-303.js +45 -0
  71. package/tests/test-follow-all.js +57 -0
  72. package/tests/test-form-data-error.js +85 -0
  73. package/tests/test-form-data.js +133 -0
  74. package/tests/test-form-urlencoded.js +73 -0
  75. package/tests/test-form.js +101 -0
  76. package/tests/test-gzip.js +296 -0
  77. package/tests/test-har.js +175 -0
  78. package/tests/test-hawk.js +187 -0
  79. package/tests/test-headers.js +305 -0
  80. package/tests/test-http-signature.js +110 -0
  81. package/tests/test-httpModule.js +112 -0
  82. package/tests/test-https.js +116 -0
  83. package/tests/test-isUrl.js +120 -0
  84. package/tests/test-json-request.js +117 -0
  85. package/tests/test-localAddress.js +49 -0
  86. package/tests/test-multipart-encoding.js +147 -0
  87. package/tests/test-multipart.js +129 -0
  88. package/tests/test-node-debug.js +95 -0
  89. package/tests/test-oauth.js +721 -0
  90. package/tests/test-onelineproxy.js +61 -0
  91. package/tests/test-option-reuse.js +54 -0
  92. package/tests/test-options-convenience-method.js +52 -0
  93. package/tests/test-params.js +101 -0
  94. package/tests/test-piped-redirect.js +55 -0
  95. package/tests/test-pipes.js +383 -0
  96. package/tests/test-pool.js +148 -0
  97. package/tests/test-promise.js +53 -0
  98. package/tests/test-proxy-connect.js +80 -0
  99. package/tests/test-proxy.js +304 -0
  100. package/tests/test-qs.js +135 -0
  101. package/tests/test-redirect-auth.js +131 -0
  102. package/tests/test-redirect-complex.js +93 -0
  103. package/tests/test-redirect.js +449 -0
  104. package/tests/test-rfc3986.js +106 -0
  105. package/tests/test-stream.js +36 -0
  106. package/tests/test-timeout.js +260 -0
  107. package/tests/test-timing.js +147 -0
  108. package/tests/test-toJSON.js +45 -0
  109. package/tests/test-tunnel.js +466 -0
  110. package/tests/test-unix.js +74 -0
  111. package/tests/unicycle.jpg +0 -0
  112. package/request.js +0 -1553
  113. package/src/ZlibTransform.js +0 -27
  114. package/src/caseless.js +0 -118
  115. package/src/index.js +0 -122
  116. package/src/request.js +0 -967
  117. package/src/utils.js +0 -274
@@ -0,0 +1,221 @@
1
+ 'use strict'
2
+
3
+ var assert = require('assert')
4
+ var http = require('http')
5
+ var request = require('../index')
6
+ var tape = require('tape')
7
+
8
+ var numBasicRequests = 0
9
+ var basicServer
10
+
11
+ tape('setup', function (t) {
12
+ basicServer = http.createServer(function (req, res) {
13
+ numBasicRequests++
14
+
15
+ var ok
16
+
17
+ if (req.headers.authorization) {
18
+ if (req.headers.authorization === 'Basic ' + Buffer.from('user:pass').toString('base64')) {
19
+ ok = true
20
+ } else if (req.headers.authorization === 'Basic ' + Buffer.from('user:').toString('base64')) {
21
+ ok = true
22
+ } else if (req.headers.authorization === 'Basic ' + Buffer.from(':pass').toString('base64')) {
23
+ ok = true
24
+ } else if (req.headers.authorization === 'Basic ' + Buffer.from('user:pâss').toString('base64')) {
25
+ ok = true
26
+ } else {
27
+ // Bad auth header, don't send back WWW-Authenticate header
28
+ ok = false
29
+ }
30
+ } else {
31
+ // No auth header, send back WWW-Authenticate header
32
+ ok = false
33
+ res.setHeader('www-authenticate', 'Basic realm="Private"')
34
+ }
35
+
36
+ if (req.url === '/post/') {
37
+ var expectedContent = 'key=value'
38
+ req.on('data', function (data) {
39
+ assert.equal(data, expectedContent)
40
+ })
41
+ assert.equal(req.method, 'POST')
42
+ assert.equal(req.headers['content-length'], '' + expectedContent.length)
43
+ assert.equal(req.headers['content-type'], 'application/x-www-form-urlencoded')
44
+ }
45
+
46
+ if (ok) {
47
+ res.end('ok')
48
+ } else {
49
+ res.statusCode = 401
50
+ res.end('401')
51
+ }
52
+ }).listen(0, function () {
53
+ basicServer.port = this.address().port
54
+ basicServer.url = 'http://localhost:' + basicServer.port
55
+ t.end()
56
+ })
57
+ })
58
+
59
+ tape('sendImmediately - false', function (t) {
60
+ var r = request({
61
+ 'method': 'GET',
62
+ 'uri': basicServer.url + '/test/',
63
+ 'auth': {
64
+ 'user': 'user',
65
+ 'pass': 'pass',
66
+ 'sendImmediately': false
67
+ }
68
+ }, function (error, res, body) {
69
+ t.error(error)
70
+ t.equal(r._auth.user, 'user')
71
+ t.equal(res.statusCode, 200)
72
+ t.equal(numBasicRequests, 2)
73
+ t.end()
74
+ })
75
+ })
76
+
77
+ tape('sendImmediately - true', function (t) {
78
+ // If we don't set sendImmediately = false, request will send basic auth
79
+ var r = request({
80
+ 'method': 'GET',
81
+ 'uri': basicServer.url + '/test2/',
82
+ 'auth': {
83
+ 'user': 'user',
84
+ 'pass': 'pass'
85
+ }
86
+ }, function (error, res, body) {
87
+ t.error(error)
88
+ t.equal(r._auth.user, 'user')
89
+ t.equal(res.statusCode, 200)
90
+ t.equal(numBasicRequests, 3)
91
+ t.end()
92
+ })
93
+ })
94
+
95
+ tape('credentials in url', function (t) {
96
+ var r = request({
97
+ 'method': 'GET',
98
+ 'uri': basicServer.url.replace(/:\/\//, '$&user:pass@') + '/test2/'
99
+ }, function (error, res, body) {
100
+ t.error(error)
101
+ t.equal(r._auth.user, 'user')
102
+ t.equal(res.statusCode, 200)
103
+ t.equal(numBasicRequests, 4)
104
+ t.end()
105
+ })
106
+ })
107
+
108
+ tape('POST request', function (t) {
109
+ var r = request({
110
+ 'method': 'POST',
111
+ 'form': { 'key': 'value' },
112
+ 'uri': basicServer.url + '/post/',
113
+ 'auth': {
114
+ 'user': 'user',
115
+ 'pass': 'pass',
116
+ 'sendImmediately': false
117
+ }
118
+ }, function (error, res, body) {
119
+ t.error(error)
120
+ t.equal(r._auth.user, 'user')
121
+ t.equal(res.statusCode, 200)
122
+ t.equal(numBasicRequests, 6)
123
+ t.end()
124
+ })
125
+ })
126
+
127
+ tape('user - empty string', function (t) {
128
+ t.doesNotThrow(function () {
129
+ var r = request({
130
+ 'method': 'GET',
131
+ 'uri': basicServer.url + '/allow_empty_user/',
132
+ 'auth': {
133
+ 'user': '',
134
+ 'pass': 'pass',
135
+ 'sendImmediately': false
136
+ }
137
+ }, function (error, res, body) {
138
+ t.error(error)
139
+ t.equal(r._auth.user, '')
140
+ t.equal(res.statusCode, 200)
141
+ t.equal(numBasicRequests, 8)
142
+ t.end()
143
+ })
144
+ })
145
+ })
146
+
147
+ tape('pass - undefined', function (t) {
148
+ t.doesNotThrow(function () {
149
+ var r = request({
150
+ 'method': 'GET',
151
+ 'uri': basicServer.url + '/allow_undefined_password/',
152
+ 'auth': {
153
+ 'user': 'user',
154
+ 'pass': undefined,
155
+ 'sendImmediately': false
156
+ }
157
+ }, function (error, res, body) {
158
+ t.error(error)
159
+ t.equal(r._auth.user, 'user')
160
+ t.equal(res.statusCode, 200)
161
+ t.equal(numBasicRequests, 10)
162
+ t.end()
163
+ })
164
+ })
165
+ })
166
+
167
+ tape('pass - utf8', function (t) {
168
+ t.doesNotThrow(function () {
169
+ var r = request({
170
+ 'method': 'GET',
171
+ 'uri': basicServer.url + '/allow_undefined_password/',
172
+ 'auth': {
173
+ 'user': 'user',
174
+ 'pass': 'pâss',
175
+ 'sendImmediately': false
176
+ }
177
+ }, function (error, res, body) {
178
+ t.error(error)
179
+ t.equal(r._auth.user, 'user')
180
+ t.equal(r._auth.pass, 'pâss')
181
+ t.equal(res.statusCode, 200)
182
+ t.equal(numBasicRequests, 12)
183
+ t.end()
184
+ })
185
+ })
186
+ })
187
+
188
+ tape('auth method', function (t) {
189
+ var r = request
190
+ .get(basicServer.url + '/test/')
191
+ .auth('user', '', false)
192
+ .on('response', function (res) {
193
+ t.equal(r._auth.user, 'user')
194
+ t.equal(res.statusCode, 200)
195
+ t.equal(numBasicRequests, 14)
196
+ t.end()
197
+ })
198
+ })
199
+
200
+ tape('get method', function (t) {
201
+ var r = request.get(basicServer.url + '/test/',
202
+ {
203
+ auth: {
204
+ user: 'user',
205
+ pass: '',
206
+ sendImmediately: false
207
+ }
208
+ }, function (err, res) {
209
+ t.equal(r._auth.user, 'user')
210
+ t.equal(err, null)
211
+ t.equal(res.statusCode, 200)
212
+ t.equal(numBasicRequests, 16)
213
+ t.end()
214
+ })
215
+ })
216
+
217
+ tape('cleanup', function (t) {
218
+ basicServer.close(function () {
219
+ t.end()
220
+ })
221
+ })
@@ -0,0 +1,187 @@
1
+ 'use strict'
2
+
3
+ var assert = require('assert')
4
+ var http = require('http')
5
+ var request = require('../index')
6
+ var tape = require('tape')
7
+
8
+ var numBearerRequests = 0
9
+ var bearerServer
10
+
11
+ tape('setup', function (t) {
12
+ bearerServer = http.createServer(function (req, res) {
13
+ numBearerRequests++
14
+
15
+ var ok
16
+
17
+ if (req.headers.authorization) {
18
+ if (req.headers.authorization === 'Bearer theToken') {
19
+ ok = true
20
+ } else {
21
+ // Bad auth header, don't send back WWW-Authenticate header
22
+ ok = false
23
+ }
24
+ } else {
25
+ // No auth header, send back WWW-Authenticate header
26
+ ok = false
27
+ res.setHeader('www-authenticate', 'Bearer realm="Private"')
28
+ }
29
+
30
+ if (req.url === '/post/') {
31
+ var expectedContent = 'data_key=data_value'
32
+ req.on('data', function (data) {
33
+ assert.equal(data, expectedContent)
34
+ })
35
+ assert.equal(req.method, 'POST')
36
+ assert.equal(req.headers['content-length'], '' + expectedContent.length)
37
+ assert.equal(req.headers['content-type'], 'application/x-www-form-urlencoded')
38
+ }
39
+
40
+ if (ok) {
41
+ res.end('ok')
42
+ } else {
43
+ res.statusCode = 401
44
+ res.end('401')
45
+ }
46
+ }).listen(0, function () {
47
+ bearerServer.url = 'http://localhost:' + this.address().port
48
+ t.end()
49
+ })
50
+ })
51
+
52
+ tape('bearer auth', function (t) {
53
+ request({
54
+ 'method': 'GET',
55
+ 'uri': bearerServer.url + '/test/',
56
+ 'auth': {
57
+ 'bearer': 'theToken',
58
+ 'sendImmediately': false
59
+ }
60
+ }, function (error, res, body) {
61
+ t.error(error)
62
+ t.equal(res.statusCode, 200)
63
+ t.equal(numBearerRequests, 2)
64
+ t.end()
65
+ })
66
+ })
67
+
68
+ tape('bearer auth with default sendImmediately', function (t) {
69
+ // If we don't set sendImmediately = false, request will send bearer auth
70
+ request({
71
+ 'method': 'GET',
72
+ 'uri': bearerServer.url + '/test2/',
73
+ 'auth': {
74
+ 'bearer': 'theToken'
75
+ }
76
+ }, function (error, res, body) {
77
+ t.error(error)
78
+ t.equal(res.statusCode, 200)
79
+ t.equal(numBearerRequests, 3)
80
+ t.end()
81
+ })
82
+ })
83
+
84
+ tape('', function (t) {
85
+ request({
86
+ 'method': 'POST',
87
+ 'form': { 'data_key': 'data_value' },
88
+ 'uri': bearerServer.url + '/post/',
89
+ 'auth': {
90
+ 'bearer': 'theToken',
91
+ 'sendImmediately': false
92
+ }
93
+ }, function (error, res, body) {
94
+ t.error(error)
95
+ t.equal(res.statusCode, 200)
96
+ t.equal(numBearerRequests, 5)
97
+ t.end()
98
+ })
99
+ })
100
+
101
+ tape('using .auth, sendImmediately = false', function (t) {
102
+ request
103
+ .get(bearerServer.url + '/test/')
104
+ .auth(null, null, false, 'theToken')
105
+ .on('response', function (res) {
106
+ t.equal(res.statusCode, 200)
107
+ t.equal(numBearerRequests, 7)
108
+ t.end()
109
+ })
110
+ })
111
+
112
+ tape('using .auth, sendImmediately = true', function (t) {
113
+ request
114
+ .get(bearerServer.url + '/test/')
115
+ .auth(null, null, true, 'theToken')
116
+ .on('response', function (res) {
117
+ t.equal(res.statusCode, 200)
118
+ t.equal(numBearerRequests, 8)
119
+ t.end()
120
+ })
121
+ })
122
+
123
+ tape('bearer is a function', function (t) {
124
+ request({
125
+ 'method': 'GET',
126
+ 'uri': bearerServer.url + '/test/',
127
+ 'auth': {
128
+ 'bearer': function () { return 'theToken' },
129
+ 'sendImmediately': false
130
+ }
131
+ }, function (error, res, body) {
132
+ t.error(error)
133
+ t.equal(res.statusCode, 200)
134
+ t.equal(numBearerRequests, 10)
135
+ t.end()
136
+ })
137
+ })
138
+
139
+ tape('bearer is a function, path = test2', function (t) {
140
+ // If we don't set sendImmediately = false, request will send bearer auth
141
+ request({
142
+ 'method': 'GET',
143
+ 'uri': bearerServer.url + '/test2/',
144
+ 'auth': {
145
+ 'bearer': function () { return 'theToken' }
146
+ }
147
+ }, function (error, res, body) {
148
+ t.error(error)
149
+ t.equal(res.statusCode, 200)
150
+ t.equal(numBearerRequests, 11)
151
+ t.end()
152
+ })
153
+ })
154
+
155
+ tape('no auth method', function (t) {
156
+ request({
157
+ 'method': 'GET',
158
+ 'uri': bearerServer.url + '/test2/',
159
+ 'auth': {
160
+ 'bearer': undefined
161
+ }
162
+ }, function (error, res, body) {
163
+ t.equal(error.message, 'no auth mechanism defined')
164
+ t.end()
165
+ })
166
+ })
167
+
168
+ tape('null bearer', function (t) {
169
+ request({
170
+ 'method': 'GET',
171
+ 'uri': bearerServer.url + '/test2/',
172
+ 'auth': {
173
+ 'bearer': null
174
+ }
175
+ }, function (error, res, body) {
176
+ t.error(error)
177
+ t.equal(res.statusCode, 401)
178
+ t.equal(numBearerRequests, 13)
179
+ t.end()
180
+ })
181
+ })
182
+
183
+ tape('cleanup', function (t) {
184
+ bearerServer.close(function () {
185
+ t.end()
186
+ })
187
+ })
@@ -0,0 +1,154 @@
1
+ 'use strict'
2
+
3
+ var server = require('./server')
4
+ var request = require('../index')
5
+ var tape = require('tape')
6
+ var http = require('http')
7
+
8
+ var s = server.createServer()
9
+
10
+ tape('setup', function (t) {
11
+ s.listen(0, function () {
12
+ t.end()
13
+ })
14
+ })
15
+
16
+ function addTest (name, data) {
17
+ tape('test ' + name, function (t) {
18
+ s.on('/' + name, data.resp)
19
+ data.uri = s.url + '/' + name
20
+ request(data, function (err, resp, body) {
21
+ t.equal(err, null)
22
+ if (data.expectBody && Buffer.isBuffer(data.expectBody)) {
23
+ t.deepEqual(data.expectBody.toString(), body.toString())
24
+ } else if (data.expectBody) {
25
+ t.deepEqual(data.expectBody, body)
26
+ }
27
+ t.end()
28
+ })
29
+ })
30
+ }
31
+
32
+ addTest('testGet', {
33
+ resp: server.createGetResponse('TESTING!'), expectBody: 'TESTING!'
34
+ })
35
+
36
+ addTest('testGetChunkBreak', {
37
+ resp: server.createChunkResponse(
38
+ [ Buffer.from([239]),
39
+ Buffer.from([163]),
40
+ Buffer.from([191]),
41
+ Buffer.from([206]),
42
+ Buffer.from([169]),
43
+ Buffer.from([226]),
44
+ Buffer.from([152]),
45
+ Buffer.from([131])
46
+ ]),
47
+ expectBody: '\uF8FF\u03A9\u2603'
48
+ })
49
+
50
+ addTest('testGetBuffer', {
51
+ resp: server.createGetResponse(Buffer.from('TESTING!')), encoding: null, expectBody: Buffer.from('TESTING!')
52
+ })
53
+
54
+ addTest('testGetEncoding', {
55
+ resp: server.createGetResponse(Buffer.from('efa3bfcea9e29883', 'hex')), encoding: 'hex', expectBody: 'efa3bfcea9e29883'
56
+ })
57
+
58
+ addTest('testGetUTF', {
59
+ resp: server.createGetResponse(Buffer.from([0xEF, 0xBB, 0xBF, 226, 152, 131])), encoding: 'utf8', expectBody: '\u2603'
60
+ })
61
+
62
+ addTest('testGetJSON', {
63
+ resp: server.createGetResponse('{"test":true}', 'application/json'), json: true, expectBody: {'test': true}
64
+ })
65
+
66
+ addTest('testPutString', {
67
+ resp: server.createPostValidator('PUTTINGDATA'), method: 'PUT', body: 'PUTTINGDATA'
68
+ })
69
+
70
+ addTest('testPutBuffer', {
71
+ resp: server.createPostValidator('PUTTINGDATA'), method: 'PUT', body: Buffer.from('PUTTINGDATA')
72
+ })
73
+
74
+ addTest('testPutJSON', {
75
+ resp: server.createPostValidator(JSON.stringify({foo: 'bar'})), method: 'PUT', json: {foo: 'bar'}
76
+ })
77
+
78
+ addTest('testPutMultipart', {
79
+ resp: server.createPostValidator(
80
+ '--__BOUNDARY__\r\n' +
81
+ 'content-type: text/html\r\n' +
82
+ '\r\n' +
83
+ '<html><body>Oh hi.</body></html>' +
84
+ '\r\n--__BOUNDARY__\r\n\r\n' +
85
+ 'Oh hi.' +
86
+ '\r\n--__BOUNDARY__--'
87
+ ),
88
+ method: 'PUT',
89
+ multipart: [ {'content-type': 'text/html', 'body': '<html><body>Oh hi.</body></html>'},
90
+ {'body': 'Oh hi.'}
91
+ ]
92
+ })
93
+
94
+ addTest('testPutMultipartPreambleCRLF', {
95
+ resp: server.createPostValidator(
96
+ '\r\n--__BOUNDARY__\r\n' +
97
+ 'content-type: text/html\r\n' +
98
+ '\r\n' +
99
+ '<html><body>Oh hi.</body></html>' +
100
+ '\r\n--__BOUNDARY__\r\n\r\n' +
101
+ 'Oh hi.' +
102
+ '\r\n--__BOUNDARY__--'
103
+ ),
104
+ method: 'PUT',
105
+ preambleCRLF: true,
106
+ multipart: [ {'content-type': 'text/html', 'body': '<html><body>Oh hi.</body></html>'},
107
+ {'body': 'Oh hi.'}
108
+ ]
109
+ })
110
+
111
+ addTest('testPutMultipartPostambleCRLF', {
112
+ resp: server.createPostValidator(
113
+ '\r\n--__BOUNDARY__\r\n' +
114
+ 'content-type: text/html\r\n' +
115
+ '\r\n' +
116
+ '<html><body>Oh hi.</body></html>' +
117
+ '\r\n--__BOUNDARY__\r\n\r\n' +
118
+ 'Oh hi.' +
119
+ '\r\n--__BOUNDARY__--' +
120
+ '\r\n'
121
+ ),
122
+ method: 'PUT',
123
+ preambleCRLF: true,
124
+ postambleCRLF: true,
125
+ multipart: [ {'content-type': 'text/html', 'body': '<html><body>Oh hi.</body></html>'},
126
+ {'body': 'Oh hi.'}
127
+ ]
128
+ })
129
+
130
+ tape('typed array', function (t) {
131
+ var server = http.createServer()
132
+ server.on('request', function (req, res) {
133
+ req.pipe(res)
134
+ })
135
+ server.listen(0, function () {
136
+ var data = new Uint8Array([1, 2, 3])
137
+ request({
138
+ uri: 'http://localhost:' + this.address().port,
139
+ method: 'POST',
140
+ body: data,
141
+ encoding: null
142
+ }, function (err, res, body) {
143
+ t.error(err)
144
+ t.deepEqual(Buffer.from(data), body)
145
+ server.close(t.end)
146
+ })
147
+ })
148
+ })
149
+
150
+ tape('cleanup', function (t) {
151
+ s.close(function () {
152
+ t.end()
153
+ })
154
+ })
@@ -0,0 +1,130 @@
1
+ 'use strict'
2
+
3
+ var http = require('http')
4
+ var request = require('../index')
5
+ var tape = require('tape')
6
+
7
+ var validUrl
8
+ var malformedUrl
9
+ var invalidUrl
10
+
11
+ var server = http.createServer(function (req, res) {
12
+ if (req.url === '/valid') {
13
+ res.setHeader('set-cookie', 'foo=bar')
14
+ } else if (req.url === '/malformed') {
15
+ res.setHeader('set-cookie', 'foo')
16
+ } else if (req.url === '/invalid') {
17
+ res.setHeader('set-cookie', 'foo=bar; Domain=foo.com')
18
+ }
19
+ res.end('okay')
20
+ })
21
+
22
+ tape('setup', function (t) {
23
+ server.listen(0, function () {
24
+ server.url = 'http://localhost:' + this.address().port
25
+ validUrl = server.url + '/valid'
26
+ malformedUrl = server.url + '/malformed'
27
+ invalidUrl = server.url + '/invalid'
28
+ t.end()
29
+ })
30
+ })
31
+
32
+ tape('simple cookie creation', function (t) {
33
+ var cookie = request.cookie('foo=bar')
34
+ t.equals(cookie.key, 'foo')
35
+ t.equals(cookie.value, 'bar')
36
+ t.end()
37
+ })
38
+
39
+ tape('simple malformed cookie creation', function (t) {
40
+ var cookie = request.cookie('foo')
41
+ t.equals(cookie.key, '')
42
+ t.equals(cookie.value, 'foo')
43
+ t.end()
44
+ })
45
+
46
+ tape('after server sends a cookie', function (t) {
47
+ var jar1 = request.jar()
48
+ request({
49
+ method: 'GET',
50
+ url: validUrl,
51
+ jar: jar1
52
+ },
53
+ function (error, response, body) {
54
+ t.equal(error, null)
55
+ t.equal(jar1.getCookieString(validUrl), 'foo=bar')
56
+ t.equal(body, 'okay')
57
+
58
+ var cookies = jar1.getCookies(validUrl)
59
+ t.equal(cookies.length, 1)
60
+ t.equal(cookies[0].key, 'foo')
61
+ t.equal(cookies[0].value, 'bar')
62
+ t.end()
63
+ })
64
+ })
65
+
66
+ tape('after server sends a malformed cookie', function (t) {
67
+ var jar = request.jar()
68
+ request({
69
+ method: 'GET',
70
+ url: malformedUrl,
71
+ jar: jar
72
+ },
73
+ function (error, response, body) {
74
+ t.equal(error, null)
75
+ t.equal(jar.getCookieString(malformedUrl), 'foo')
76
+ t.equal(body, 'okay')
77
+
78
+ var cookies = jar.getCookies(malformedUrl)
79
+ t.equal(cookies.length, 1)
80
+ t.equal(cookies[0].key, '')
81
+ t.equal(cookies[0].value, 'foo')
82
+ t.end()
83
+ })
84
+ })
85
+
86
+ tape('after server sends a cookie for a different domain', function (t) {
87
+ var jar2 = request.jar()
88
+ request({
89
+ method: 'GET',
90
+ url: invalidUrl,
91
+ jar: jar2
92
+ },
93
+ function (error, response, body) {
94
+ t.equal(error, null)
95
+ t.equal(jar2.getCookieString(validUrl), '')
96
+ t.deepEqual(jar2.getCookies(validUrl), [])
97
+ t.equal(body, 'okay')
98
+ t.end()
99
+ })
100
+ })
101
+
102
+ tape('make sure setCookie works', function (t) {
103
+ var jar3 = request.jar()
104
+ var err = null
105
+ try {
106
+ jar3.setCookie(request.cookie('foo=bar'), validUrl)
107
+ } catch (e) {
108
+ err = e
109
+ }
110
+ t.equal(err, null)
111
+ var cookies = jar3.getCookies(validUrl)
112
+ t.equal(cookies.length, 1)
113
+ t.equal(cookies[0].key, 'foo')
114
+ t.equal(cookies[0].value, 'bar')
115
+ t.end()
116
+ })
117
+
118
+ tape('custom store', function (t) {
119
+ var Store = function () {}
120
+ var store = new Store()
121
+ var jar = request.jar(store)
122
+ t.equals(store, jar._jar.store)
123
+ t.end()
124
+ })
125
+
126
+ tape('cleanup', function (t) {
127
+ server.close(function () {
128
+ t.end()
129
+ })
130
+ })