View Javadoc

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  }