package com.koushikdutta.async.http;
import java.net.URI;
import java.util.List;
import java.util.Map;
import junit.framework.Assert;
import org.apache.http.Header;
import org.apache.http.HeaderIterator;
import org.apache.http.HttpRequest;
import org.apache.http.ProtocolVersion;
import org.apache.http.RequestLine;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.HttpParams;
import android.os.Handler;
import android.os.Looper;
import com.koushikdutta.async.AsyncSSLException;
import com.koushikdutta.async.http.libcore.RawHeaders;
import com.koushikdutta.async.http.libcore.RequestHeaders;
public class AsyncHttpRequest implements HttpRequest {
public RequestLine getRequestLine() {
return new RequestLine() {
@Override
public String getUri() {
return 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().getPath();
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);
}
};
}
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(URI uri, String method) {
Assert.assertNotNull(uri);
mMethod = method;
mHeaders = new RequestHeaders(uri, mRawHeaders);
mRawHeaders.setStatusLine(getRequestLine().toString());
mHeaders.setHost(uri.getHost());
mHeaders.setUserAgent(getDefaultUserAgent());
mHeaders.setAcceptEncoding("gzip, deflate");
mHeaders.getHeaders().set("Connection", "keep-alive");
mHeaders.getHeaders().set("Accept", "*/*");
}
public URI getUri() {
return mHeaders.getUri();
}
private RawHeaders mRawHeaders = new RawHeaders();
private RequestHeaders mHeaders;
private Handler mHandler = Looper.myLooper() == null ? null : new Handler();
public Handler getHandler() {
return mHandler;
}
public void setHandler(Handler handler) {
mHandler = handler;
}
public RequestHeaders getHeaders() {
return mHeaders;
}
public String getRequestString() {
return mRawHeaders.toHeaderString();
}
private boolean mFollowRedirect = true;
public boolean getFollowRedirect() {
return mFollowRedirect;
}
public void setFollowRedirect(boolean follow) {
mFollowRedirect = follow;
}
private AsyncHttpRequestBody mBody;
public void setBody(AsyncHttpRequestBody body) {
mBody = body;
}
public AsyncHttpRequestBody getBody() {
return mBody;
}
public void onHandshakeException(AsyncSSLException e) {
}
@Override
public void addHeader(Header header) {
getHeaders().getHeaders().add(header.getName(), header.getValue());
}
@Override
public void addHeader(String name, String value) {
getHeaders().getHeaders().add(name, value);
}
@Override
public boolean containsHeader(String name) {
return getHeaders().getHeaders().get(name) != null;
}
@Override
public Header[] getAllHeaders() {
Header[] ret = new Header[getHeaders().getHeaders().length()];
for (int i = 0; i < ret.length; i++) {
String name = getHeaders().getHeaders().getFieldName(i);
String value = getHeaders().getHeaders().getValue(i);
ret[i] = new BasicHeader(name, value);
}
return ret;
}
@Override
public Header getFirstHeader(String name) {
String value = 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 = 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.fail();
return null;
}
@Override
public HeaderIterator headerIterator(String name) {
Assert.fail();
return null;
}
@Override
public void removeHeader(Header header) {
getHeaders().getHeaders().removeAll(header.getName());
}
@Override
public void removeHeaders(String name) {
getHeaders().getHeaders().removeAll(name);
}
@Override
public void setHeader(Header header) {
setHeader(header.getName(), header.getValue());
}
@Override
public void setHeader(String name, String value) {
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;
}
int mTimeout;
public int getTimeout() {
return mTimeout;
}
public void setTimeout(int timeout) {
mTimeout = timeout;
}
public static AsyncHttpRequest create(HttpRequest request) {
AsyncHttpRequest ret = new AsyncHttpRequest(URI.create(request.getRequestLine().getUri()), request.getRequestLine().getMethod());
for (Header header: request.getAllHeaders()) {
ret.addHeader(header);
}
return ret;
}
}