package com.googlecode.mycontainer.commons.http; import java.io.IOException; import java.net.URI; import java.util.List; import org.apache.http.Header; import org.apache.http.HeaderElement; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpHead; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.entity.AbstractHttpEntity; import org.apache.http.entity.ByteArrayEntity; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; import org.apache.http.message.BasicHeader; import org.apache.http.util.EntityUtils; import com.googlecode.mycontainer.commons.util.CryptoUtil; public class HttpClientRequestService implements RequestService { private String repository; private String pass; private String user; public HttpClientRequestService() { } public HttpClientRequestService(String repository) { this.repository = repository; } public String getRepository() { return repository; } public void setRepository(String repository) { this.repository = repository; } public HttpClient getClient() { DefaultHttpClient client = new DefaultHttpClient(new ThreadSafeClientConnManager()); return client; } public Response execute(Request req) { try { HttpClient client = getClient(); HttpRequestBase request = createRequest(req); if (user != null) { String auth = user + ':' + pass; auth = CryptoUtil.encodeBase64(auth.getBytes()); request.addHeader(new BasicHeader("Authorization", "Basic " + auth)); } HttpResponse response = client.execute(request); Response resp = createResponse(response, req); return resp; } catch (ClientProtocolException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } private Response createResponse(HttpResponse response, Request req) { try { Response ret = new Response(req); Header[] headers = response.getAllHeaders(); for (Header header : headers) { String name = header.getName(); HeaderElement[] elements = header.getElements(); for (HeaderElement headerElement : elements) { ret.headers().add(name, headerElement.toString()); } } ret.code(response.getStatusLine().getStatusCode()); ret.message(response.getStatusLine().getReasonPhrase()); HttpEntity entity = response.getEntity(); if (entity != null && entity.getContentType() != null) { ret.content(EntityUtils.toByteArray(entity)); } return ret; } catch (ParseException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } private HttpRequestBase createRequest(Request req) { Type type = req.type(); URI uri = req.toURI(repository); HttpRequestBase ret; switch (type) { case GET: ret = new HttpGet(uri); break; case HEAD: ret = new HttpHead(uri); break; case DELETE: ret = new HttpDelete(uri); break; case PUT: ret = new HttpPut(uri); break; case POST: ret = new HttpPost(uri); break; default: throw new RuntimeException("not supported: " + type); } List<NamePair> pairs = req.headers().pairs(); for (NamePair header : pairs) { ret.addHeader(header.name(), header.value()); } if (ret instanceof HttpEntityEnclosingRequestBase) { HttpEntityEnclosingRequestBase base = (HttpEntityEnclosingRequestBase) ret; Content content = req.content(); AbstractHttpEntity entity; if (!content.isBinary()) { entity = new StringEntity(content.text(), content.charset()); } else { entity = new ByteArrayEntity(content.data()); } entity.setContentType(content.mediaType()); entity.setContentEncoding(content.charset()); base.setEntity(entity); } return ret; } public void setUser(String user, String pass) { this.user = user; this.pass = pass; } }