package com.koushikdutta.async.http.server; import android.net.Uri; import com.koushikdutta.async.AsyncServer; import com.koushikdutta.async.Util; import com.koushikdutta.async.callback.CompletedCallback; import com.koushikdutta.async.http.AsyncHttpClient; import com.koushikdutta.async.http.AsyncHttpRequest; import com.koushikdutta.async.http.AsyncHttpResponse; import com.koushikdutta.async.http.callback.HttpConnectCallback; /** * Created by koush on 7/22/14. */ public class AsyncProxyServer extends AsyncHttpServer { AsyncHttpClient proxyClient; public AsyncProxyServer(AsyncServer server) { proxyClient = new AsyncHttpClient(server); } @Override protected void onRequest(HttpServerRequestCallback callback, AsyncHttpServerRequest request, final AsyncHttpServerResponse response) { super.onRequest(callback, request, response); if (callback != null) return; try { Uri uri; try { uri = Uri.parse(request.getPath()); if (uri.getScheme() == null) throw new Exception("no host or full uri provided"); } catch (Exception e) { String host = request.getHeaders().get("Host"); int port = 80; if (host != null) { String[] splits = host.split(":", 2); if (splits.length == 2) { host = splits[0]; port = Integer.parseInt(splits[1]); } } uri = Uri.parse("http://" + host + ":" + port + request.getPath()); } proxyClient.execute(new AsyncHttpRequest(uri, request.getMethod(), request.getHeaders()), new HttpConnectCallback() { @Override public void onConnectCompleted(Exception ex, AsyncHttpResponse remoteResponse) { if (ex != null) { response.code(500); response.send(ex.getMessage()); return; } response.proxy(remoteResponse); } }); } catch (Exception e) { response.code(500); response.send(e.getMessage()); } } @Override protected boolean onRequest(AsyncHttpServerRequest request, AsyncHttpServerResponse response) { return true; } }