package com.koushikdutta.async.http;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import com.koushikdutta.async.AsyncSSLException;
import com.koushikdutta.async.http.libcore.RawHeaders;
import com.koushikdutta.async.http.libcore.RequestHeaders;
import org.apache.http.*;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.HttpParams;
import java.net.URI;
import java.util.List;
import java.util.Map;
public class AsyncHttpRequest {
public RequestLine getRequestLine() {
return new RequestLine() {
@Override
public String getUri() {
return AsyncHttpRequest.this.getUri().toString();
}
@Override
public ProtocolVersion getProtocolVersion() {
return new ProtocolVersion("HTTP", 1, 1);
}
@Override
public String getMethod() {
return mMethod;
}
@Override
public String toString() {
String path = AsyncHttpRequest.this.getUri().getRawPath();
if (path.length() == 0)
path = "/";
String query = AsyncHttpRequest.this.getUri().getRawQuery();
if (query != null && query.length() != 0) {
path += "?" + query;
}
return String.format("%s %s HTTP/1.1", mMethod, path);
}
};
}
public RequestLine getProxyRequestLine() {
return new RequestLine() {
@Override
public String getUri() {
return AsyncHttpRequest.this.getUri().toString();
}
@Override
public ProtocolVersion getProtocolVersion() {
return new ProtocolVersion("HTTP", 1, 1);
}
@Override
public String getMethod() {
return mMethod;
}
@Override
public String toString() {
return String.format("%s %s HTTP/1.1", mMethod, AsyncHttpRequest.this.getUri());
}
};
}
protected final String getDefaultUserAgent() {
String agent = System.getProperty("http.agent");
return agent != null ? agent : ("Java" + System.getProperty("java.version"));
}
private String mMethod;
public String getMethod() {
return mMethod;
}
public AsyncHttpRequest setMethod(String method) {
if (getClass() != AsyncHttpRequest.class)
throw new UnsupportedOperationException("can't change method on a subclass of AsyncHttpRequest");
mMethod = method;
mRawHeaders.setStatusLine(getRequestLine().toString());
return this;
}
public AsyncHttpRequest(URI uri, String method) {
this(uri, method, null);
}
public AsyncHttpRequest(URI uri, String method, RawHeaders headers) {
assert uri != null;
mMethod = method;
if (headers == null)
headers = new RawHeaders();
mRawHeaders = headers;
mHeaders = new RequestHeaders(uri, mRawHeaders);
mRawHeaders.setStatusLine(getRequestLine().toString());
mHeaders.setHost(uri.getHost());
if (mHeaders.getUserAgent() == null)
mHeaders.setUserAgent(getDefaultUserAgent());
mHeaders.setAcceptEncoding("gzip, deflate");
mHeaders.setConnection("keep-alive");
mHeaders.getHeaders().set("Accept", "*/*");
}
public URI getUri() {
return mHeaders.getUri();
}
private RawHeaders mRawHeaders = new RawHeaders();
private RequestHeaders mHeaders;
@Deprecated
private Handler mHandler = Looper.myLooper() == null ? null : new Handler();
@Deprecated
public Handler getHandler() {
return mHandler;
}
@Deprecated
public AsyncHttpRequest setHandler(Handler handler) {
mHandler = handler;
return this;
}
public RequestHeaders getHeaders() {
return mHeaders;
}
public String getRequestString() {
return mRawHeaders.toHeaderString();
}
private boolean mFollowRedirect = true;
public boolean getFollowRedirect() {
return mFollowRedirect;
}
public AsyncHttpRequest setFollowRedirect(boolean follow) {
mFollowRedirect = follow;
return this;
}
private AsyncHttpRequestBody mBody;
public void setBody(AsyncHttpRequestBody body) {
mBody = body;
}
public AsyncHttpRequestBody getBody() {
return mBody;
}
public void onHandshakeException(AsyncSSLException e) {
}
public static final int DEFAULT_TIMEOUT = 30000;
int mTimeout = DEFAULT_TIMEOUT;
public int getTimeout() {
return mTimeout;
}
public AsyncHttpRequest setTimeout(int timeout) {
mTimeout = timeout;
return this;
}
public static AsyncHttpRequest create(HttpRequest request) {
AsyncHttpRequest ret = new AsyncHttpRequest(URI.create(request.getRequestLine().getUri()), request.getRequestLine().getMethod());
for (Header header: request.getAllHeaders()) {
ret.getHeaders().getHeaders().add(header.getName(), header.getValue());
}
return ret;
}
private static class HttpRequestWrapper implements HttpRequest {
AsyncHttpRequest request;
@Override
public RequestLine getRequestLine() {
return request.getRequestLine();
}
public HttpRequestWrapper(AsyncHttpRequest request) {
this.request = request;
}
@Override
public void addHeader(Header header) {
request.getHeaders().getHeaders().add(header.getName(), header.getValue());
}
@Override
public void addHeader(String name, String value) {
request.getHeaders().getHeaders().add(name, value);
}
@Override
public boolean containsHeader(String name) {
return request.getHeaders().getHeaders().get(name) != null;
}
@Override
public Header[] getAllHeaders() {
Header[] ret = new Header[request.getHeaders().getHeaders().length()];
for (int i = 0; i < ret.length; i++) {
String name = request.getHeaders().getHeaders().getFieldName(i);
String value = request.getHeaders().getHeaders().getValue(i);
ret[i] = new BasicHeader(name, value);
}
return ret;
}
@Override
public Header getFirstHeader(String name) {
String value = request.getHeaders().getHeaders().get(name);
if (value == null)
return null;
return new BasicHeader(name, value);
}
@Override
public Header[] getHeaders(String name) {
Map<String, List<String>> map = request.getHeaders().getHeaders().toMultimap();
List<String> vals = map.get(name);
if (vals == null)
return new Header[0];
Header[] ret = new Header[vals.size()];
for (int i = 0; i < ret.length; i++)
ret[i] = new BasicHeader(name, vals.get(i));
return ret;
}
@Override
public Header getLastHeader(String name) {
Header[] vals = getHeaders(name);
if (vals.length == 0)
return null;
return vals[vals.length - 1];
}
HttpParams params;
@Override
public HttpParams getParams() {
return params;
}
@Override
public ProtocolVersion getProtocolVersion() {
return new ProtocolVersion("HTTP", 1, 1);
}
@Override
public HeaderIterator headerIterator() {
assert false;
return null;
}
@Override
public HeaderIterator headerIterator(String name) {
assert false;
return null;
}
@Override
public void removeHeader(Header header) {
request.getHeaders().getHeaders().removeAll(header.getName());
}
@Override
public void removeHeaders(String name) {
request.getHeaders().getHeaders().removeAll(name);
}
@Override
public void setHeader(Header header) {
setHeader(header.getName(), header.getValue());
}
@Override
public void setHeader(String name, String value) {
request.getHeaders().getHeaders().set(name, value);
}
@Override
public void setHeaders(Header[] headers) {
for (Header header: headers)
setHeader(header);
}
@Override
public void setParams(HttpParams params) {
this.params = params;
}
}
public HttpRequest asHttpRequest() {
return new HttpRequestWrapper(this);
}
public AsyncHttpRequest setHeader(String name, String value) {
getHeaders().getHeaders().set(name, value);
return this;
}
public AsyncHttpRequest addHeader(String name, String value) {
getHeaders().getHeaders().add(name, value);
return this;
}
String proxyHost;
int proxyPort = -1;
public void enableProxy(String host, int port) {
proxyHost = host;
proxyPort = port;
}
public void disableProxy() {
proxyHost = null;
proxyPort = -1;
}
public String getProxyHost() {
return proxyHost;
}
public int getProxyPort() {
return proxyPort;
}
public void setLogging(String tag, int level) {
LOGTAG = tag;
logLevel = level;
}
// request level logging
String LOGTAG;
int logLevel;
long executionTime;
private String getLogMessage(String message) {
long elapsed;
if (executionTime != 0)
elapsed = System.currentTimeMillis() - executionTime;
else
elapsed = 0;
return String.format("(%d ms) %s: %s", elapsed, getUri(), message);
}
public void logi(String message) {
if (LOGTAG == null)
return;
if (logLevel > Log.INFO)
return;
Log.i(LOGTAG, getLogMessage(message));
}
public void logv(String message) {
if (LOGTAG == null)
return;
if (logLevel > Log.VERBOSE)
return;
Log.v(LOGTAG, getLogMessage(message));
}
public void logw(String message) {
if (LOGTAG == null)
return;
if (logLevel > Log.WARN)
return;
Log.w(LOGTAG, getLogMessage(message));
}
public void logd(String message) {
if (LOGTAG == null)
return;
if (logLevel > Log.DEBUG)
return;
Log.d(LOGTAG, getLogMessage(message));
}
public void logd(String message, Exception e) {
if (LOGTAG == null)
return;
if (logLevel > Log.DEBUG)
return;
Log.d(LOGTAG, getLogMessage(message));
Log.d(LOGTAG, e.getMessage(), e);
}
public void loge(String message) {
if (LOGTAG == null)
return;
if (logLevel > Log.ERROR)
return;
Log.e(LOGTAG, getLogMessage(message));
}
public void loge(String message, Exception e) {
if (LOGTAG == null)
return;
if (logLevel > Log.ERROR)
return;
Log.e(LOGTAG, getLogMessage(message));
Log.e(LOGTAG, e.getMessage(), e);
}
}