1 package com.atlassian.httpclient.apache.httpcomponents;
2
3 import com.atlassian.fugue.Effect;
4 import com.atlassian.httpclient.api.Request;
5 import com.google.common.io.ByteStreams;
6 import org.apache.http.HttpEntity;
7 import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
8 import org.apache.http.client.methods.HttpRequestBase;
9 import org.apache.http.entity.ByteArrayEntity;
10 import org.apache.http.entity.InputStreamEntity;
11
12 import java.io.ByteArrayInputStream;
13 import java.io.IOException;
14 import java.io.InputStream;
15
16 public class RequestEntityEffect implements Effect<HttpRequestBase> {
17 private final Request request;
18
19 public RequestEntityEffect(final Request request) {
20 this.request = request;
21 }
22
23 @Override
24 public void apply(final HttpRequestBase httpRequestBase) {
25 if (httpRequestBase instanceof HttpEntityEnclosingRequestBase) {
26 ((HttpEntityEnclosingRequestBase) httpRequestBase).setEntity(getHttpEntity(request));
27 } else {
28 throw new UnsupportedOperationException("HTTP method " + request.getMethod() + " does not support sending an entity");
29 }
30 }
31
32 private HttpEntity getHttpEntity(final Request request) {
33 HttpEntity entity = null;
34 if (request.hasEntity()) {
35 InputStream entityStream = request.getEntityStream();
36 if (entityStream instanceof ByteArrayInputStream) {
37 byte[] bytes;
38 if (entityStream instanceof EntityByteArrayInputStream) {
39 bytes = ((EntityByteArrayInputStream) entityStream).getBytes();
40 } else {
41 try {
42 bytes = ByteStreams.toByteArray(entityStream);
43 } catch (IOException e) {
44 throw new RuntimeException(e);
45 }
46 }
47 entity = new ByteArrayEntity(bytes);
48 } else {
49 long contentLength = request.getContentLength().getOrElse(-1L);
50 entity = new InputStreamEntity(entityStream, contentLength);
51 }
52 }
53 return entity;
54 }
55 }