From d74ca156b3aaff49abca1b52461235031ef522b9 Mon Sep 17 00:00:00 2001 From: Bryan Duxbury Date: Thu, 5 Aug 2010 22:05:35 +0000 Subject: [PATCH] THRIFT-814. java: Include a TServlet in the standard Thrift distribution This patch adds a TServlet implementation of the HttpServlet interface to be used with various containers. Patch: Mathias Herberts git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@982802 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/thrift/server/TServlet.java | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 lib/java/src/org/apache/thrift/server/TServlet.java diff --git a/lib/java/src/org/apache/thrift/server/TServlet.java b/lib/java/src/org/apache/thrift/server/TServlet.java new file mode 100644 index 00000000..c1ab9df5 --- /dev/null +++ b/lib/java/src/org/apache/thrift/server/TServlet.java @@ -0,0 +1,119 @@ +package org.apache.thrift.server; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.thrift.TException; +import org.apache.thrift.TProcessor; +import org.apache.thrift.protocol.TProtocol; +import org.apache.thrift.protocol.TProtocolFactory; +import org.apache.thrift.transport.TIOStreamTransport; +import org.apache.thrift.transport.TTransport; + +/** + * Servlet implementation class ThriftServer + */ +public class TServlet extends HttpServlet { + + private final TProcessor processor; + + private final TProtocolFactory inProtocolFactory; + + private final TProtocolFactory outProtocolFactory; + + private final Collection> customHeaders; + + /** + * @see HttpServlet#HttpServlet() + */ + public TServlet(TProcessor processor, TProtocolFactory inProtocolFactory, + TProtocolFactory outProtocolFactory) { + super(); + this.processor = processor; + this.inProtocolFactory = inProtocolFactory; + this.outProtocolFactory = outProtocolFactory; + this.customHeaders = new ArrayList>(); + } + + /** + * @see HttpServlet#HttpServlet() + */ + public TServlet(TProcessor processor, TProtocolFactory protocolFactory) { + this(processor, protocolFactory, protocolFactory); + } + + /** + * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse + * response) + */ + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + TTransport inTransport = null; + TTransport outTransport = null; + + try { + response.setContentType("application/x-thrift"); + + if (null != this.customHeaders) { + for (Map.Entry header : this.customHeaders) { + response.addHeader(header.getKey(), header.getValue()); + } + } + InputStream in = request.getInputStream(); + OutputStream out = response.getOutputStream(); + + TTransport transport = new TIOStreamTransport(in, out); + inTransport = transport; + outTransport = transport; + + TProtocol inProtocol = inProtocolFactory.getProtocol(inTransport); + TProtocol outProtocol = outProtocolFactory.getProtocol(outTransport); + + processor.process(inProtocol, outProtocol); + out.flush(); + } catch (TException te) { + throw new ServletException(te); + } + } + + /** + * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse + * response) + */ + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + doPost(request, response); + } + + public void addCustomHeader(final String key, final String value) { + this.customHeaders.add(new Map.Entry() { + public String getKey() { + return key; + } + + public String getValue() { + return value; + } + + public String setValue(String value) { + return null; + } + }); + } + + public void setCustomHeaders(Collection> headers) { + this.customHeaders.clear(); + this.customHeaders.addAll(headers); + } +} -- 2.17.1