From 5e3830337764b07bb50a33122dc2cef793528e64 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 3 Apr 2018 15:53:16 -0700 Subject: [PATCH] Use xhr.onreadystatechange instead of xhr.onload (#1838) --- clients/ts/signalr/src/HttpClient.ts | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/clients/ts/signalr/src/HttpClient.ts b/clients/ts/signalr/src/HttpClient.ts index 2be9686264..16808e99ee 100644 --- a/clients/ts/signalr/src/HttpClient.ts +++ b/clients/ts/signalr/src/HttpClient.ts @@ -84,15 +84,22 @@ export class DefaultHttpClient extends HttpClient { xhr.timeout = request.timeout; } - xhr.onload = () => { - if (request.abortSignal) { - request.abortSignal.onabort = null; - } + xhr.onreadystatechange = () => { + if (xhr.readyState === 4) { + if (request.abortSignal) { + request.abortSignal.onabort = null; + } - if (xhr.status >= 200 && xhr.status < 300) { - resolve(new HttpResponse(xhr.status, xhr.statusText, xhr.response || xhr.responseText)); - } else { - reject(new HttpError(xhr.statusText, xhr.status)); + // Some browsers report xhr.status == 0 when the + // response has been cut off or there's been a TCP FIN. + // Treat it like a 200 with no response. + if (xhr.status === 0) { + resolve(new HttpResponse(200, null, null)); + } else if (xhr.status >= 200 && xhr.status < 300) { + resolve(new HttpResponse(xhr.status, xhr.statusText, xhr.response || xhr.responseText)); + } else { + reject(new HttpError(xhr.statusText, xhr.status)); + } } };