package jtweet.apiproxy;
import java.io.IOException;
import java.net.URL;
import java.util.Enumeration;
import javax.servlet.http.*;
import com.google.appengine.api.urlfetch.*;
@SuppressWarnings("serial")
public class ApiServlet extends HttpServlet {
protected String twbase = "https://twitter.com";
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
String req_url = req.getRequestURI().substring(4);
String query_string = req.getQueryString();
if(req_url.isEmpty() || req_url.equalsIgnoreCase("/"))
{
resp.sendRedirect("/api.jsp");
}
else if(TRequest.getRequestType(req_url) == TRequest.NOTSUPPORT)
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
else
{
URLFetchService urlFetch = URLFetchServiceFactory.getURLFetchService();
HTTPRequest httpreq = new HTTPRequest(query_string == null ? new URL(twbase + req_url) : new URL(twbase + req_url + "?" + query_string), HTTPMethod.GET);
Enumeration<String> ReqHeadersEnum = req.getHeaderNames();
while(ReqHeadersEnum.hasMoreElements())
{
String HeaderName = ReqHeadersEnum.nextElement();
String Header = req.getHeader(HeaderName);
if(Header != null)
{
httpreq.addHeader(new HTTPHeader(HeaderName, Header));
}
}
try
{
HTTPResponse httpresp = urlFetch.fetch(httpreq);
if(httpresp.getResponseCode() == 401)
{
resp.setHeader("WWW-Authenticate","BASIC realm=\"Twitter.com realm\"");
resp.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
else
{
resp.getOutputStream().write(httpresp.getContent());
for (HTTPHeader h : httpresp.getHeaders())
{
if(h.getName().equalsIgnoreCase("Set-Cookie"))
{
resp.setHeader("Set-Cookie", h.getValue().replaceAll(".twitter.com", req.getServerName()));
}
else if(!h.getName().equalsIgnoreCase("Content-length"))
{
resp.setHeader(h.getName(), h.getValue());
}
}
//return err code
if(httpresp.getResponseCode() != 200) resp.sendError(httpresp.getResponseCode());
}
}
catch(IOException e)
{
resp.sendError(HttpServletResponse.SC_NOT_FOUND);
//e.printStackTrace();
}
}
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
String req_url = req.getRequestURI().substring(4);
if(TRequest.getRequestType(req_url) == TRequest.NOTSUPPORT)
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED);
else
{
URLFetchService urlFetch = URLFetchServiceFactory.getURLFetchService();
HTTPRequest httpreq = new HTTPRequest(new URL(twbase + req_url), HTTPMethod.POST);
Enumeration<String> ReqHeadersEnum = req.getHeaderNames();
while(ReqHeadersEnum.hasMoreElements())
{
String HeaderName = ReqHeadersEnum.nextElement();
String Header = req.getHeader(HeaderName);
if(Header != null)
{
httpreq.addHeader(new HTTPHeader(HeaderName, Header));
}
}
byte[] buf = new byte[req.getContentLength()];
req.getInputStream().read(buf);
httpreq.setPayload(buf);
try
{
HTTPResponse httpresp = urlFetch.fetch(httpreq);
if(httpresp.getResponseCode() == 401)
{
resp.setHeader("WWW-Authenticate","BASIC realm=\"Twitter.com realm\"");
resp.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
else
{
resp.getOutputStream().write(httpresp.getContent());
for (HTTPHeader h : httpresp.getHeaders())
{
if(h.getName().equalsIgnoreCase("Set-Cookie"))
{
resp.setHeader("Set-Cookie", h.getValue().replaceAll(".twitter.com", req.getServerName()));
}
else if(!h.getName().equalsIgnoreCase("Content-length"))
{
resp.setHeader(h.getName(), h.getValue());
}
}
//return err code
if(httpresp.getResponseCode() != 200) resp.sendError(httpresp.getResponseCode());
}
}
catch(IOException e)
{
resp.sendError(HttpServletResponse.SC_NOT_FOUND);
//e.printStackTrace();
}
}
}
}