| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| |
| package org.apache.thrift.transport { |
| |
| import flash.errors.EOFError; |
| import flash.events.Event; |
| import flash.events.IOErrorEvent; |
| import flash.events.SecurityErrorEvent; |
| import flash.net.URLLoader; |
| import flash.net.URLLoaderDataFormat; |
| import flash.net.URLRequest; |
| import flash.net.URLRequestMethod; |
| import flash.system.Capabilities; |
| import flash.utils.ByteArray; |
| |
| /** |
| * HTTP implementation of the TTransport interface. Used for working with a |
| * Thrift web services implementation. |
| */ |
| public class THttpClient extends TTransport { |
| |
| private var request_:URLRequest = null; |
| private var requestBuffer_:ByteArray = new ByteArray(); |
| private var responseBuffer_:ByteArray = null; |
| private var traceBuffers_:Boolean = Capabilities.isDebugger; |
| |
| |
| public function getBuffer():ByteArray { |
| return requestBuffer_; |
| } |
| |
| public function THttpClient(request:URLRequest, traceBuffers:Boolean=true):void { |
| request.contentType = "application/x-thrift"; |
| request_ = request; |
| if(traceBuffers == false) { |
| traceBuffers_ = traceBuffers; |
| } |
| } |
| |
| public override function open():void { |
| } |
| |
| public override function close():void { |
| } |
| |
| public override function isOpen():Boolean { |
| return true; |
| } |
| |
| public override function read(buf:ByteArray, off:int, len:int):int { |
| if (responseBuffer_ == null) { |
| throw new TTransportError(TTransportError.UNKNOWN, "Response buffer is empty, no request."); |
| } |
| try { |
| responseBuffer_.readBytes(buf, off, len); |
| if (traceBuffers_) { |
| dumpBuffer(buf, "READ"); |
| } |
| return len; |
| } |
| catch (e:EOFError) { |
| if (traceBuffers_) { |
| dumpBuffer(requestBuffer_, "FAILED-RESPONSE-REQUEST"); |
| dumpBuffer(responseBuffer_, "FAILED-RESPONSE"); |
| } |
| throw new TTransportError(TTransportError.UNKNOWN, "No more data available."); |
| } |
| return 0; |
| } |
| |
| public override function write(buf:ByteArray, off:int, len:int):void { |
| requestBuffer_.writeBytes(buf, off, len); |
| } |
| |
| public override function flush(callback:Function=null):void { |
| var loader:URLLoader = new URLLoader(); |
| if (callback != null) { |
| loader.addEventListener(Event.COMPLETE, function(event:Event):void { |
| responseBuffer_ = URLLoader(event.target).data; |
| if (traceBuffers_) { |
| dumpBuffer(responseBuffer_, "RESPONSE_BUFFER"); |
| } |
| callback(null); |
| responseBuffer_ = null; |
| }); |
| loader.addEventListener(IOErrorEvent.IO_ERROR, function(event:IOErrorEvent):void { |
| callback(new TTransportError(TTransportError.UNKNOWN, "IOError: " + event.text)); |
| responseBuffer_ = null; |
| }); |
| loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, function(event:SecurityErrorEvent):void { |
| callback(new TTransportError(TTransportError.UNKNOWN, "SecurityError: " + event.text)); |
| responseBuffer_ = null; |
| }); |
| } |
| request_.method = URLRequestMethod.POST; |
| loader.dataFormat = URLLoaderDataFormat.BINARY; |
| requestBuffer_.position = 0; |
| request_.data = requestBuffer_; |
| loader.load(request_); |
| } |
| |
| private function dumpBuffer(buf:ByteArray, prefix:String):String { |
| var debugString : String = prefix + " BUFFER "; |
| if (buf != null) { |
| debugString += "length: " + buf.length + ", "; |
| for (var i : int = 0; i < buf.length; i++) { |
| debugString += "[" + buf[i].toString(16) + "]"; |
| } |
| } else { |
| debugString = "null"; |
| } |
| trace(debugString); |
| return debugString; |
| } |
| |
| } |
| } |