diff --git a/haxe_libraries/tink_core.hxml b/haxe_libraries/tink_core.hxml index 4f2a5fc..8160c6b 100644 --- a/haxe_libraries/tink_core.hxml +++ b/haxe_libraries/tink_core.hxml @@ -1,3 +1,3 @@ --D tink_core=1.24.0 -# @install: lix --silent download "haxelib:/tink_core#1.24.0" into tink_core/1.24.0/haxelib --cp ${HAXE_LIBCACHE}/tink_core/1.24.0/haxelib/src +# @install: lix --silent download "gh://github.com/haxetink/tink_core#a14155a83f41279a9804d2733114f1404608d24f" into tink_core/1.27.1/github/a14155a83f41279a9804d2733114f1404608d24f +-cp ${HAXE_LIBCACHE}/tink_core/1.27.1/github/a14155a83f41279a9804d2733114f1404608d24f/src +-D tink_core=1.27.1 \ No newline at end of file diff --git a/src/tink/http/Client.hx b/src/tink/http/Client.hx index a902579..fcca10d 100644 --- a/src/tink/http/Client.hx +++ b/src/tink/http/Client.hx @@ -1,6 +1,7 @@ package tink.http; import haxe.extern.Rest; +import tink.core.Progress; import tink.http.Request; import tink.http.Response; import tink.http.Fetch; @@ -29,7 +30,11 @@ interface ClientObject { * @param req - The HTTP request * @return The HTTP response */ - function request(req:OutgoingRequest):Promise; + function request(req:OutgoingRequest, ?handlers:ClientRequestHandlers):Promise; +} + +typedef ClientRequestHandlers = { + ?upload:ProgressValue->Void, } typedef Processors = { @@ -60,11 +65,11 @@ private class CustomClient implements ClientObject { else value; - public function request(req) + public function request(req, ?handlers) return pipe(req, preprocessors) .next(function (req) - return real.request(req) + return real.request(req, handlers) .next(pipe.bind(_, postprocessors == null ? null : [for (p in postprocessors) p(req)])) ); diff --git a/src/tink/http/Fetch.hx b/src/tink/http/Fetch.hx index c7dc7af..d93e103 100644 --- a/src/tink/http/Fetch.hx +++ b/src/tink/http/Fetch.hx @@ -50,7 +50,7 @@ class Fetch { client.request(new OutgoingRequest( new OutgoingRequestHeader(method, url, headers), body - )).handle(function(res) { + ), options.handlers).handle(function(res) { switch res { case Success(res): switch res.header.statusCode { @@ -101,6 +101,7 @@ typedef FetchOptions = { ?client:ClientType, ?followRedirect:Bool, ?augment:Processors, + ?handlers:ClientRequestHandlers, } enum ClientType { diff --git a/src/tink/http/clients/CurlClient.hx b/src/tink/http/clients/CurlClient.hx index 0cebe55..d4d3ab0 100644 --- a/src/tink/http/clients/CurlClient.hx +++ b/src/tink/http/clients/CurlClient.hx @@ -16,7 +16,7 @@ class CurlClient implements ClientObject { if(curl != null) this.curl = curl; } - public function request(req:OutgoingRequest):Promise { + public function request(req:OutgoingRequest, ?handlers:ClientRequestHandlers):Promise { return switch Helpers.checkScheme(req.header.url.scheme) { case Some(e): Promise.reject(e); diff --git a/src/tink/http/clients/FlashClient.hx b/src/tink/http/clients/FlashClient.hx index 37468cf..5bb2b36 100644 --- a/src/tink/http/clients/FlashClient.hx +++ b/src/tink/http/clients/FlashClient.hx @@ -25,7 +25,7 @@ class FlashClient implements ClientObject { public function new() {} - public function request(req:OutgoingRequest):Promise { + public function request(req:OutgoingRequest, ?handlers:ClientRequestHandlers):Promise { return Future.async(function(cb) { switch Helpers.checkScheme(req.header.url.scheme) { case Some(e): diff --git a/src/tink/http/clients/FlashSocketClient.hx b/src/tink/http/clients/FlashSocketClient.hx index bc13b2e..bc62803 100644 --- a/src/tink/http/clients/FlashSocketClient.hx +++ b/src/tink/http/clients/FlashSocketClient.hx @@ -34,7 +34,7 @@ class FlashSocketClient implements ClientObject { function getSocket(secure:Bool):Socket return secure ? new SecureSocket() : new Socket(); - public function request(req:OutgoingRequest):Promise { + public function request(req:OutgoingRequest, ?handlers:ClientRequestHandlers):Promise { return Future.async(function(cb) { switch req.header.byName('connection') { diff --git a/src/tink/http/clients/JsClient.hx b/src/tink/http/clients/JsClient.hx index cbfe704..366834c 100644 --- a/src/tink/http/clients/JsClient.hx +++ b/src/tink/http/clients/JsClient.hx @@ -1,6 +1,7 @@ package tink.http.clients; import haxe.io.Bytes; +import tink.core.Progress; import tink.http.Client; import tink.http.Header; import tink.http.Request; @@ -22,7 +23,7 @@ class JsClient implements ClientObject { if(credentials) this.credentials = true; } - public function request(req:OutgoingRequest):Promise { + public function request(req:OutgoingRequest, ?handlers:ClientRequestHandlers):Promise { return Future.async(function(cb) { var http = getHttp(); // if(req.header.url.scheme == null) cb(Failure(Helper.missingSchemeError())); @@ -56,6 +57,11 @@ class JsClient implements ClientObject { ); } } + switch handlers { + case null | {upload: null}: // skip + case {upload: upload}: + http.upload.onprogress = function(e) upload(new ProgressValue(e.loaded, Some(e.total))); + } http.onerror = function(e) { cb(Failure(Error.withData(502, 'XMLHttpRequest Error', {request: req, error: e}))); } diff --git a/src/tink/http/clients/LocalContainerClient.hx b/src/tink/http/clients/LocalContainerClient.hx index 7be8342..a833959 100644 --- a/src/tink/http/clients/LocalContainerClient.hx +++ b/src/tink/http/clients/LocalContainerClient.hx @@ -15,7 +15,7 @@ class LocalContainerClient implements ClientObject { this.container = container; } - public function request(req:OutgoingRequest):Promise { + public function request(req:OutgoingRequest, ?handlers:ClientRequestHandlers):Promise { return container.serve(new IncomingRequest( '127.0.0.1', new IncomingRequestHeader(req.header.method, req.header.url.pathWithQuery, 'HTTP/1.1', @:privateAccess req.header.fields), diff --git a/src/tink/http/clients/NodeClient.hx b/src/tink/http/clients/NodeClient.hx index 91e7d07..e3c6509 100644 --- a/src/tink/http/clients/NodeClient.hx +++ b/src/tink/http/clients/NodeClient.hx @@ -21,7 +21,7 @@ class NodeClient implements ClientObject { public function new() { } - public function request(req:OutgoingRequest):Promise { + public function request(req:OutgoingRequest, ?handlers:ClientRequestHandlers):Promise { return switch Helpers.checkScheme(req.header.url.scheme) { case Some(e): Promise.reject(e); diff --git a/src/tink/http/clients/PhpClient.hx b/src/tink/http/clients/PhpClient.hx index 1760a13..cc3686c 100644 --- a/src/tink/http/clients/PhpClient.hx +++ b/src/tink/http/clients/PhpClient.hx @@ -12,7 +12,7 @@ using StringTools; class PhpClient implements ClientObject { public function new() {} - public function request(req:OutgoingRequest):Promise { + public function request(req:OutgoingRequest, ?handlers:ClientRequestHandlers):Promise { return Future.async(function(cb) { req.body.all().handle(function(chunk) { var options = php.Lib.associativeArrayOfObject({ diff --git a/src/tink/http/clients/SocketClient.hx b/src/tink/http/clients/SocketClient.hx index 1cfff83..7eae624 100644 --- a/src/tink/http/clients/SocketClient.hx +++ b/src/tink/http/clients/SocketClient.hx @@ -18,7 +18,7 @@ class SocketClient implements ClientObject { this.worker = worker.ensure(); } - public function request(req:OutgoingRequest):Promise { + public function request(req:OutgoingRequest, ?handlers:ClientRequestHandlers):Promise { return Future.async(function(cb) { switch Helpers.checkScheme(req.header.url.scheme) { case Some(e): diff --git a/src/tink/http/clients/StdClient.hx b/src/tink/http/clients/StdClient.hx index 157990d..a2beb28 100644 --- a/src/tink/http/clients/StdClient.hx +++ b/src/tink/http/clients/StdClient.hx @@ -15,7 +15,7 @@ class StdClient implements ClientObject { public function new(?worker:Worker) { this.worker = worker.ensure(); } - public function request(req:OutgoingRequest):Promise + public function request(req:OutgoingRequest, ?handlers:ClientRequestHandlers):Promise return Future.async(function (cb) { var r = new haxe.Http(req.header.url); diff --git a/src/tink/http/clients/TcpClient.hx b/src/tink/http/clients/TcpClient.hx index 50dcd92..14696ac 100644 --- a/src/tink/http/clients/TcpClient.hx +++ b/src/tink/http/clients/TcpClient.hx @@ -12,7 +12,7 @@ using tink.CoreApi; @:require('tink_tcp') class TcpClient implements ClientObject { public function new() {} - public function request(req:OutgoingRequest):Promise { + public function request(req:OutgoingRequest, ?handlers:ClientRequestHandlers):Promise { return Future.async(function(cb) { switch Helpers.checkScheme(req.header.url.scheme) { case Some(e): cb(Failure(e));