protected override void ThreadFunc() { // XmlHttpRequest setup this.NativeId = XHR_Create(HTTPRequest.MethodNames[(byte)CurrentRequest.MethodType], CurrentRequest.CurrentUri.OriginalString, CurrentRequest.Credentials != null ? CurrentRequest.Credentials.UserName : null, CurrentRequest.Credentials != null ? CurrentRequest.Credentials.Password : null, CurrentRequest.WithCredentials ? 1 : 0); Connections.Add(NativeId, this); CurrentRequest.EnumerateHeaders((header, values) => { if (!header.Equals("Content-Length")) { for (int i = 0; i < values.Count; ++i) { XHR_SetRequestHeader(NativeId, header, values[i]); } } }, /*callBeforeSendCallback:*/ true); XHR_SetResponseHandler(NativeId, WebGLConnection.OnResponse, WebGLConnection.OnError, WebGLConnection.OnTimeout, WebGLConnection.OnAborted); // Setting OnUploadProgress result in an addEventListener("progress", ...) call making the request non-simple. // https://forum.unity.com/threads/best-http-released.200006/page-49#post-3696220 XHR_SetProgressHandler(NativeId, CurrentRequest.OnDownloadProgress == null ? (OnWebGLProgressDelegate)null : WebGLConnection.OnDownloadProgress, CurrentRequest.OnUploadProgress == null ? (OnWebGLProgressDelegate)null : WebGLConnection.OnUploadProgress); XHR_SetTimeout(NativeId, (uint)(CurrentRequest.ConnectTimeout.TotalMilliseconds + CurrentRequest.Timeout.TotalMilliseconds)); byte[] body = CurrentRequest.GetEntityBody(); int length = 0; bool releaseBodyBuffer = false; if (body == null) { var upStreamInfo = CurrentRequest.GetUpStream(); if (upStreamInfo.Stream != null) { var internalBuffer = BufferPool.Get(upStreamInfo.Length > 0 ? upStreamInfo.Length : HTTPRequest.UploadChunkSize, true); using (BufferPoolMemoryStream ms = new BufferPoolMemoryStream(internalBuffer, 0, internalBuffer.Length, true, true, false, true)) { var buffer = BufferPool.Get(HTTPRequest.UploadChunkSize, true); int readCount = -1; while ((readCount = upStreamInfo.Stream.Read(buffer, 0, buffer.Length)) > 0) { ms.Write(buffer, 0, readCount); } BufferPool.Release(buffer); length = (int)ms.Position; body = ms.GetBuffer(); releaseBodyBuffer = true; } } } else { length = body.Length; XHR_Send(NativeId, body, length); } XHR_Send(NativeId, body, length); if (releaseBodyBuffer) { BufferPool.Release(body); } }