Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

HTTPCORE-407: Add a ByteBufferEntity.

git-svn-id: https://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk@1700104 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information...
commit d331eace2e46bef14dedec5bca4a588db8163e63 1 parent 0550039
@ok2c ok2c authored
View
117 httpcore/src/main/java/org/apache/http/entity/ByteBufferEntity.java
@@ -0,0 +1,117 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.entity;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.WritableByteChannel;
+
+import org.apache.http.annotation.NotThreadSafe;
+import org.apache.http.util.Args;
+
+/**
+ * An entity that delivers the contents of a {@link ByteBuffer}.
+ */
+@NotThreadSafe
+public class ByteBufferEntity extends AbstractHttpEntity implements Cloneable {
+
+ private final ByteBuffer buffer;
+
+ private class ByteBufferInputStream extends InputStream {
+
+ ByteBufferInputStream() {
+ buffer.position(0);
+ }
+
+ public int read() throws IOException {
+ if (!buffer.hasRemaining()) {
+ return -1;
+ }
+ return buffer.get() & 0xFF;
+ }
+
+ public int read(final byte[] bytes, final int off, final int len) throws IOException {
+ if (!buffer.hasRemaining()) {
+ return -1;
+ }
+
+ final int chunk = Math.min(len, buffer.remaining());
+ buffer.get(bytes, off, chunk);
+ return chunk;
+ }
+ }
+
+ public ByteBufferEntity(final ByteBuffer buffer, final ContentType contentType) {
+ super();
+ Args.notNull(buffer, "Source byte buffer");
+ this.buffer = buffer;
+ if (contentType != null) {
+ setContentType(contentType.toString());
+ }
+ }
+
+ public ByteBufferEntity(final ByteBuffer buffer) {
+ this(buffer, null);
+ }
+
+ @Override
+ public boolean isRepeatable() {
+ return true;
+ }
+
+ @Override
+ public long getContentLength() {
+ return buffer.capacity();
+ }
+
+ @Override
+ public InputStream getContent() throws IOException, UnsupportedOperationException {
+ return new ByteBufferInputStream();
+ }
+
+ @Override
+ public void writeTo(final OutputStream outstream) throws IOException {
+ Args.notNull(outstream, "Output stream");
+ final WritableByteChannel channel = Channels.newChannel(outstream);
+ channel.write(buffer);
+ outstream.flush();
+ }
+
+ @Override
+ public boolean isStreaming() {
+ return false;
+ }
+
+ @Override
+ public Object clone() throws CloneNotSupportedException {
+ return super.clone();
+ }
+}
View
92 httpcore/src/test/java/org/apache/http/entity/TestByteBufferEntity.java
@@ -0,0 +1,92 @@
+/*
+ * ====================================================================
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ */
+
+package org.apache.http.entity;
+
+import org.apache.http.Consts;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.nio.ByteBuffer;
+
+/**
+ * Unit tests for {@link ByteBufferEntity}.
+ *
+ */
+public class TestByteBufferEntity {
+
+ @Test
+ public void testBasics() throws Exception {
+ final ByteBuffer bytes = ByteBuffer.wrap("Message content".getBytes(Consts.ASCII));
+ final ByteBufferEntity httpentity = new ByteBufferEntity(bytes);
+
+ Assert.assertEquals(bytes.capacity(), httpentity.getContentLength());
+ Assert.assertNotNull(httpentity.getContent());
+ Assert.assertTrue(httpentity.isRepeatable());
+ Assert.assertFalse(httpentity.isStreaming());
+ }
+
+
+ @Test(expected=IllegalArgumentException.class)
+ public void testIllegalConstructorNullByteArray() throws Exception {
+ new ByteBufferEntity(null);
+ }
+
+ @Test
+ public void testWriteTo() throws Exception {
+ final ByteBuffer bytes = ByteBuffer.wrap("Message content".getBytes(Consts.ASCII));
+ final ByteBufferEntity httpentity = new ByteBufferEntity(bytes);
+
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ httpentity.writeTo(out);
+ byte[] bytes2 = out.toByteArray();
+ Assert.assertNotNull(bytes2);
+ Assert.assertEquals(bytes.capacity(), bytes2.length);
+ bytes.position(0);
+ for (int i = 0; i < bytes2.length; i++) {
+ Assert.assertEquals(bytes.get(i), bytes2[i]);
+ }
+
+ out = new ByteArrayOutputStream();
+ httpentity.writeTo(out);
+ bytes2 = out.toByteArray();
+ Assert.assertNotNull(bytes2);
+ Assert.assertEquals(bytes.capacity(), bytes2.length);
+ bytes.position(0);
+ for (int i = 0; i < bytes.capacity(); i++) {
+ Assert.assertEquals(bytes.get(i), bytes2[i]);
+ }
+
+ try {
+ httpentity.writeTo(null);
+ Assert.fail("IllegalArgumentException should have been thrown");
+ } catch (final IllegalArgumentException ex) {
+ // expected
+ }
+ }
+}
Please sign in to comment.
Something went wrong with that request. Please try again.