/* * 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; } } }