handle the inner redirection of mail server in proxy servlet

 
Post new topic   Reply to topic    Aprelium Forum Index -> URL Rewriting
View previous topic :: View next topic  
Author Message
Rohan_j
-


Joined: 04 Jul 2008
Posts: 2

PostPosted: Wed Jul 23, 2008 1:54 am    Post subject: handle the inner redirection of mail server in proxy servlet Reply with quote

i am using following code to redirect ..
i am able to redirect wen i set RedirectHost as yahoo.com or google.com
but not able to wen RedirectHost is gmail.com
how do i handle the inner redirection of mail server in proxy servlet
iam getting status code -502 (Bad gateway error)



import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.URL;
import java.net.URLConnection;
import java.util.Enumeration;
import java.util.HashSet;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.mortbay.util.IO;


public class ProxyServlet implements Servlet
{
private int _tunnelTimeoutMs=300000;

protected HashSet _DontProxyHeaders = new HashSet();
{
_DontProxyHeaders.add("proxy-connection");
_DontProxyHeaders.add("connection");
_DontProxyHeaders.add("keep-alive");
_DontProxyHeaders.add("transfer-encoding");
_DontProxyHeaders.add("te");
_DontProxyHeaders.add("trailer");
_DontProxyHeaders.add("proxy-authorization");
_DontProxyHeaders.add("proxy-authenticate");
_DontProxyHeaders.add("upgrade");
}

private ServletConfig config;
private ServletContext context;
private String redirectHost = null;
private String redirectPort = null;


public void init(ServletConfig config) throws ServletException
{
this.config=config;
this.context=config.getServletContext();
Map mapReDirect = null;
mapReDirect = new Hashtable();
mapReDirect.put("RedirectHost","www.gmail.com");
//mapReDirect.put("RedirectHost","www.google.com");
mapReDirect.put("RedirectPort","80");
listReDirect.add(mapReDirect);
redirectHost = config.getInitParameter("redirecthost");
redirectPort = config.getInitParameter("redirectport");
}


public ServletConfig getServletConfig()
{
return config;
}

/* (non-Javadoc)
* @see javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
*/
public void service(ServletRequest req, ServletResponse res) throws ServletException,
IOException
{
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
if ("CONNECT".equalsIgnoreCase(request.getMethod()))
{
handleConnect(request,response);
}
else
{
String strProtocol = "http";
String strSourceSubDir = null;
String uri=request.getRequestURI();
String strRedirectHost = "www.gmail.com";
//String strRedirectHost = "www.google.com";
String strRedirectPort = String.valueOf(request.getLocalPort());
String strRedirectURI = "/";
strRedirectHost = "www.gmail.com";
// strRedirectHost = "www.google.com";
strRedirectPort = redirectPort;

if (request.getQueryString()!=null)
uri+="?"+request.getQueryString();
URL url = new URL(request.getScheme(),
request.getServerName(),
request.getServerPort(),
uri);

URL url =new URL
(
strProtocol,
strRedirectHost,
// Integer.parseInt(strRedirectPort),
Integer.parseInt("80"),
strRedirectURI
);

context.log("URL="+url);

URLConnection connection = url.openConnection();
connection.setAllowUserInteraction(false);

System.setProperty("http.proxyHost" , "xxxxx");
System.setProperty("https.proxyHost", "xxxxx");
System.setProperty("http.proxyPort" , "8080");
System.setProperty("https.proxyPort", "8080");
// Set method
HttpURLConnection http = null;
if (connection instanceof HttpURLConnection)
{
http = (HttpURLConnection)connection;
http.setRequestMethod(request.getMethod());
http.setInstanceFollowRedirects(false);
}

// check connection header
String connectionHdr = request.getHeader("Connection");
if (connectionHdr!=null)
{
connectionHdr=connectionHdr.toLowerCase();
if (connectionHdr.equals("keep-alive")||
connectionHdr.equals("close"))
connectionHdr=null;
}

// copy headers
boolean xForwardedFor=false;
boolean hasContent=false;
Enumeration enm = request.getHeaderNames();
while (enm.hasMoreElements())
{
// TODO could be better than this!
String hdr=(String)enm.nextElement();
String lhdr=hdr.toLowerCase();

if (_DontProxyHeaders.contains(lhdr))
continue;
if (connectionHdr!=null && connectionHdr.indexOf(lhdr)>=0)
continue;

if ("content-type".equals(lhdr))
hasContent=true;

Enumeration vals = request.getHeaders(hdr);
while (vals.hasMoreElements())
{
String val = (String)vals.nextElement();
if (val!=null)
{
connection.addRequestProperty(hdr,val);
context.log("req "+hdr+": "+val);
xForwardedFor|="X-Forwarded-For".equalsIgnoreCase(hdr);
}
}
}

// Proxy headers
connection.setRequestProperty("Via","1.1 (Apache/1.1)");
if (!xForwardedFor)
connection.addRequestProperty("X-Forwarded-For",
request.getRemoteAddr());
// a little bit of cache control
String cache_control = request.getHeader("Cache-Control");
if (cache_control!=null &&
(cache_control.indexOf("no-cache")>=0 ||
cache_control.indexOf("no-store")>=0))
connection.setUseCaches(false);

// customize Connection

try
{
connection.setDoInput(true);

// do input thang!
InputStream in=request.getInputStream();
if (hasContent)
{
connection.setDoOutput(true);
IO.copy(in,connection.getOutputStream());
}

// Connect
connection.connect();
}
catch (Exception e)
{
context.log("proxy",e);
}

InputStream proxy_in = null;

// handler status codes etc.
int code=500;
if (http!=null)
{
proxy_in = http.getErrorStream();

code=http.getResponseCode();
response.setStatus(code, http.getResponseMessage());
context.log("response = "+http.getResponseCode());
}

if (proxy_in==null)
{
try {proxy_in=connection.getInputStream();}
catch (Exception e)
{
context.log("stream",e);
proxy_in = http.getErrorStream();
}
}

// clear response defaults.
response.setHeader("Date",null);
response.setHeader("Server",null);

// set response headers
int h=0;
String hdr=connection.getHeaderFieldKey(h);
String val=connection.getHeaderField(h);
while(hdr!=null || val!=null)
{
String lhdr = hdr!=null?hdr.toLowerCase():null;
if (hdr!=null && val!=null && !_DontProxyHeaders.contains(lhdr))
response.addHeader(hdr,val);

context.log("res "+hdr+": "+val);

h++;
hdr=connection.getHeaderFieldKey(h);
val=connection.getHeaderField(h);
}
response.addHeader("Via","1.1 (Apache/1.1)");

// Handle
if (proxy_in!=null)
IO.copy(proxy_in,response.getOutputStream());

}
}


/* ------------------------------------------------------------ */
public void handleConnect(HttpServletRequest request,
HttpServletResponse response)
throws IOException
{
String uri = request.getRequestURI();

context.log("CONNECT: "+uri);

String port = "";
String host = "";

int c = uri.indexOf(':');
if (c>=0)
{
port = uri.substring(c+1);
host = uri.substring(0,c);
if (host.indexOf('/')>0)
host = host.substring(host.indexOf('/')+1);
}



InetSocketAddress inetAddress = new InetSocketAddress (host, Integer.parseInt(port));
//if (isForbidden(HttpMessage.__SSL_SCHEME,addrPort.getHost(),addrPort.getPort(),false))
//{
// sendForbid(request,response,uri);
//} //else
{
InputStream in=request.getInputStream();
OutputStream out=response.getOutputStream();

Socket socket = new Socket(inetAddress.getAddress(),inetAddress.getPort());
context.log("Socket: "+socket);

response.setStatus(200);
response.setHeader("Connection","close");
response.flushBuffer();

context.log("out<-in");
IO.copyThread(socket.getInputStream(),out);
context.log("in->out");
IO.copy(in,socket.getOutputStream());
}
}




/* (non-Javadoc)
* @see javax.servlet.Servlet#getServletInfo()
*/
public String getServletInfo()
{
return "Proxy Servlet";
}

/* (non-Javadoc)
* @see javax.servlet.Servlet#destroy()
*/
public void destroy()
{

}
}
Back to top View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Aprelium Forum Index -> URL Rewriting All times are GMT + 1 Hour
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB phpBB Group