From c2c75124315f71c8a87ac83cbab84ba02115169d Mon Sep 17 00:00:00 2001 From: Brandon Millman Date: Thu, 11 Jan 2018 15:58:33 -0800 Subject: Improve HttpClient errors --- packages/connect/CHANGELOG.md | 5 +++++ packages/connect/src/http_client.ts | 11 +++++++---- packages/connect/test/http_client_test.ts | 11 ++++++++++- yarn.lock | 11 +++++------ 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/packages/connect/CHANGELOG.md b/packages/connect/CHANGELOG.md index 2d9e2d89f..19d38df5f 100644 --- a/packages/connect/CHANGELOG.md +++ b/packages/connect/CHANGELOG.md @@ -1,5 +1,10 @@ # CHANGELOG +## v0.x.x - _TBD, 2017_ + + * Sanitize api endpoint url and remove trailing slashes (#315) + * Improve error message text in HttpClient (#315) + ## v0.4.0 - _January 11, 2017_ * Prevent getFeesAsync method on HttpClient from mutating input (#296) diff --git a/packages/connect/src/http_client.ts b/packages/connect/src/http_client.ts index 5604a9607..c30b499a2 100644 --- a/packages/connect/src/http_client.ts +++ b/packages/connect/src/http_client.ts @@ -20,6 +20,7 @@ import { } from './types'; import { relayerResponseJsonParsers } from './utils/relayer_response_json_parsers'; +const TRAILING_SLASHES_REGEX = /\/+$/; /** * This class includes all the functionality related to interacting with a set of HTTP endpoints * that implement the standard relayer API v0 @@ -33,7 +34,7 @@ export class HttpClient implements Client { */ constructor(url: string) { assert.isHttpUrl('url', url); - this._apiEndpointUrl = url; + this._apiEndpointUrl = url.replace(TRAILING_SLASHES_REGEX, ''); // remove trailing slashes } /** * Retrieve token pair info from the API @@ -134,16 +135,18 @@ export class HttpClient implements Client { const headers = new Headers({ 'content-type': 'application/json', }); - const response = await fetch(url, { method: requestType, body: JSON.stringify(payload), headers, }); + const json = await response.json(); if (!response.ok) { - throw Error(response.statusText); + const errorString = `${response.status} - ${response.statusText}\n${requestType} ${url}\n${JSON.stringify( + json, + )}`; + throw Error(errorString); } - const json = await response.json(); return json; } } diff --git a/packages/connect/test/http_client_test.ts b/packages/connect/test/http_client_test.ts index e7096edad..38d00d849 100644 --- a/packages/connect/test/http_client_test.ts +++ b/packages/connect/test/http_client_test.ts @@ -29,6 +29,15 @@ describe('HttpClient', () => { afterEach(() => { fetchMock.restore(); }); + describe('#constructor', () => { + it('should remove trailing slashes from api url', async () => { + const urlWithTrailingSlash = 'https://slash.com/'; + const urlWithoutTrailingSlash = 'https://slash.com'; + const client = new HttpClient(urlWithTrailingSlash); + const sanitizedUrl = (client as any)._apiEndpointUrl; + expect(sanitizedUrl).to.be.deep.equal(urlWithoutTrailingSlash); + }); + }); describe('#getTokenPairsAsync', () => { const url = `${relayUrl}/v0/token_pairs`; it('gets token pairs', async () => { @@ -36,7 +45,7 @@ describe('HttpClient', () => { const tokenPairs = await relayerClient.getTokenPairsAsync(); expect(tokenPairs).to.be.deep.equal(tokenPairsResponse); }); - it('gets specfic token pairs for request', async () => { + it('gets specific token pairs for request', async () => { const tokenAddress = '0x323b5d4c32345ced77393b3530b1eed0f346429d'; const tokenPairsRequest = { tokenA: tokenAddress, diff --git a/yarn.lock b/yarn.lock index 72657000f..9c433625d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -595,7 +595,7 @@ async-eventemitter@^0.2.2: dependencies: async "^2.4.0" -"async-eventemitter@github:ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c": +async-eventemitter@ahultgren/async-eventemitter#fa06e39e56786ba541c180061dbf2c0a5bbf951c: version "0.2.3" resolved "https://codeload.github.com/ahultgren/async-eventemitter/tar.gz/fa06e39e56786ba541c180061dbf2c0a5bbf951c" dependencies: @@ -1287,13 +1287,13 @@ bignumber.js@^4.0.2, bignumber.js@~4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-4.1.0.tgz#db6f14067c140bd46624815a7916c92d9b6c24b1" -"bignumber.js@git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2": +"bignumber.js@git+https://github.com/debris/bignumber.js#master": version "2.0.7" - resolved "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" + resolved "git+https://github.com/debris/bignumber.js#c7a38de919ed75e6fb6ba38051986e294b328df9" -"bignumber.js@git+https://github.com/debris/bignumber.js.git#master": +"bignumber.js@git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2": version "2.0.7" - resolved "git+https://github.com/debris/bignumber.js.git#c7a38de919ed75e6fb6ba38051986e294b328df9" + resolved "git+https://github.com/debris/bignumber.js.git#94d7146671b9719e00a09c29b01a691bc85048c2" "bignumber.js@git+https://github.com/frozeman/bignumber.js-nolookahead.git": version "2.0.7" @@ -9241,7 +9241,6 @@ types-ethereumjs-util@0xProject/types-ethereumjs-util: types-ethereumjs-util@0xproject/types-ethereumjs-util: version "0.0.6" - uid "0c5058e4f9d6585f7c7c1f88939546acb14323b8" resolved "https://codeload.github.com/0xproject/types-ethereumjs-util/tar.gz/0c5058e4f9d6585f7c7c1f88939546acb14323b8" dependencies: bn.js "^4.11.7" -- cgit From fbcbf066cdc13b99d1d280e131c01bd5456d90ae Mon Sep 17 00:00:00 2001 From: Brandon Millman Date: Fri, 12 Jan 2018 11:53:14 -0800 Subject: Stop appending /v0 to HttpClient api endpoint urls --- packages/connect/CHANGELOG.md | 5 +++-- packages/connect/src/http_client.ts | 2 +- packages/connect/test/http_client_test.ts | 10 +++++----- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/connect/CHANGELOG.md b/packages/connect/CHANGELOG.md index 19d38df5f..d8e99b5d3 100644 --- a/packages/connect/CHANGELOG.md +++ b/packages/connect/CHANGELOG.md @@ -2,8 +2,9 @@ ## v0.x.x - _TBD, 2017_ - * Sanitize api endpoint url and remove trailing slashes (#315) - * Improve error message text in HttpClient (#315) + * Sanitize api endpoint url and remove trailing slashes (#318) + * Improve error message text in HttpClient (#318) + * Stop appending '/v0' to api endpoint url in HttpClient (#318) ## v0.4.0 - _January 11, 2017_ diff --git a/packages/connect/src/http_client.ts b/packages/connect/src/http_client.ts index c30b499a2..3df77b0f0 100644 --- a/packages/connect/src/http_client.ts +++ b/packages/connect/src/http_client.ts @@ -131,7 +131,7 @@ export class HttpClient implements Client { const stringifiedParams = queryString.stringify(params); query = `?${stringifiedParams}`; } - const url = `${this._apiEndpointUrl}/v0${path}${query}`; + const url = `${this._apiEndpointUrl}${path}${query}`; const headers = new Headers({ 'content-type': 'application/json', }); diff --git a/packages/connect/test/http_client_test.ts b/packages/connect/test/http_client_test.ts index 38d00d849..15759d911 100644 --- a/packages/connect/test/http_client_test.ts +++ b/packages/connect/test/http_client_test.ts @@ -39,7 +39,7 @@ describe('HttpClient', () => { }); }); describe('#getTokenPairsAsync', () => { - const url = `${relayUrl}/v0/token_pairs`; + const url = `${relayUrl}/token_pairs`; it('gets token pairs', async () => { fetchMock.get(url, tokenPairsResponseJSON); const tokenPairs = await relayerClient.getTokenPairsAsync(); @@ -61,7 +61,7 @@ describe('HttpClient', () => { }); }); describe('#getOrdersAsync', () => { - const url = `${relayUrl}/v0/orders`; + const url = `${relayUrl}/orders`; it('gets orders', async () => { fetchMock.get(url, ordersResponseJSON); const orders = await relayerClient.getOrdersAsync(); @@ -84,7 +84,7 @@ describe('HttpClient', () => { }); describe('#getOrderAsync', () => { const orderHash = '0xabc67323774bdbd24d94f977fa9ac94a50f016026fd13f42990861238897721f'; - const url = `${relayUrl}/v0/order/${orderHash}`; + const url = `${relayUrl}/order/${orderHash}`; it('gets order', async () => { fetchMock.get(url, orderResponseJSON); const order = await relayerClient.getOrderAsync(orderHash); @@ -100,7 +100,7 @@ describe('HttpClient', () => { baseTokenAddress: '0x323b5d4c32345ced77393b3530b1eed0f346429d', quoteTokenAddress: '0xa2b31dacf30a9c50ca473337c01d8a201ae33e32', }; - const url = `${relayUrl}/v0/orderbook?baseTokenAddress=${request.baseTokenAddress}"eTokenAddress=${ + const url = `${relayUrl}/orderbook?baseTokenAddress=${request.baseTokenAddress}"eTokenAddress=${ request.quoteTokenAddress }`; it('gets order book', async () => { @@ -125,7 +125,7 @@ describe('HttpClient', () => { salt: new BigNumber('256'), expirationUnixTimestampSec: new BigNumber('42'), }; - const url = `${relayUrl}/v0/fees`; + const url = `${relayUrl}/fees`; it('gets fees', async () => { fetchMock.post(url, feesResponseJSON); const fees = await relayerClient.getFeesAsync(request); -- cgit