[ https://issues.apache.org/jira/browse/THRIFT-3876?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15380323#comment-15380323 ]
ASF GitHub Bot commented on THRIFT-3876: ---------------------------------------- Github user oprudkyi commented on a diff in the pull request: https://github.com/apache/thrift/pull/1045#discussion_r71055190 --- Diff: lib/haxe/src/org/apache/thrift/transport/THttpClient.hx --- @@ -94,10 +114,241 @@ class THttpClient extends TTransport { } }; + #if js + request_.onBinaryData = function(data : Bytes) { + responseBuffer_ = new BytesInput(data); + if( callback != null) { + callback(null); + } + }; + + request_.setBinaryPostData(buffer.getBytes()); + #else request_.setPostData(buffer.getBytes().toString()); + #end request_.request(true/*POST*/); } - } - \ No newline at end of file +#if js +/*supports sending/receiving binary/json data (browser, nodejs) + implemented atop https://github.com/HaxeFoundation/haxe/blob/development/std/haxe/Http.hx + */ +class JsHttp extends Http { + var binaryPostData : Bytes; + + public function setBinaryPostData( data : Bytes ):Http { + binaryPostData = data; + return this; + } + + public dynamic function onBinaryData( data : Bytes ) { + } + + #if !nodejs + public override function request( ?post : Bool ) : Void { + var me = this; + me.responseData = null; + var r = req = js.Browser.createXMLHttpRequest(); + var onreadystatechange = function(_) { + if( r.readyState != 4 ) + return; + var s = try r.status catch( e : Dynamic ) null; + if ( s != null && untyped __js__('"undefined" !== typeof window') ) { + // If the request is local and we have data: assume a success (jQuery approach): + var protocol = js.Browser.location.protocol.toLowerCase(); + var rlocalProtocol = ~/^(?:about|app|app-storage|.+-extension|file|res|widget):$/; + var isLocal = rlocalProtocol.match( protocol ); + if ( isLocal ) { + s = r.responseText != null ? 200 : 404; + } + } + if( s == untyped __js__("undefined") ) + s = null; + if( s != null ) + me.onStatus(s); + if( s != null && s >= 200 && s < 400 ) { + me.req = null; + var len = r.responseText.length; + var bytes = new BytesOutput(); + bytes.prepare(len); + for(i in 0 ... len) { + var byte = (r.responseText.charCodeAt(i) & 255); + if(byte >= 128) { + byte -= 256; + } + bytes.writeInt8(byte); + } + var resBytes = bytes.getBytes(); + me.onBinaryData(resBytes); + } + else if ( s == null ) { + me.req = null; + me.onError("Failed to connect or resolve host"); + } + else switch( s ) { + case 12029: + me.req = null; + me.onError("Failed to connect to host"); + case 12007: + me.req = null; + me.onError("Unknown host"); + default: + me.req = null; + me.responseData = r.responseText; + me.onError("Http Error #"+r.status); + } + }; + if( async ) + r.onreadystatechange = onreadystatechange; + var uri = postData; + var jsData = binaryPostData; + if( jsData != null ) + post = true; + else for( p in params ) { + if( uri == null ) + uri = ""; + else + uri += "&"; + uri += StringTools.urlEncode(p.param)+"="+StringTools.urlEncode(p.value); + } + try { + if( post ) + r.open("POST",url,async); + else if( uri != null ) { + var question = url.split("?").length <= 1; + r.open("GET",url+(if( question ) "?" else "&")+uri,async); + uri = null; + } else + r.open("GET",url,async); + } catch( e : Dynamic ) { + me.req = null; + onError(e.toString()); + return; + } + + //XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com] + req.overrideMimeType("text\\/plain; charset=x-user-defined"); + + #if (haxe_ver >= 3.3) + r.withCredentials = me.withCredentials; + #end + if( !Lambda.exists(headers, function(h) return h.header == "Content-Type") && post && postData == null ) + r.setRequestHeader("Content-Type","application/x-www-form-urlencoded"); + + for( h in headers ) + r.setRequestHeader(h.header,h.value); + + if( jsData != null ) { + r.send(new js.html.Uint8Array(jsData.getData())); + } else { + r.send(uri); + } + + if( !async ) + onreadystatechange(null); + } + #elseif nodejs + public override function request( ?post : Bool ) : Void { + + var url_regexp = ~/^(https?:\/\/)?([a-zA-Z\.0-9_-]+)(:[0-9]+)?(.*)$/; + if( !url_regexp.match(url) ) { + onError("Invalid URL"); + return; + } + var ssl = (url_regexp.matched(1) == "https://"); + var host = url_regexp.matched(2); + var portString = url_regexp.matched(3); + var request = url_regexp.matched(4); + if( request == "" ) + request = "/"; + var port = if ( portString == null || portString == "" ) ssl ? 443 : 80 else Std.parseInt(portString.substr(1, portString.length - 1)); + + var options = { + "hostname":host, + "port":port, + "path":request, + "method":post ? "POST" : "GET", + "agent":false, + "withCredentials":#if (haxe_ver >= 3.3) me.withCredentials #else false #end + }; + + var headersCode = ""; + for( h in headers ) + headersCode += 'req.setHeader("${h.header}","${h.value}");'; + --- End diff -- access to request_ and headers is 'private' for THttpClient. so there no way to pass extra headers into code of course jsHttp type isn't safe , but it isn't part of public api > haxe js/nodejs client > --------------------- > > Key: THRIFT-3876 > URL: https://issues.apache.org/jira/browse/THRIFT-3876 > Project: Thrift > Issue Type: Improvement > Components: Haxe - Library > Reporter: Oleksii Prudkyi > Assignee: Oleksii Prudkyi > -- This message was sent by Atlassian JIRA (v6.3.4#6332)