Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Add response.ok #2043

Merged
merged 4 commits into from
May 22, 2022
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions source/core/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ export default class Request extends Duplex implements RequestEvents<Request> {
requestUrl?: URL;
redirectUrls: URL[];
retryCount: number;
ok?: boolean;

declare private _requestOptions: NativeRequestOptions;

Expand Down Expand Up @@ -632,6 +633,7 @@ export default class Request extends Duplex implements RequestEvents<Request> {
typedResponse.isFromCache = (this._nativeResponse as any).fromCache ?? false;
typedResponse.ip = this.ip;
typedResponse.retryCount = this.retryCount;
typedResponse.ok = (statusCode >= 200 && statusCode <= 299);
szmarczak marked this conversation as resolved.
Show resolved Hide resolved

this._isFromCache = typedResponse.isFromCache;

Expand Down
5 changes: 5 additions & 0 deletions source/core/response.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,11 @@ export interface PlainResponse extends IncomingMessageWithTimings {
The result of the request.
*/
body?: unknown;

/**
Whether the response status code is 2xx.
szmarczak marked this conversation as resolved.
Show resolved Hide resolved
*/
ok?: boolean;
szmarczak marked this conversation as resolved.
Show resolved Hide resolved
}

// For Promise support
Expand Down
40 changes: 40 additions & 0 deletions test/http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -375,3 +375,43 @@ test('ClientRequest can throw before promise resolves', async t => {
message: /EINVAL|EHOSTUNREACH|ETIMEDOUT/,
});
});

test('status code 200 has response ok is true', withServer, async (t, server, got) => {
server.get('/', (_request, response) => {
response.statusCode = 200;
response.end();
});

const promise = got('');
await t.notThrowsAsync(promise);
const {statusCode, body, ok} = await promise;
t.is(ok, true);
szmarczak marked this conversation as resolved.
Show resolved Hide resolved
t.is(statusCode, 200);
t.is(body, '');
});

test('status code 404 has response ok is false if error is not thrown', withServer, async (t, server, got) => {
server.get('/', (_request, response) => {
response.statusCode = 404;
response.end();
});

const promise = got('', {throwHttpErrors: false});
await t.notThrowsAsync(promise);
const {statusCode, body, ok} = await promise;
t.is(ok, false);
t.is(statusCode, 404);
t.is(body, '');
});

test('status code 404 has error response ok is false if error is thrown', withServer, async (t, server, got) => {
server.get('/', (_request, response) => {
response.statusCode = 404;
response.end('not');
});

const error = await t.throwsAsync<HTTPError>(got(''), {instanceOf: HTTPError});
t.is(error.response.statusCode, 404);
t.is(error.response.ok, false);
t.is(error.response.body, 'not');
});