Skip to content

Commit 10d22b7

Browse files
szmarczaksindresorhus
authored andcommittedAug 3, 2018
Increase coverage (#542)
1 parent 99dbd97 commit 10d22b7

7 files changed

+120
-18
lines changed
 

‎source/normalize-arguments.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,10 @@ module.exports = (url, options, defaults) => {
169169

170170
if (Reflect.has(error, 'headers') && Reflect.has(error.headers, 'retry-after') && retryAfterStatusCodes.has(error.statusCode)) {
171171
let after = Number(error.headers['retry-after']);
172-
if (is.number(after)) {
173-
after *= 1000;
172+
if (is.nan(after)) {
173+
after = Date.parse(error.headers['retry-after']) - Date.now();
174174
} else {
175-
after = Math.max(Date.parse(error.headers['retry-after']) - Date.now(), 0);
175+
after *= 1000;
176176
}
177177

178178
if (after > options.gotRetry.maxRetryAfter) {

‎source/request-as-event-emitter.js

+9-9
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ const {GotError, CacheError, UnsupportedProtocolError, MaxRedirectsError, Reques
1515
const getMethodRedirectCodes = new Set([300, 301, 302, 303, 304, 305, 307, 308]);
1616
const allMethodRedirectCodes = new Set([300, 303, 307, 308]);
1717

18-
module.exports = (options = {}) => {
18+
module.exports = options => {
1919
const emitter = new EventEmitter();
2020
const requestUrl = options.href || (new URLGlobal(options.path, urlLib.format(options))).toString();
2121
const redirects = [];
@@ -138,17 +138,17 @@ module.exports = (options = {}) => {
138138
};
139139

140140
emitter.on('retry', (error, cb) => {
141-
const backoff = options.gotRetry.retries(++retryTries, error);
141+
let backoff;
142+
try {
143+
backoff = options.gotRetry.retries(++retryTries, error);
144+
} catch (error) {
145+
emitter.emit('error', error);
146+
return;
147+
}
142148

143149
if (backoff) {
144150
retryCount++;
145-
setTimeout(options => {
146-
try {
147-
get(options);
148-
} catch (error2) {
149-
emitter.emit('error', error2);
150-
}
151-
}, backoff, options);
151+
setTimeout(get, backoff, options);
152152
cb(true);
153153
return;
154154
}

‎test/error.js

+11
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ test.before('setup', async () => {
2727
response.end('body');
2828
});
2929

30+
s.on('/no-status-message', (request, response) => {
31+
response.writeHead(400, '');
32+
response.end('body');
33+
});
34+
3035
s.on('/body', async (request, response) => {
3136
const body = await getStream(request);
3237
response.end(body);
@@ -102,6 +107,12 @@ test('custom status message', async t => {
102107
t.is(error.statusMessage, 'Something Exploded');
103108
});
104109

110+
test('no status message is overriden by the default one', async t => {
111+
const error = await t.throws(got(`${s.url}/no-status-message`));
112+
t.is(error.statusCode, 400);
113+
t.is(error.statusMessage, http.STATUS_CODES[400]);
114+
});
115+
105116
test.serial('http.request error', async t => {
106117
const stub = sinon.stub(http, 'request').callsFake(() => {
107118
throw new TypeError('The header content contains invalid characters');

‎test/retry.js

+55-2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ let trys = 0;
88
let knocks = 0;
99
let fifth = 0;
1010
let lastTried413access = Date.now();
11+
let lastTried413TimestampAccess;
1112

1213
const retryAfterOn413 = 2;
1314
const socketTimeout = 200;
@@ -54,6 +55,16 @@ test.before('setup', async () => {
5455
response.end();
5556
});
5657

58+
s.on('/413withTimestamp', (request, response) => {
59+
const date = (new Date(Date.now() + (retryAfterOn413 * 1000))).toUTCString();
60+
61+
response.writeHead(413, {
62+
'Retry-After': date
63+
});
64+
response.end(lastTried413TimestampAccess);
65+
lastTried413TimestampAccess = date;
66+
});
67+
5768
s.on('/413withoutRetryAfter', (request, response) => {
5869
response.statusCode = 413;
5970
response.end();
@@ -149,6 +160,15 @@ test('respect 413 Retry-After', async t => {
149160
t.true(Number(body) >= retryAfterOn413 * 1000);
150161
});
151162

163+
test('respect 413 Retry-After with RFC-1123 timestamp', async t => {
164+
const {statusCode, body} = await got(`${s.url}/413withTimestamp`, {
165+
throwHttpErrors: false,
166+
retry: 1
167+
});
168+
t.is(statusCode, 413);
169+
t.true(Date.now() >= Date.parse(body));
170+
});
171+
152172
test('doesn\'t retry on 413 with empty statusCodes and methods', async t => {
153173
const {statusCode, retryCount} = await got(`${s.url}/413`, {
154174
throwHttpErrors: false,
@@ -193,8 +213,10 @@ test('retries on 503 without Retry-After header', async t => {
193213
test('doesn\'t retry on streams', async t => {
194214
const stream = got.stream(s.url, {
195215
timeout: 1,
196-
retries: () => {
197-
t.fail('Retries on streams');
216+
retry: {
217+
retries: () => {
218+
t.fail('Retries on streams');
219+
}
198220
}
199221
});
200222
await t.throws(pEvent(stream, 'response'));
@@ -207,3 +229,34 @@ test('doesn\'t retry if Retry-After header is greater than maxRetryAfter', async
207229
});
208230
t.is(retryCount, 0);
209231
});
232+
233+
test('doesn\'t retry when set to false', async t => {
234+
const {statusCode, retryCount} = await got(`${s.url}/413`, {
235+
throwHttpErrors: false,
236+
retry: false
237+
});
238+
t.is(statusCode, 413);
239+
t.is(retryCount, 0);
240+
});
241+
242+
test('works when defaults.options.retry is not an object', async t => {
243+
const instance = got.extend({
244+
retry: 2
245+
});
246+
247+
const {retryCount} = await instance(`${s.url}/413`, {
248+
throwHttpErrors: false
249+
});
250+
t.is(retryCount, 0);
251+
});
252+
253+
test('retry function can throw', async t => {
254+
const error = 'Simple error';
255+
await t.throws(got(`${s.url}/413`, {
256+
retry: {
257+
retries: () => {
258+
throw new Error(error);
259+
}
260+
}
261+
}), error);
262+
});

‎test/stream.js

+36-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import test from 'ava';
22
import toReadableStream from 'to-readable-stream';
33
import getStream from 'get-stream';
44
import pEvent from 'p-event';
5+
import delay from 'delay';
56
import is from '@sindresorhus/is';
67
import got from '../source';
78
import {createServer} from './helpers/server';
@@ -13,9 +14,10 @@ test.before('setup', async () => {
1314

1415
s.on('/', (request, response) => {
1516
response.writeHead(200, {
16-
unicorn: 'rainbow'
17+
unicorn: 'rainbow',
18+
'content-encoding': 'gzip'
1719
});
18-
response.end('ok');
20+
response.end(Buffer.from('H4sIAAAAAAAA/8vPBgBH3dx5AgAAAA==', 'base64')); // 'ok'
1921
});
2022

2123
s.on('/post', (request, response) => {
@@ -127,6 +129,38 @@ test('proxying headers works', async t => {
127129

128130
const {headers} = await got(server.url);
129131
t.is(headers.unicorn, 'rainbow');
132+
t.is(headers['content-encoding'], undefined);
130133

131134
await server.close();
132135
});
136+
137+
test('skips proxying headers after server has sent them already', async t => {
138+
const server = await createServer();
139+
140+
server.on('/', (request, response) => {
141+
response.writeHead(200);
142+
got.stream(s.url).pipe(response);
143+
});
144+
145+
await server.listen(server.port);
146+
147+
const {headers} = await got(server.url);
148+
t.is(headers.unicorn, undefined);
149+
150+
await server.close();
151+
});
152+
153+
test('throws when trying to proxy through a closed stream', async t => {
154+
const server = await createServer();
155+
156+
server.on('/', async (request, response) => {
157+
const stream = got.stream(s.url);
158+
await delay(1000);
159+
t.throws(() => stream.pipe(response));
160+
response.end();
161+
});
162+
163+
await server.listen(server.port);
164+
await got(server.url);
165+
await server.close();
166+
});

‎test/timeout.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ const slowDataStream = () => {
2424
return slowStream;
2525
};
2626

27-
const requestDelay = 250;
28-
const requestTimeout = requestDelay - 10;
27+
const requestDelay = 500;
28+
const requestTimeout = requestDelay - 20;
2929

3030
const errorMatcher = {
3131
instanceOf: got.TimeoutError,

‎test/unix-socket.js

+4
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,8 @@ if (process.platform !== 'win32') {
4141
const url = format('unix:%s:%s', socketPath, '/foo:bar');
4242
t.is((await got(url)).body, 'ok');
4343
});
44+
45+
test('throws on invalid URL', async t => {
46+
await t.throws(got('unix:'));
47+
});
4448
}

0 commit comments

Comments
 (0)
Please sign in to comment.