// // THttpHandler.cs // // Authors: // Fredrik Hedberg // // Distributed under the Apache Public License // using System; using System.Web; using System.Net; using System.IO; using Thrift.Protocol; namespace Thrift.Transport { public class THttpHandler : IHttpHandler { protected TProcessor processor; protected TProtocolFactory inputProtocolFactory; protected TProtocolFactory outputProtocolFactory; protected const string contentType = "application/x-thrift"; protected System.Text.Encoding encoding = System.Text.Encoding.UTF8; public THttpHandler(TProcessor processor) : this(processor, new TBinaryProtocol.Factory()) { } public THttpHandler(TProcessor processor, TProtocolFactory protocolFactory) : this(processor, protocolFactory, protocolFactory) { } public THttpHandler(TProcessor processor, TProtocolFactory inputProtocolFactory, TProtocolFactory outputProtocolFactory) { this.processor = processor; this.inputProtocolFactory = inputProtocolFactory; this.outputProtocolFactory = outputProtocolFactory; } public void ProcessRequest(HttpListenerContext context) { context.Response.ContentType = contentType; context.Response.ContentEncoding = encoding; ProcessRequest(context.Request.InputStream, context.Response.OutputStream); } public void ProcessRequest(HttpContext context) { context.Response.ContentType = contentType; context.Response.ContentEncoding = encoding; ProcessRequest(context.Request.InputStream, context.Response.OutputStream); } public void ProcessRequest(Stream input, Stream output) { TTransport transport = new TStreamTransport(input,output); TProtocol inputProtocol = null; TProtocol outputProtocol = null; try { inputProtocol = inputProtocolFactory.GetProtocol(transport); outputProtocol = outputProtocolFactory.GetProtocol(transport); while (processor.Process(inputProtocol, outputProtocol)) { } } catch (TTransportException) { // Client died, just move on } catch (TApplicationException tx) { Console.Error.Write(tx); } catch (Exception x) { Console.Error.Write(x); } transport.Close(); } public bool IsReusable { get { return true; } } } }