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)); + } } };