XhrHttpClient.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. "use strict";
  2. // Licensed to the .NET Foundation under one or more agreements.
  3. // The .NET Foundation licenses this file to you under the MIT license.
  4. Object.defineProperty(exports, "__esModule", { value: true });
  5. exports.XhrHttpClient = void 0;
  6. const Errors_1 = require("./Errors");
  7. const HttpClient_1 = require("./HttpClient");
  8. const ILogger_1 = require("./ILogger");
  9. const Utils_1 = require("./Utils");
  10. class XhrHttpClient extends HttpClient_1.HttpClient {
  11. constructor(logger) {
  12. super();
  13. this._logger = logger;
  14. }
  15. /** @inheritDoc */
  16. send(request) {
  17. // Check that abort was not signaled before calling send
  18. if (request.abortSignal && request.abortSignal.aborted) {
  19. return Promise.reject(new Errors_1.AbortError());
  20. }
  21. if (!request.method) {
  22. return Promise.reject(new Error("No method defined."));
  23. }
  24. if (!request.url) {
  25. return Promise.reject(new Error("No url defined."));
  26. }
  27. return new Promise((resolve, reject) => {
  28. const xhr = new XMLHttpRequest();
  29. xhr.open(request.method, request.url, true);
  30. xhr.withCredentials = request.withCredentials === undefined ? true : request.withCredentials;
  31. xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
  32. if (request.content === "") {
  33. request.content = undefined;
  34. }
  35. if (request.content) {
  36. // Explicitly setting the Content-Type header for React Native on Android platform.
  37. if (Utils_1.isArrayBuffer(request.content)) {
  38. xhr.setRequestHeader("Content-Type", "application/octet-stream");
  39. }
  40. else {
  41. xhr.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
  42. }
  43. }
  44. const headers = request.headers;
  45. if (headers) {
  46. Object.keys(headers)
  47. .forEach((header) => {
  48. xhr.setRequestHeader(header, headers[header]);
  49. });
  50. }
  51. if (request.responseType) {
  52. xhr.responseType = request.responseType;
  53. }
  54. if (request.abortSignal) {
  55. request.abortSignal.onabort = () => {
  56. xhr.abort();
  57. reject(new Errors_1.AbortError());
  58. };
  59. }
  60. if (request.timeout) {
  61. xhr.timeout = request.timeout;
  62. }
  63. xhr.onload = () => {
  64. if (request.abortSignal) {
  65. request.abortSignal.onabort = null;
  66. }
  67. if (xhr.status >= 200 && xhr.status < 300) {
  68. resolve(new HttpClient_1.HttpResponse(xhr.status, xhr.statusText, xhr.response || xhr.responseText));
  69. }
  70. else {
  71. reject(new Errors_1.HttpError(xhr.response || xhr.responseText || xhr.statusText, xhr.status));
  72. }
  73. };
  74. xhr.onerror = () => {
  75. this._logger.log(ILogger_1.LogLevel.Warning, `Error from HTTP request. ${xhr.status}: ${xhr.statusText}.`);
  76. reject(new Errors_1.HttpError(xhr.statusText, xhr.status));
  77. };
  78. xhr.ontimeout = () => {
  79. this._logger.log(ILogger_1.LogLevel.Warning, `Timeout from HTTP request.`);
  80. reject(new Errors_1.TimeoutError());
  81. };
  82. xhr.send(request.content);
  83. });
  84. }
  85. }
  86. exports.XhrHttpClient = XhrHttpClient;
  87. //# sourceMappingURL=XhrHttpClient.js.map