Hi, 
I'm working to build a streaming HTTP library for Apache Beam. As part of 
providing a low entry effort
 interface we want to provide asynchronous and synchronous options which rely 
on 
SimpleHttpRequest / SimpleHttpResponse. 

As the current synchronous client  only handles ClassicHttpRequests, I'm 
currently using:
public static ClassicHttpRequest convert(SimpleHttpRequest original){
        BasicClassicHttpRequest copy = new 
BasicClassicHttpRequest(original.getMethod(), original.getRequestUri());
        copy.setVersion(original.getVersion());
        for (final Iterator<Header> it = original.headerIterator(); 
it.hasNext(); ) {
            copy.addHeader(it.next());
        }
        copy.setScheme(original.getScheme());
        copy.setAuthority(original.getAuthority());

        HttpEntity entity;
        SimpleBody body = original.getBody();
        if(body != null){
            if (body.isBytes()){
                entity = new ByteArrayEntity(body.getBodyBytes(), 
body.getContentType());
            } else{
                entity = new StringEntity(body.getBodyText(), 
body.getContentType());
            }
            copy.setEntity(entity);
        }
        return copy;
    }

To convert simple requests into classic ones. Is this the best way to go about 
it (and if so, would this be 
welcome as a pull request on SimpleHttpRequest), or is there a better way to 
provide this support (e.g. 
extending the classic client to be able to handle SimpleRequests directly)

Similarly, I'm using a relatively involved method of greedily consuming a 
ClassicHttpResponse to produce a 
SimpleHttpResponse from the classic client (code included at the end), and am 
curious if there's a better way
 of doing this conversion or, if not, if providing a SimpleHttpResponseHandler 
and making it available from the client would be a good way of providing a 
unified interface going forewards.

public class SimpleHttpResponseHandler implements 
HttpClientResponseHandler<SimpleHttpResponse> {

    @Override
    public SimpleHttpResponse handleResponse(ClassicHttpResponse response) 
throws HttpException, IOException {
        SimpleHttpResponse simple = SimpleHttpResponse.copy(response);
        HttpEntity ent = response.getEntity();
        if(ent != null){
            byte[] data;
            if (ent.getContentLength() >0) {
                if(ent.getContentLength() > Integer.MAX_VALUE){
                    throw new RuntimeException("Received to much data to buffer 
in memory, try using a streaming consumer");
                }
                data = new byte[(int) ent.getContentLength()];
                int read = ent.getContent().read(data);
                if(read != ent.getContentLength())
                    throw new RuntimeException("Received "+read+" bytes instead 
of "+ent.getContentLength());
            } else{
                final int bufferSize = 8192;
                InputStream is = ent.getContent();
                ArrayList<byte[]> buffers = new ArrayList<>();
                byte[] swapBuf = new byte[bufferSize];
                int read = is.read(swapBuf);
                while(read != -1 && read == bufferSize){
                    buffers.add(swapBuf);
                    swapBuf = new byte[bufferSize];
                    read = is.read(swapBuf);
                }

                int content = bufferSize*buffers.size();
                if(read != -1)
                    content += read;

                if(content <= 0)
                    throw new RuntimeException("Received to many bytes to 
buffer in memory");
                data = new byte[content];

                int index = 0;
                for (final byte[] toCpy : buffers){
                    System.arraycopy(toCpy, 0, data, bufferSize*index, 
bufferSize);
                    index +=1;
                }
                if(read != -1)
                    System.arraycopy(swapBuf, 0, data, bufferSize*index, 
bufferSize);
                
                swapBuf = null;
                buffers.clear();
            }

            simple.setBody(
                    data,
                    ContentType.create(ent.getContentType())
            );
        }
        return simple;
    }
}


Thank you for your time,
Scott
---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org
For additional commands, e-mail: httpclient-users-h...@hc.apache.org

Reply via email to