Skip to content

Commit 439fb82

Browse files
committed
Fix relative URLs when paginating
1 parent 6a44a81 commit 439fb82

File tree

5 files changed

+25
-8
lines changed

5 files changed

+25
-8
lines changed

documentation/4-pagination.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,9 @@ console.log(results);
8787
const next = parsed.find(entry => entry.parameters.rel === 'next' || entry.parameters.rel === '"next"');
8888

8989
if (next) {
90-
return {url: next.reference};
90+
return {
91+
url: new URL(next.reference, response.requestUrl)
92+
};
9193
}
9294

9395
return false;

source/core/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1103,15 +1103,15 @@ export default class Request extends Duplex implements RequestEvents<Request> {
11031103
try {
11041104
// We can't do `await fn(...)`,
11051105
// because stream `error` event can be emitted before `Promise.resolve()`.
1106-
let requestOrResponse = fn(url, this._requestOptions);
1106+
let requestOrResponse = fn!(url, this._requestOptions);
11071107

11081108
if (is.promise(requestOrResponse)) {
11091109
requestOrResponse = await requestOrResponse;
11101110
}
11111111

11121112
// Fallback
11131113
if (is.undefined(requestOrResponse)) {
1114-
requestOrResponse = options.getFallbackRequestFunction()(url, this._requestOptions);
1114+
requestOrResponse = options.getFallbackRequestFunction()!(url, this._requestOptions);
11151115

11161116
if (is.promise(requestOrResponse)) {
11171117
requestOrResponse = await requestOrResponse;

source/core/options.ts

+9-3
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,9 @@ const defaultInternals: Options['_internals'] = {
691691
const next = parsed.find(entry => entry.parameters.rel === 'next' || entry.parameters.rel === '"next"');
692692

693693
if (next) {
694-
return {url: next.reference};
694+
return {
695+
url: new URL(next.reference, response.requestUrl),
696+
};
695697
}
696698

697699
return false;
@@ -2224,13 +2226,17 @@ export default class Options {
22242226
return this.getFallbackRequestFunction();
22252227
}
22262228

2227-
return request!;
2229+
return request;
22282230
}
22292231

22302232
getFallbackRequestFunction() {
22312233
const url = this._internals.url as (URL | undefined);
22322234

2233-
if (url!.protocol === 'https:') {
2235+
if (!url) {
2236+
return;
2237+
}
2238+
2239+
if (url.protocol === 'https:') {
22342240
if (this._internals.http2) {
22352241
if (major < 15 || (major === 15 && minor < 10)) {
22362242
const error = new Error('To use the `http2` option, install Node.js 15.10.0 or above');

source/core/response.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type {URL} from 'url';
12
import type {IncomingMessageWithTimings, Timings} from '@szmarczak/http-timer';
23
import {RequestError} from './errors.js';
34
import type {ParseJsonFunction, ResponseType} from './options.js';

test/pagination.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,14 @@ const resetPagination = {
1717
shouldContinue: undefined,
1818
};
1919

20-
const attachHandler = (server: ExtendedHttpTestServer, count: number): void => {
20+
const attachHandler = (server: ExtendedHttpTestServer, count: number, {relative} = {relative: false}): void => {
2121
server.get('/', (request, response) => {
2222
// eslint-disable-next-line unicorn/prevent-abbreviations
2323
const searchParams = new URLSearchParams(request.url.split('?')[1]);
2424
const page = Number(searchParams.get('page')) || 1;
2525

2626
if (page < count) {
27-
response.setHeader('link', `<${server.url}/?page=${page + 1}>; rel="next"`);
27+
response.setHeader('link', `<${relative ? '' : server.url}/?page=${page + 1}>; rel="next"`);
2828
}
2929

3030
response.end(`[${page <= count ? page : ''}]`);
@@ -720,6 +720,14 @@ test('calls init hooks on pagination', withServer, async (t, server) => {
720720
]);
721721
});
722722

723+
test('retrieves all elements - relative url', withServer, async (t, server, got) => {
724+
attachHandler(server, 2, {relative: true});
725+
726+
const result = await got.paginate.all<number>('');
727+
728+
t.deepEqual(result, [1, 2]);
729+
});
730+
723731
test('throws when transform does not return an array', withServer, async (t, server) => {
724732
server.get('/', (_request, response) => {
725733
response.end(JSON.stringify(''));

0 commit comments

Comments
 (0)