You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2020/04/20 17:39:15 UTC

[httpcomponents-core] branch development created (now 8c7f3de)

This is an automated email from the ASF dual-hosted git repository.

olegk pushed a change to branch development
in repository https://gitbox.apache.org/repos/asf/httpcomponents-core.git.


      at 8c7f3de  Improved integration test for out-of-sequence response handling by the HTTP/1.1 async protocol handler

This branch includes the following new commits:

     new 8c7f3de  Improved integration test for out-of-sequence response handling by the HTTP/1.1 async protocol handler

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[httpcomponents-core] 01/01: Improved integration test for out-of-sequence response handling by the HTTP/1.1 async protocol handler

Posted by ol...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

olegk pushed a commit to branch development
in repository https://gitbox.apache.org/repos/asf/httpcomponents-core.git

commit 8c7f3de65ff0fde559c45d5d29db95618667f589
Author: Oleg Kalnichevski <ol...@apache.org>
AuthorDate: Mon Apr 20 19:38:38 2020 +0200

    Improved integration test for out-of-sequence response handling by the HTTP/1.1 async protocol handler
---
 .../hc/core5/testing/nio/Http1IntegrationTest.java | 21 +++++++++-
 ...tyProducer.java => MultiBinEntityProducer.java} | 46 +++++++++++++---------
 .../core5/testing/nio/MultiLineEntityProducer.java | 10 ++++-
 3 files changed, 56 insertions(+), 21 deletions(-)

diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1IntegrationTest.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1IntegrationTest.java
index ea990a0..67859d6 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1IntegrationTest.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/Http1IntegrationTest.java
@@ -1034,9 +1034,26 @@ public class Http1IntegrationTest extends InternalHttp1ServerTestBase {
                 "localhost", serverEndpoint.getPort(), TIMEOUT);
         final ClientSessionEndpoint streamEndpoint = connectFuture.get();
 
+        for (int i = 0; i < 3; i++) {
+            final HttpRequest request1 = new BasicHttpRequest(Method.POST, createRequestURI(serverEndpoint, "/echo"));
+            final Future<Message<HttpResponse, String>> future1 = streamEndpoint.execute(
+                    new BasicRequestProducer(request1, new MultiLineEntityProducer("0123456789abcdef", 100000)),
+                    new BasicResponseConsumer<>(new StringAsyncEntityConsumer()), null);
+            final Message<HttpResponse, String> result1 = future1.get(TIMEOUT.getDuration(), TIMEOUT.getTimeUnit());
+            Assert.assertNotNull(result1);
+            final HttpResponse response1 = result1.getHead();
+            Assert.assertNotNull(response1);
+            Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response1.getCode());
+            Assert.assertNotNull("You shall not pass", result1.getBody());
+
+            Assert.assertTrue(streamEndpoint.isOpen());
+        }
         final HttpRequest request1 = new BasicHttpRequest(Method.POST, createRequestURI(serverEndpoint, "/echo"));
         final Future<Message<HttpResponse, String>> future1 = streamEndpoint.execute(
-                new BasicRequestProducer(request1, new MultiLineEntityProducer("0123456789abcdef", 5000)),
+                new BasicRequestProducer(request1, new MultiBinEntityProducer(
+                        new byte[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'},
+                        100000,
+                        ContentType.TEXT_PLAIN)),
                 new BasicResponseConsumer<>(new StringAsyncEntityConsumer()), null);
         final Message<HttpResponse, String> result1 = future1.get(TIMEOUT.getDuration(), TIMEOUT.getTimeUnit());
         Assert.assertNotNull(result1);
@@ -1044,6 +1061,8 @@ public class Http1IntegrationTest extends InternalHttp1ServerTestBase {
         Assert.assertNotNull(response1);
         Assert.assertEquals(HttpStatus.SC_UNAUTHORIZED, response1.getCode());
         Assert.assertNotNull("You shall not pass", result1.getBody());
+
+        Assert.assertFalse(streamEndpoint.isOpen());
     }
 
     @Test
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/MultiLineEntityProducer.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/MultiBinEntityProducer.java
similarity index 65%
copy from httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/MultiLineEntityProducer.java
copy to httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/MultiBinEntityProducer.java
index 0c0a2fd..9c5188a 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/MultiLineEntityProducer.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/MultiBinEntityProducer.java
@@ -27,25 +27,25 @@
 package org.apache.hc.core5.testing.nio;
 
 import java.io.IOException;
-import java.nio.CharBuffer;
+import java.nio.ByteBuffer;
 
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.nio.StreamChannel;
-import org.apache.hc.core5.http.nio.entity.AbstractCharAsyncEntityProducer;
+import org.apache.hc.core5.http.nio.entity.AbstractBinAsyncEntityProducer;
 
-public class MultiLineEntityProducer extends AbstractCharAsyncEntityProducer {
+public class MultiBinEntityProducer extends AbstractBinAsyncEntityProducer {
 
-    private final String text;
+    private final byte[] bin;
     private final int total;
-    private final CharBuffer charbuf;
+    private final ByteBuffer bytebuf;
 
     private int count;
 
-    public MultiLineEntityProducer(final String text, final int total) {
-        super(1024, -1, ContentType.TEXT_PLAIN);
-        this.text = text;
+    public MultiBinEntityProducer(final byte[] bin, final int total, final ContentType contentType) {
+        super(-1, contentType);
+        this.bin = bin;
         this.total = total;
-        this.charbuf = CharBuffer.allocate(4096);
+        this.bytebuf = ByteBuffer.allocate(4096);
         this.count = 0;
     }
 
@@ -60,29 +60,39 @@ public class MultiLineEntityProducer extends AbstractCharAsyncEntityProducer {
     }
 
     @Override
-    protected void produceData(final StreamChannel<CharBuffer> channel) throws IOException {
-        while (charbuf.remaining() > text.length() + 2 && count < total) {
-            charbuf.put(text + "\r\n");
+    protected void produceData(final StreamChannel<ByteBuffer> channel) throws IOException {
+        while (bytebuf.remaining() > bin.length + 2 && count < total) {
+            bytebuf.put(bin);
             count++;
         }
-        if (charbuf.position() > 0) {
-            charbuf.flip();
-            channel.write(charbuf);
-            charbuf.compact();
+        if (bytebuf.position() > 0) {
+            bytebuf.flip();
+            channel.write(bytebuf);
+            bytebuf.compact();
         }
-        if (count >= total && charbuf.position() == 0) {
+        if (count >= total && bytebuf.position() == 0) {
             channel.endStream();
         }
     }
 
     @Override
+    public boolean isChunked() {
+        return false;
+    }
+
+    @Override
+    public long getContentLength() {
+        return bin.length * total;
+    }
+
+    @Override
     public void failed(final Exception cause) {
     }
 
     @Override
     public void releaseResources() {
         count = 0;
-        charbuf.clear();
+        bytebuf.clear();
         super.releaseResources();
     }
 
diff --git a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/MultiLineEntityProducer.java b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/MultiLineEntityProducer.java
index 0c0a2fd..c0a24f5 100644
--- a/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/MultiLineEntityProducer.java
+++ b/httpcore5-testing/src/test/java/org/apache/hc/core5/testing/nio/MultiLineEntityProducer.java
@@ -28,6 +28,8 @@ package org.apache.hc.core5.testing.nio;
 
 import java.io.IOException;
 import java.nio.CharBuffer;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 
 import org.apache.hc.core5.http.ContentType;
 import org.apache.hc.core5.http.nio.StreamChannel;
@@ -41,14 +43,18 @@ public class MultiLineEntityProducer extends AbstractCharAsyncEntityProducer {
 
     private int count;
 
-    public MultiLineEntityProducer(final String text, final int total) {
-        super(1024, -1, ContentType.TEXT_PLAIN);
+    public MultiLineEntityProducer(final String text, final int total, final Charset charset) {
+        super(1024, -1, ContentType.TEXT_PLAIN.withCharset(charset));
         this.text = text;
         this.total = total;
         this.charbuf = CharBuffer.allocate(4096);
         this.count = 0;
     }
 
+    public MultiLineEntityProducer(final String text, final int total) {
+        this(text, total, StandardCharsets.US_ASCII);
+    }
+
     @Override
     public boolean isRepeatable() {
         return true;