Github user oprudkyi commented on a diff in the pull request:

    https://github.com/apache/thrift/pull/1045#discussion_r71057451
  
    --- 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 --
    
    fix added - headers are passed as JSON 


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to