BestHTTP_WebRequest.jslib 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. var Lib_BEST_HTTP_WebGL_HTTP_Bridge =
  2. {
  3. /*LogLevels: {
  4. All: 0,
  5. Information: 1,
  6. Warning: 2,
  7. Error: 3,
  8. Exception: 4,
  9. None: 5
  10. }*/
  11. $_best_http_request_bridge_global: {
  12. requestInstances: {},
  13. nextRequestId: 1,
  14. loglevel: 2
  15. },
  16. XHR_Create: function(method, url, user, passwd, withCredentials)
  17. {
  18. var _url = new URL(UTF8ToString(url)); ///*encodeURI*/(UTF8ToString(url)).replace(/\+/g, '%2B').replace(/%252[fF]/ig, '%2F');
  19. var _method = UTF8ToString(method);
  20. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  21. console.log(_best_http_request_bridge_global.nextRequestId + ' XHR_Create - withCredentials: ' + withCredentials + ' method: ' + _method + ' url: ' + _url.toString());
  22. var http = new XMLHttpRequest();
  23. if (user && passwd)
  24. {
  25. var u = UTF8ToString(user);
  26. var p = UTF8ToString(passwd);
  27. http.withCredentials = true;
  28. http.open(_method, _url.toString(), /*async:*/ true , u, p);
  29. }
  30. else {
  31. http.withCredentials = withCredentials;
  32. http.open(_method, _url.toString(), /*async:*/ true);
  33. }
  34. http.responseType = 'arraybuffer';
  35. _best_http_request_bridge_global.requestInstances[_best_http_request_bridge_global.nextRequestId] = http;
  36. return _best_http_request_bridge_global.nextRequestId++;
  37. },
  38. XHR_SetTimeout: function (request, timeout)
  39. {
  40. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  41. console.log(request + ' XHR_SetTimeout ' + timeout);
  42. _best_http_request_bridge_global.requestInstances[request].timeout = timeout;
  43. },
  44. XHR_SetRequestHeader: function (request, header, value)
  45. {
  46. var _header = UTF8ToString(header);
  47. var _value = UTF8ToString(value);
  48. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  49. console.log(request + ' XHR_SetRequestHeader ' + _header + ' ' + _value);
  50. if (_header != 'Cookie')
  51. _best_http_request_bridge_global.requestInstances[request].setRequestHeader(_header, _value);
  52. else {
  53. var cookies = _value.split(';');
  54. for (var i = 0; i < cookies.length; i++) {
  55. document.cookie = cookies[i];
  56. }
  57. }
  58. },
  59. XHR_CopyResponseTo: function (request, array, size) {
  60. var http = _best_http_request_bridge_global.requestInstances[request];
  61. var response = 0;
  62. if (!!http.response)
  63. response = http.response;
  64. var responseBytes = new Uint8Array(response);
  65. var buffer = HEAPU8.subarray(array, array + size);
  66. buffer.set(responseBytes)
  67. },
  68. XHR_SetResponseHandler: function (request, onresponse, onerror, ontimeout, onaborted)
  69. {
  70. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  71. console.log(request + ' XHR_SetResponseHandler');
  72. var http = _best_http_request_bridge_global.requestInstances[request];
  73. // LOAD
  74. http.onload = function http_onload(e) {
  75. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  76. console.log(request + ' - onload ' + http.status + ' ' + http.statusText);
  77. if (onresponse)
  78. {
  79. var responseLength = 0;
  80. if (!!http.response)
  81. responseLength = http.response.byteLength;
  82. Module['dynCall_viiiii'](onresponse, request, http.status, 0, responseLength, 0);
  83. }
  84. };
  85. if (onerror)
  86. {
  87. http.onerror = function http_onerror(e) {
  88. function HandleError(err)
  89. {
  90. var length = lengthBytesUTF8(err) + 1;
  91. var buffer = _malloc(length);
  92. stringToUTF8Array(err, HEAPU8, buffer, length);
  93. Module['dynCall_vii'](onerror, request, buffer);
  94. _free(buffer);
  95. }
  96. if (e.error)
  97. HandleError(e.error);
  98. else
  99. HandleError("Unknown Error! Maybe a CORS porblem?");
  100. };
  101. }
  102. if (ontimeout)
  103. http.ontimeout = function http_onerror(e) {
  104. Module['dynCall_vi'](ontimeout, request);
  105. };
  106. if (onaborted)
  107. http.onabort = function http_onerror(e) {
  108. Module['dynCall_vi'](onaborted, request);
  109. };
  110. },
  111. XHR_SetProgressHandler: function (request, onprogress, onuploadprogress)
  112. {
  113. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  114. console.log(request + ' XHR_SetProgressHandler');
  115. var http = _best_http_request_bridge_global.requestInstances[request];
  116. if (http)
  117. {
  118. if (onprogress)
  119. http.onprogress = function http_onprogress(e) {
  120. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  121. console.log(request + ' XHR_SetProgressHandler - onProgress ' + e.loaded + ' ' + e.total);
  122. if (e.lengthComputable)
  123. Module['dynCall_viii'](onprogress, request, e.loaded, e.total);
  124. };
  125. if (onuploadprogress)
  126. http.upload.addEventListener("progress", function http_onprogress(e) {
  127. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  128. console.log(request + ' XHR_SetProgressHandler - onUploadProgress ' + e.loaded + ' ' + e.total);
  129. if (e.lengthComputable)
  130. Module['dynCall_viii'](onuploadprogress, request, e.loaded, e.total);
  131. }, true);
  132. }
  133. },
  134. XHR_Send: function (request, ptr, length)
  135. {
  136. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  137. console.log(request + ' XHR_Send ' + ptr + ' ' + length);
  138. var http = _best_http_request_bridge_global.requestInstances[request];
  139. try {
  140. if (length > 0)
  141. http.send(HEAPU8.subarray(ptr, ptr+length));
  142. else
  143. http.send();
  144. }
  145. catch(e) {
  146. if (_best_http_request_bridge_global.loglevel <= 4) /*exception*/
  147. console.error(request + ' ' + e.name + ": " + e.message);
  148. }
  149. },
  150. XHR_GetResponseHeaders: function(request, callback)
  151. {
  152. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  153. console.log(request + ' XHR_GetResponseHeaders');
  154. var headers = ''
  155. var cookies = document.cookie.split(';');
  156. for(var i = 0; i < cookies.length; ++i) {
  157. const cookie = cookies[i].trim();
  158. if (cookie.length > 0)
  159. headers += "Set-Cookie:" + cookie + "\r\n";
  160. }
  161. var additionalHeaders = _best_http_request_bridge_global.requestInstances[request].getAllResponseHeaders().trim();
  162. if (additionalHeaders.length > 0) {
  163. headers += additionalHeaders;
  164. headers += "\r\n";
  165. }
  166. headers += "\r\n";
  167. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  168. console.log(' "' + headers + '"');
  169. var byteArray = new Uint8Array(headers.length);
  170. for(var i=0,j=headers.length;i<j;++i){
  171. byteArray[i]=headers.charCodeAt(i);
  172. }
  173. var buffer = _malloc(byteArray.length);
  174. HEAPU8.set(byteArray, buffer);
  175. Module['dynCall_viii'](callback, request, buffer, byteArray.length);
  176. _free(buffer);
  177. },
  178. XHR_GetStatusLine: function(request, callback)
  179. {
  180. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  181. console.log(request + ' XHR_GetStatusLine');
  182. var status = "HTTP/1.1 " + _best_http_request_bridge_global.requestInstances[request].status + " " + _best_http_request_bridge_global.requestInstances[request].statusText + "\r\n";
  183. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  184. console.log(status);
  185. var byteArray = new Uint8Array(status.length);
  186. for(var i=0,j=status.length;i<j;++i){
  187. byteArray[i]=status.charCodeAt(i);
  188. }
  189. var buffer = _malloc(byteArray.length);
  190. HEAPU8.set(byteArray, buffer);
  191. Module['dynCall_viii'](callback, request, buffer, byteArray.length);
  192. _free(buffer);
  193. },
  194. XHR_Abort: function (request)
  195. {
  196. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  197. console.log(request + ' XHR_Abort');
  198. _best_http_request_bridge_global.requestInstances[request].abort();
  199. },
  200. XHR_Release: function (request)
  201. {
  202. if (_best_http_request_bridge_global.loglevel <= 1) /*information*/
  203. console.log(request + ' XHR_Release');
  204. delete _best_http_request_bridge_global.requestInstances[request];
  205. },
  206. XHR_SetLoglevel: function (level)
  207. {
  208. _best_http_request_bridge_global.loglevel = level;
  209. }
  210. };
  211. autoAddDeps(Lib_BEST_HTTP_WebGL_HTTP_Bridge, '$_best_http_request_bridge_global');
  212. mergeInto(LibraryManager.library, Lib_BEST_HTTP_WebGL_HTTP_Bridge);