Merged branch 'jetty-9.3.x' into 'jetty-9.4.x'.
This commit is contained in:
commit
9551d0f62b
|
@ -459,9 +459,10 @@ public class HttpClient extends ContainerLifeCycle
|
||||||
HttpHeader.PROXY_AUTHORIZATION == header)
|
HttpHeader.PROXY_AUTHORIZATION == header)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
String name = field.getName();
|
||||||
String value = field.getValue();
|
String value = field.getValue();
|
||||||
if (!newRequest.getHeaders().contains(header, value))
|
if (!newRequest.getHeaders().contains(name, value))
|
||||||
newRequest.header(field.getName(), value);
|
newRequest.header(name, value);
|
||||||
}
|
}
|
||||||
return newRequest;
|
return newRequest;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1549,6 +1549,68 @@ public class HttpClientTest extends AbstractHttpClientServerTest
|
||||||
Assert.assertThat(new String(response.getContent(), StandardCharsets.ISO_8859_1),Matchers.startsWith("[::1]:"));
|
Assert.assertThat(new String(response.getContent(), StandardCharsets.ISO_8859_1),Matchers.startsWith("[::1]:"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCopyRequest()
|
||||||
|
throws Exception
|
||||||
|
{
|
||||||
|
startClient();
|
||||||
|
|
||||||
|
assertCopyRequest(client.newRequest("http://example.com/some/url")
|
||||||
|
.method(HttpMethod.HEAD)
|
||||||
|
.version(HttpVersion.HTTP_2)
|
||||||
|
.content(new StringContentProvider("some string"))
|
||||||
|
.timeout(321, TimeUnit.SECONDS)
|
||||||
|
.idleTimeout(2221, TimeUnit.SECONDS)
|
||||||
|
.followRedirects(true)
|
||||||
|
.header(HttpHeader.CONTENT_TYPE, "application/json")
|
||||||
|
.header("X-Some-Custom-Header", "some-value"));
|
||||||
|
|
||||||
|
assertCopyRequest(client.newRequest("https://example.com")
|
||||||
|
.method(HttpMethod.POST)
|
||||||
|
.version(HttpVersion.HTTP_1_0)
|
||||||
|
.content(new StringContentProvider("some other string"))
|
||||||
|
.timeout(123231, TimeUnit.SECONDS)
|
||||||
|
.idleTimeout(232342, TimeUnit.SECONDS)
|
||||||
|
.followRedirects(false)
|
||||||
|
.header(HttpHeader.ACCEPT, "application/json")
|
||||||
|
.header("X-Some-Other-Custom-Header", "some-other-value"));
|
||||||
|
|
||||||
|
assertCopyRequest(client.newRequest("https://example.com")
|
||||||
|
.header(HttpHeader.ACCEPT, "application/json")
|
||||||
|
.header(HttpHeader.ACCEPT, "application/xml")
|
||||||
|
.header("x-same-name", "value1")
|
||||||
|
.header("x-same-name", "value2"));
|
||||||
|
|
||||||
|
assertCopyRequest(client.newRequest("https://example.com")
|
||||||
|
.header(HttpHeader.ACCEPT, "application/json")
|
||||||
|
.header(HttpHeader.CONTENT_TYPE, "application/json"));
|
||||||
|
|
||||||
|
assertCopyRequest(client.newRequest("https://example.com")
|
||||||
|
.header("Accept", "application/json")
|
||||||
|
.header("Content-Type", "application/json"));
|
||||||
|
|
||||||
|
assertCopyRequest(client.newRequest("https://example.com")
|
||||||
|
.header("X-Custom-Header-1", "value1")
|
||||||
|
.header("X-Custom-Header-2", "value2"));
|
||||||
|
|
||||||
|
assertCopyRequest(client.newRequest("https://example.com")
|
||||||
|
.header("X-Custom-Header-1", "value")
|
||||||
|
.header("X-Custom-Header-2", "value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertCopyRequest(Request original)
|
||||||
|
{
|
||||||
|
Request copy = client.copyRequest((HttpRequest) original, original.getURI());
|
||||||
|
Assert.assertEquals(original.getURI(), copy.getURI());
|
||||||
|
Assert.assertEquals(original.getMethod(), copy.getMethod());
|
||||||
|
Assert.assertEquals(original.getVersion(), copy.getVersion());
|
||||||
|
Assert.assertEquals(original.getContent(), copy.getContent());
|
||||||
|
Assert.assertEquals(original.getIdleTimeout(), copy.getIdleTimeout());
|
||||||
|
Assert.assertEquals(original.getTimeout(), copy.getTimeout());
|
||||||
|
Assert.assertEquals(original.isFollowRedirects(), copy.isFollowRedirects());
|
||||||
|
Assert.assertEquals(original.getHeaders(), copy.getHeaders());
|
||||||
|
}
|
||||||
|
|
||||||
private void consume(InputStream input, boolean eof) throws IOException
|
private void consume(InputStream input, boolean eof) throws IOException
|
||||||
{
|
{
|
||||||
int crlfs = 0;
|
int crlfs = 0;
|
||||||
|
|
|
@ -65,5 +65,5 @@ Currently there are very few HTTP/2 configuration properties and the default val
|
||||||
|=======================================================================
|
|=======================================================================
|
||||||
|Property |Description
|
|Property |Description
|
||||||
|jetty.http2.maxConcurrentStreams |The maximum number of concurrently open streams allowed on a single HTTP/2 connection (default 1024). Larger values increase parallelism but cost a memory commitment.
|
|jetty.http2.maxConcurrentStreams |The maximum number of concurrently open streams allowed on a single HTTP/2 connection (default 1024). Larger values increase parallelism but cost a memory commitment.
|
||||||
|jetty.http2.initialStreamSendWindow |The initial flow control window size for a new stream (default 65535). Larger values may allow greater throughput but also risk head of line blocking if TCP/IP flow control is triggered.
|
|jetty.http2.initialStreamRecvWindow |The initial receive flow control window size for a new stream (default 65535). Larger values may allow greater throughput but also risk head of line blocking if TCP/IP flow control is triggered.
|
||||||
|=======================================================================
|
|=======================================================================
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<New class="org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory">
|
<New class="org.eclipse.jetty.http2.server.HTTP2ServerConnectionFactory">
|
||||||
<Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
|
<Arg name="config"><Ref refid="sslHttpConfig"/></Arg>
|
||||||
<Set name="maxConcurrentStreams"><Property name="jetty.http2.maxConcurrentStreams" deprecated="http2.maxConcurrentStreams" default="1024"/></Set>
|
<Set name="maxConcurrentStreams"><Property name="jetty.http2.maxConcurrentStreams" deprecated="http2.maxConcurrentStreams" default="1024"/></Set>
|
||||||
<Set name="initialStreamSendWindow"><Property name="jetty.http2.initialStreamSendWindow" default="65535"/></Set>
|
<Set name="initialStreamRecvWindow"><Property name="jetty.http2.initialStreamRecvWindow" default="65535"/></Set>
|
||||||
</New>
|
</New>
|
||||||
</Arg>
|
</Arg>
|
||||||
</Call>
|
</Call>
|
||||||
|
@ -23,4 +23,3 @@
|
||||||
</Ref>
|
</Ref>
|
||||||
|
|
||||||
</Configure>
|
</Configure>
|
||||||
|
|
||||||
|
|
|
@ -10,9 +10,8 @@
|
||||||
<New class="org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory">
|
<New class="org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory">
|
||||||
<Arg name="config"><Ref refid="httpConfig"/></Arg>
|
<Arg name="config"><Ref refid="httpConfig"/></Arg>
|
||||||
<Set name="maxConcurrentStreams"><Property name="jetty.http2c.maxConcurrentStreams" deprecated="http2.maxConcurrentStreams" default="1024"/></Set>
|
<Set name="maxConcurrentStreams"><Property name="jetty.http2c.maxConcurrentStreams" deprecated="http2.maxConcurrentStreams" default="1024"/></Set>
|
||||||
<Set name="initialStreamSendWindow"><Property name="jetty.http2c.initialStreamSendWindow" default="65535"/></Set>
|
<Set name="initialStreamRecvWindow"><Property name="jetty.http2c.initialStreamRecvWindow" default="65535"/></Set>
|
||||||
</New>
|
</New>
|
||||||
</Arg>
|
</Arg>
|
||||||
</Call>
|
</Call>
|
||||||
</Configure>
|
</Configure>
|
||||||
|
|
||||||
|
|
|
@ -16,5 +16,5 @@ etc/jetty-http2.xml
|
||||||
## Max number of concurrent streams per connection
|
## Max number of concurrent streams per connection
|
||||||
# jetty.http2.maxConcurrentStreams=1024
|
# jetty.http2.maxConcurrentStreams=1024
|
||||||
|
|
||||||
## Initial stream send (server to client) window
|
## Initial stream receive window (client to server)
|
||||||
# jetty.http2.initialStreamSendWindow=65535
|
# jetty.http2.initialStreamRecvWindow=65535
|
||||||
|
|
|
@ -15,5 +15,5 @@ etc/jetty-http2c.xml
|
||||||
## Max number of concurrent streams per connection
|
## Max number of concurrent streams per connection
|
||||||
# jetty.http2c.maxConcurrentStreams=1024
|
# jetty.http2c.maxConcurrentStreams=1024
|
||||||
|
|
||||||
## Initial stream send (server to client) window
|
## Initial stream receive window (client to server)
|
||||||
# jetty.http2c.initialStreamSendWindow=65535
|
# jetty.http2c.initialStreamRecvWindow=65535
|
||||||
|
|
|
@ -54,7 +54,6 @@ import org.eclipse.jetty.server.Server;
|
||||||
import org.eclipse.jetty.server.ServerConnector;
|
import org.eclipse.jetty.server.ServerConnector;
|
||||||
import org.eclipse.jetty.server.handler.ContextHandler;
|
import org.eclipse.jetty.server.handler.ContextHandler;
|
||||||
import org.eclipse.jetty.server.handler.ContextHandler.Context;
|
import org.eclipse.jetty.server.handler.ContextHandler.Context;
|
||||||
import org.eclipse.jetty.toolchain.test.AdvancedRunner;
|
|
||||||
import org.eclipse.jetty.toolchain.test.http.SimpleHttpParser;
|
import org.eclipse.jetty.toolchain.test.http.SimpleHttpParser;
|
||||||
import org.eclipse.jetty.toolchain.test.http.SimpleHttpResponse;
|
import org.eclipse.jetty.toolchain.test.http.SimpleHttpResponse;
|
||||||
import org.eclipse.jetty.util.IO;
|
import org.eclipse.jetty.util.IO;
|
||||||
|
@ -63,7 +62,6 @@ import org.hamcrest.Matchers;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.containsString;
|
import static org.hamcrest.Matchers.containsString;
|
||||||
import static org.hamcrest.Matchers.instanceOf;
|
import static org.hamcrest.Matchers.instanceOf;
|
||||||
|
@ -73,21 +71,19 @@ import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertThat;
|
import static org.junit.Assert.assertThat;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
@RunWith (AdvancedRunner.class)
|
|
||||||
public class AsyncIOServletTest
|
public class AsyncIOServletTest
|
||||||
{
|
{
|
||||||
private Server server;
|
private Server server;
|
||||||
private ServerConnector connector;
|
private ServerConnector connector;
|
||||||
private LocalConnector local;
|
private LocalConnector local;
|
||||||
private ServletContextHandler context;
|
|
||||||
private String path = "/path";
|
private String path = "/path";
|
||||||
private static final ThreadLocal<Throwable> scope = new ThreadLocal<>();
|
private static final ThreadLocal<Throwable> scope = new ThreadLocal<>();
|
||||||
|
|
||||||
public void startServer(HttpServlet servlet) throws Exception
|
public void startServer(HttpServlet servlet) throws Exception
|
||||||
{
|
{
|
||||||
startServer(servlet,30000);
|
startServer(servlet, 30000);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void startServer(HttpServlet servlet, long idleTimeout) throws Exception
|
public void startServer(HttpServlet servlet, long idleTimeout) throws Exception
|
||||||
{
|
{
|
||||||
server = new Server();
|
server = new Server();
|
||||||
|
@ -98,7 +94,7 @@ public class AsyncIOServletTest
|
||||||
local = new LocalConnector(server);
|
local = new LocalConnector(server);
|
||||||
server.addConnector(local);
|
server.addConnector(local);
|
||||||
|
|
||||||
context = new ServletContextHandler(server, "/", false, false);
|
ServletContextHandler context = new ServletContextHandler(server, "/", false, false);
|
||||||
ServletHolder holder = new ServletHolder(servlet);
|
ServletHolder holder = new ServletHolder(servlet);
|
||||||
holder.setAsyncSupported(true);
|
holder.setAsyncSupported(true);
|
||||||
context.addServlet(holder, path);
|
context.addServlet(holder, path);
|
||||||
|
@ -108,18 +104,19 @@ public class AsyncIOServletTest
|
||||||
@Override
|
@Override
|
||||||
public void enterScope(Context context, Request request, Object reason)
|
public void enterScope(Context context, Request request, Object reason)
|
||||||
{
|
{
|
||||||
if (scope.get()!=null)
|
if (scope.get() != null)
|
||||||
{
|
{
|
||||||
System.err.println(Thread.currentThread()+" Already entered scope!!!");
|
System.err.println(Thread.currentThread() + " Already entered scope!!!");
|
||||||
scope.get().printStackTrace();
|
scope.get().printStackTrace();
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
scope.set(new Throwable());
|
scope.set(new Throwable());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void exitScope(Context context, Request request)
|
public void exitScope(Context context, Request request)
|
||||||
{
|
{
|
||||||
if (scope.get()==null)
|
if (scope.get() == null)
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
scope.set(null);
|
scope.set(null);
|
||||||
}
|
}
|
||||||
|
@ -130,7 +127,7 @@ public class AsyncIOServletTest
|
||||||
|
|
||||||
private static void assertScope()
|
private static void assertScope()
|
||||||
{
|
{
|
||||||
if (scope.get()==null)
|
if (scope.get() == null)
|
||||||
Assert.fail("Not in scope");
|
Assert.fail("Not in scope");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,7 +135,7 @@ public class AsyncIOServletTest
|
||||||
public void stopServer() throws Exception
|
public void stopServer() throws Exception
|
||||||
{
|
{
|
||||||
server.stop();
|
server.stop();
|
||||||
if (scope.get()!=null)
|
if (scope.get() != null)
|
||||||
{
|
{
|
||||||
System.err.println("Still in scope after stop!");
|
System.err.println("Still in scope after stop!");
|
||||||
scope.get().printStackTrace();
|
scope.get().printStackTrace();
|
||||||
|
@ -192,8 +189,8 @@ public class AsyncIOServletTest
|
||||||
public void onError(Throwable t)
|
public void onError(Throwable t)
|
||||||
{
|
{
|
||||||
assertScope();
|
assertScope();
|
||||||
Assert.assertThat("onError type",t,instanceOf(throwable.getClass()));
|
Assert.assertThat("onError type", t, instanceOf(throwable.getClass()));
|
||||||
Assert.assertThat("onError message",t.getMessage(),is(throwable.getMessage()));
|
Assert.assertThat("onError message", t.getMessage(), is(throwable.getMessage()));
|
||||||
latch.countDown();
|
latch.countDown();
|
||||||
response.setStatus(500);
|
response.setStatus(500);
|
||||||
|
|
||||||
|
@ -218,13 +215,13 @@ public class AsyncIOServletTest
|
||||||
output.flush();
|
output.flush();
|
||||||
|
|
||||||
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
||||||
String line=in.readLine();
|
String line = in.readLine();
|
||||||
assertThat(line, containsString("500 Server Error"));
|
assertThat(line, containsString("500 Server Error"));
|
||||||
while (line.length()>0)
|
while (line.length() > 0)
|
||||||
{
|
{
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
}
|
}
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
|
|
||||||
assertTrue(latch.await(5, TimeUnit.SECONDS));
|
assertTrue(latch.await(5, TimeUnit.SECONDS));
|
||||||
}
|
}
|
||||||
|
@ -270,7 +267,7 @@ public class AsyncIOServletTest
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},1000);
|
}, 1000);
|
||||||
|
|
||||||
String data1 = "0123456789";
|
String data1 = "0123456789";
|
||||||
String data2 = "ABCDEF";
|
String data2 = "ABCDEF";
|
||||||
|
@ -308,13 +305,13 @@ public class AsyncIOServletTest
|
||||||
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
|
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
|
||||||
{
|
{
|
||||||
assertScope();
|
assertScope();
|
||||||
if (request.getDispatcherType()==DispatcherType.ERROR)
|
if (request.getDispatcherType() == DispatcherType.ERROR)
|
||||||
{
|
{
|
||||||
response.flushBuffer();
|
response.flushBuffer();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final AsyncContext asyncContext = request.startAsync(request, response);
|
request.startAsync(request, response);
|
||||||
request.getInputStream().setReadListener(new ReadListener()
|
request.getInputStream().setReadListener(new ReadListener()
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
|
@ -335,7 +332,10 @@ public class AsyncIOServletTest
|
||||||
{
|
{
|
||||||
assertScope();
|
assertScope();
|
||||||
errors.incrementAndGet();
|
errors.incrementAndGet();
|
||||||
throw new NullPointerException("explicitly_thrown_by_test_2"){{this.initCause(t);}};
|
throw new NullPointerException("explicitly_thrown_by_test_2")
|
||||||
|
{{
|
||||||
|
this.initCause(t);
|
||||||
|
}};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -435,8 +435,8 @@ public class AsyncIOServletTest
|
||||||
{
|
{
|
||||||
final CountDownLatch latch = new CountDownLatch(1);
|
final CountDownLatch latch = new CountDownLatch(1);
|
||||||
String text = "Now is the winter of our discontent. How Now Brown Cow. The quick brown fox jumped over the lazy dog.\n";
|
String text = "Now is the winter of our discontent. How Now Brown Cow. The quick brown fox jumped over the lazy dog.\n";
|
||||||
for (int i=0;i<10;i++)
|
for (int i = 0; i < 10; i++)
|
||||||
text=text+text;
|
text = text + text;
|
||||||
final byte[] data = text.getBytes(StandardCharsets.ISO_8859_1);
|
final byte[] data = text.getBytes(StandardCharsets.ISO_8859_1);
|
||||||
|
|
||||||
startServer(new HttpServlet()
|
startServer(new HttpServlet()
|
||||||
|
@ -462,11 +462,11 @@ public class AsyncIOServletTest
|
||||||
Thread.sleep(100);
|
Thread.sleep(100);
|
||||||
out.write(data);
|
out.write(data);
|
||||||
}
|
}
|
||||||
catch(IOException e)
|
catch (IOException e)
|
||||||
{
|
{
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
catch(Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -495,13 +495,13 @@ public class AsyncIOServletTest
|
||||||
output.flush();
|
output.flush();
|
||||||
|
|
||||||
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
||||||
String line=in.readLine();
|
String line = in.readLine();
|
||||||
assertThat(line, containsString("200 OK"));
|
assertThat(line, containsString("200 OK"));
|
||||||
while (line.length()>0)
|
while (line.length() > 0)
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
assertThat(line, not(containsString(" ")));
|
assertThat(line, not(containsString(" ")));
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
assertThat(line, containsString("discontent. How Now Brown Cow. The "));
|
assertThat(line, containsString("discontent. How Now Brown Cow. The "));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -530,9 +530,9 @@ public class AsyncIOServletTest
|
||||||
|
|
||||||
in.setReadListener(new ReadListener()
|
in.setReadListener(new ReadListener()
|
||||||
{
|
{
|
||||||
transient int _i=0;
|
transient int _i = 0;
|
||||||
transient boolean _minusOne=false;;
|
transient boolean _minusOne = false;
|
||||||
transient boolean _finished=false;;
|
transient boolean _finished = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onError(Throwable t)
|
public void onError(Throwable t)
|
||||||
|
@ -546,24 +546,24 @@ public class AsyncIOServletTest
|
||||||
public void onDataAvailable() throws IOException
|
public void onDataAvailable() throws IOException
|
||||||
{
|
{
|
||||||
assertScope();
|
assertScope();
|
||||||
while(in.isReady() && !in.isFinished())
|
while (in.isReady() && !in.isFinished())
|
||||||
{
|
{
|
||||||
int b = in.read();
|
int b = in.read();
|
||||||
if (b==-1)
|
if (b == -1)
|
||||||
_minusOne=true;
|
_minusOne = true;
|
||||||
else if (data[_i++]!=b)
|
else if (data[_i++] != b)
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in.isFinished())
|
if (in.isFinished())
|
||||||
_finished=true;
|
_finished = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onAllDataRead() throws IOException
|
public void onAllDataRead() throws IOException
|
||||||
{
|
{
|
||||||
assertScope();
|
assertScope();
|
||||||
out.write(String.format("i=%d eof=%b finished=%b",_i,_minusOne,_finished).getBytes(StandardCharsets.ISO_8859_1));
|
out.write(String.format("i=%d eof=%b finished=%b", _i, _minusOne, _finished).getBytes(StandardCharsets.ISO_8859_1));
|
||||||
async.complete();
|
async.complete();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -572,8 +572,8 @@ public class AsyncIOServletTest
|
||||||
|
|
||||||
String request = "GET " + path + " HTTP/1.1\r\n" +
|
String request = "GET " + path + " HTTP/1.1\r\n" +
|
||||||
"Host: localhost:" + connector.getLocalPort() + "\r\n" +
|
"Host: localhost:" + connector.getLocalPort() + "\r\n" +
|
||||||
"Content-Type: text/plain\r\n"+
|
"Content-Type: text/plain\r\n" +
|
||||||
"Content-Length: "+data.length+"\r\n" +
|
"Content-Length: " + data.length + "\r\n" +
|
||||||
"Connection: close\r\n" +
|
"Connection: close\r\n" +
|
||||||
"\r\n";
|
"\r\n";
|
||||||
|
|
||||||
|
@ -586,12 +586,12 @@ public class AsyncIOServletTest
|
||||||
output.flush();
|
output.flush();
|
||||||
|
|
||||||
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
||||||
String line=in.readLine();
|
String line = in.readLine();
|
||||||
assertThat(line, containsString("200 OK"));
|
assertThat(line, containsString("200 OK"));
|
||||||
while (line.length()>0)
|
while (line.length() > 0)
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
assertThat(line, containsString("i="+data.length+" eof=true finished=true"));
|
assertThat(line, containsString("i=" + data.length + " eof=true finished=true"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -634,14 +634,14 @@ public class AsyncIOServletTest
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
if (!in.isReady())
|
if (!in.isReady())
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
if (in.read()!='X')
|
if (in.read() != 'X')
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
if (!in.isReady())
|
if (!in.isReady())
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
if (in.read()!=-1)
|
if (in.read() != -1)
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
}
|
}
|
||||||
catch(Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
@ -660,8 +660,8 @@ public class AsyncIOServletTest
|
||||||
|
|
||||||
String request = "GET " + path + " HTTP/1.1\r\n" +
|
String request = "GET " + path + " HTTP/1.1\r\n" +
|
||||||
"Host: localhost:" + connector.getLocalPort() + "\r\n" +
|
"Host: localhost:" + connector.getLocalPort() + "\r\n" +
|
||||||
"Content-Type: text/plain\r\n"+
|
"Content-Type: text/plain\r\n" +
|
||||||
"Content-Length: "+data.length+"\r\n" +
|
"Content-Length: " + data.length + "\r\n" +
|
||||||
"Connection: close\r\n" +
|
"Connection: close\r\n" +
|
||||||
"\r\n";
|
"\r\n";
|
||||||
|
|
||||||
|
@ -676,11 +676,11 @@ public class AsyncIOServletTest
|
||||||
output.flush();
|
output.flush();
|
||||||
|
|
||||||
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
||||||
String line=in.readLine();
|
String line = in.readLine();
|
||||||
assertThat(line, containsString("200 OK"));
|
assertThat(line, containsString("200 OK"));
|
||||||
while (line.length()>0)
|
while (line.length() > 0)
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
assertThat(line, containsString("OK"));
|
assertThat(line, containsString("OK"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -704,7 +704,7 @@ public class AsyncIOServletTest
|
||||||
final ServletInputStream in = request.getInputStream();
|
final ServletInputStream in = request.getInputStream();
|
||||||
final ServletOutputStream out = response.getOutputStream();
|
final ServletOutputStream out = response.getOutputStream();
|
||||||
|
|
||||||
if (request.getDispatcherType()==DispatcherType.ERROR)
|
if (request.getDispatcherType() == DispatcherType.ERROR)
|
||||||
throw new IllegalStateException();
|
throw new IllegalStateException();
|
||||||
|
|
||||||
in.setReadListener(new ReadListener()
|
in.setReadListener(new ReadListener()
|
||||||
|
@ -721,28 +721,24 @@ public class AsyncIOServletTest
|
||||||
public void onDataAvailable() throws IOException
|
public void onDataAvailable() throws IOException
|
||||||
{
|
{
|
||||||
assertScope();
|
assertScope();
|
||||||
async.start(
|
async.start(() ->
|
||||||
new Runnable()
|
|
||||||
{
|
{
|
||||||
public void run()
|
assertScope();
|
||||||
|
try
|
||||||
{
|
{
|
||||||
assertScope();
|
Thread.sleep(1000);
|
||||||
try
|
if (!in.isReady())
|
||||||
{
|
throw new IllegalStateException();
|
||||||
Thread.sleep(1000);
|
if (in.read() != 'X')
|
||||||
if (!in.isReady())
|
throw new IllegalStateException();
|
||||||
throw new IllegalStateException();
|
if (!in.isReady())
|
||||||
if (in.read()!='X')
|
throw new IllegalStateException();
|
||||||
throw new IllegalStateException();
|
if (in.read() != -1)
|
||||||
if (!in.isReady())
|
throw new IllegalStateException();
|
||||||
throw new IllegalStateException();
|
}
|
||||||
if (in.read()!=-1)
|
catch (Exception e)
|
||||||
throw new IllegalStateException();
|
{
|
||||||
}
|
e.printStackTrace();
|
||||||
catch(Exception e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -759,8 +755,8 @@ public class AsyncIOServletTest
|
||||||
|
|
||||||
String request = "GET " + path + " HTTP/1.1\r\n" +
|
String request = "GET " + path + " HTTP/1.1\r\n" +
|
||||||
"Host: localhost:" + connector.getLocalPort() + "\r\n" +
|
"Host: localhost:" + connector.getLocalPort() + "\r\n" +
|
||||||
"Content-Type: text/plain\r\n"+
|
"Content-Type: text/plain\r\n" +
|
||||||
"Content-Length: "+data.length+"\r\n" +
|
"Content-Length: " + data.length + "\r\n" +
|
||||||
"Connection: close\r\n" +
|
"Connection: close\r\n" +
|
||||||
"\r\n";
|
"\r\n";
|
||||||
|
|
||||||
|
@ -775,11 +771,11 @@ public class AsyncIOServletTest
|
||||||
output.flush();
|
output.flush();
|
||||||
|
|
||||||
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
||||||
String line=in.readLine();
|
String line = in.readLine();
|
||||||
assertThat(line, containsString("200 OK"));
|
assertThat(line, containsString("200 OK"));
|
||||||
while (line.length()>0)
|
while (line.length() > 0)
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
assertThat(line, containsString("OK"));
|
assertThat(line, containsString("OK"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -820,7 +816,7 @@ public class AsyncIOServletTest
|
||||||
while (in.isReady())
|
while (in.isReady())
|
||||||
{
|
{
|
||||||
int b = in.read();
|
int b = in.read();
|
||||||
if (b<0)
|
if (b < 0)
|
||||||
{
|
{
|
||||||
out.write("OK\n".getBytes(StandardCharsets.ISO_8859_1));
|
out.write("OK\n".getBytes(StandardCharsets.ISO_8859_1));
|
||||||
async.complete();
|
async.complete();
|
||||||
|
@ -843,8 +839,8 @@ public class AsyncIOServletTest
|
||||||
|
|
||||||
String request = "GET " + path + " HTTP/1.1\r\n" +
|
String request = "GET " + path + " HTTP/1.1\r\n" +
|
||||||
"Host: localhost:" + connector.getLocalPort() + "\r\n" +
|
"Host: localhost:" + connector.getLocalPort() + "\r\n" +
|
||||||
"Content-Type: text/plain\r\n"+
|
"Content-Type: text/plain\r\n" +
|
||||||
"Content-Length: "+data.length+"\r\n" +
|
"Content-Length: " + data.length + "\r\n" +
|
||||||
"Connection: close\r\n" +
|
"Connection: close\r\n" +
|
||||||
"\r\n";
|
"\r\n";
|
||||||
|
|
||||||
|
@ -858,13 +854,13 @@ public class AsyncIOServletTest
|
||||||
output.flush();
|
output.flush();
|
||||||
|
|
||||||
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
|
||||||
String line=in.readLine();
|
String line = in.readLine();
|
||||||
assertThat(line, containsString("200 OK"));
|
assertThat(line, containsString("200 OK"));
|
||||||
while (line.length()>0)
|
while (line.length() > 0)
|
||||||
{
|
{
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
}
|
}
|
||||||
line=in.readLine();
|
line = in.readLine();
|
||||||
assertThat(line, containsString("OK"));
|
assertThat(line, containsString("OK"));
|
||||||
Assert.assertFalse(allDataRead.get());
|
Assert.assertFalse(allDataRead.get());
|
||||||
}
|
}
|
||||||
|
@ -926,7 +922,7 @@ public class AsyncIOServletTest
|
||||||
output.flush();
|
output.flush();
|
||||||
|
|
||||||
String response = IO.toString(client.getInputStream());
|
String response = IO.toString(client.getInputStream());
|
||||||
assertThat(response,containsString(" 200 OK"));
|
assertThat(response, containsString(" 200 OK"));
|
||||||
// wait for onAllDataRead BEFORE closing client
|
// wait for onAllDataRead BEFORE closing client
|
||||||
latch.await();
|
latch.await();
|
||||||
}
|
}
|
||||||
|
@ -990,7 +986,7 @@ public class AsyncIOServletTest
|
||||||
@Override
|
@Override
|
||||||
public void onWritePossible() throws IOException
|
public void onWritePossible() throws IOException
|
||||||
{
|
{
|
||||||
if (writeLatch.getCount()==0)
|
if (writeLatch.getCount() == 0)
|
||||||
asyncContext.complete();
|
asyncContext.complete();
|
||||||
else
|
else
|
||||||
writeLatch.countDown();
|
writeLatch.countDown();
|
||||||
|
@ -1013,7 +1009,7 @@ public class AsyncIOServletTest
|
||||||
"Host: localhost:" + connector.getLocalPort() + "\r\n" +
|
"Host: localhost:" + connector.getLocalPort() + "\r\n" +
|
||||||
"Transfer-Encoding: chunked\r\n" +
|
"Transfer-Encoding: chunked\r\n" +
|
||||||
"\r\n" +
|
"\r\n" +
|
||||||
Integer.toHexString(content.length())+"\r\n" +
|
Integer.toHexString(content.length()) + "\r\n" +
|
||||||
content + "\r\n";
|
content + "\r\n";
|
||||||
endp.addInput(ByteBuffer.wrap(request.getBytes("UTF-8")));
|
endp.addInput(ByteBuffer.wrap(request.getBytes("UTF-8")));
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
<New class="org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory">
|
<New class="org.eclipse.jetty.http2.server.HTTP2CServerConnectionFactory">
|
||||||
<Arg name="config"><Ref refid="unixSocketHttpConfig"/></Arg>
|
<Arg name="config"><Ref refid="unixSocketHttpConfig"/></Arg>
|
||||||
<Set name="maxConcurrentStreams"><Property name="jetty.http2c.maxConcurrentStreams" default="1024"/></Set>
|
<Set name="maxConcurrentStreams"><Property name="jetty.http2c.maxConcurrentStreams" default="1024"/></Set>
|
||||||
<Set name="initialStreamSendWindow"><Property name="jetty.http2c.initialStreamSendWindow" default="65535"/></Set>
|
<Set name="initialStreamRecvWindow"><Property name="jetty.http2c.initialStreamRecvWindow" default="65535"/></Set>
|
||||||
</New>
|
</New>
|
||||||
</Arg>
|
</Arg>
|
||||||
</Call>
|
</Call>
|
||||||
|
|
|
@ -16,6 +16,5 @@ etc/jetty-unixsocket-http2c.xml
|
||||||
## Max number of concurrent streams per connection
|
## Max number of concurrent streams per connection
|
||||||
# jetty.http2.maxConcurrentStreams=1024
|
# jetty.http2.maxConcurrentStreams=1024
|
||||||
|
|
||||||
## Initial stream send (server to client) window
|
## Initial stream receive window (client to server)
|
||||||
# jetty.http2.initialStreamSendWindow=65535
|
# jetty.http2.initialStreamRecvWindow=65535
|
||||||
|
|
||||||
|
|
|
@ -27,8 +27,6 @@ import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
import org.eclipse.jetty.client.api.Request;
|
import org.eclipse.jetty.client.api.Request;
|
||||||
import org.eclipse.jetty.client.api.Response;
|
|
||||||
import org.eclipse.jetty.client.api.Result;
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Assume;
|
import org.junit.Assume;
|
||||||
import org.junit.Ignore;
|
import org.junit.Ignore;
|
||||||
|
@ -51,21 +49,17 @@ public class HttpClientConnectTimeoutTest extends AbstractTest
|
||||||
int connectTimeout = 1000;
|
int connectTimeout = 1000;
|
||||||
assumeConnectTimeout(host, port, connectTimeout);
|
assumeConnectTimeout(host, port, connectTimeout);
|
||||||
|
|
||||||
start(null);
|
start(new EmptyServerHandler());
|
||||||
client.stop();
|
client.stop();
|
||||||
client.setConnectTimeout(connectTimeout);
|
client.setConnectTimeout(connectTimeout);
|
||||||
client.start();
|
client.start();
|
||||||
|
|
||||||
final CountDownLatch latch = new CountDownLatch(1);
|
final CountDownLatch latch = new CountDownLatch(1);
|
||||||
Request request = client.newRequest(host, port);
|
Request request = client.newRequest(host, port);
|
||||||
request.send(new Response.CompleteListener()
|
request.send(result ->
|
||||||
{
|
{
|
||||||
@Override
|
if (result.isFailed())
|
||||||
public void onComplete(Result result)
|
latch.countDown();
|
||||||
{
|
|
||||||
if (result.isFailed())
|
|
||||||
latch.countDown();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Assert.assertTrue(latch.await(2 * connectTimeout, TimeUnit.MILLISECONDS));
|
Assert.assertTrue(latch.await(2 * connectTimeout, TimeUnit.MILLISECONDS));
|
||||||
|
@ -80,7 +74,7 @@ public class HttpClientConnectTimeoutTest extends AbstractTest
|
||||||
int connectTimeout = 2000;
|
int connectTimeout = 2000;
|
||||||
assumeConnectTimeout(host, port, connectTimeout);
|
assumeConnectTimeout(host, port, connectTimeout);
|
||||||
|
|
||||||
start(null);
|
start(new EmptyServerHandler());
|
||||||
client.stop();
|
client.stop();
|
||||||
client.setConnectTimeout(connectTimeout);
|
client.setConnectTimeout(connectTimeout);
|
||||||
client.start();
|
client.start();
|
||||||
|
@ -89,14 +83,10 @@ public class HttpClientConnectTimeoutTest extends AbstractTest
|
||||||
final CountDownLatch latch = new CountDownLatch(2);
|
final CountDownLatch latch = new CountDownLatch(2);
|
||||||
Request request = client.newRequest(host, port);
|
Request request = client.newRequest(host, port);
|
||||||
request.timeout(connectTimeout / 2, TimeUnit.MILLISECONDS)
|
request.timeout(connectTimeout / 2, TimeUnit.MILLISECONDS)
|
||||||
.send(new Response.CompleteListener()
|
.send(result ->
|
||||||
{
|
{
|
||||||
@Override
|
completes.incrementAndGet();
|
||||||
public void onComplete(Result result)
|
latch.countDown();
|
||||||
{
|
|
||||||
completes.incrementAndGet();
|
|
||||||
latch.countDown();
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Assert.assertFalse(latch.await(2 * connectTimeout, TimeUnit.MILLISECONDS));
|
Assert.assertFalse(latch.await(2 * connectTimeout, TimeUnit.MILLISECONDS));
|
||||||
|
@ -112,31 +102,23 @@ public class HttpClientConnectTimeoutTest extends AbstractTest
|
||||||
int connectTimeout = 1000;
|
int connectTimeout = 1000;
|
||||||
assumeConnectTimeout(host, port, connectTimeout);
|
assumeConnectTimeout(host, port, connectTimeout);
|
||||||
|
|
||||||
start(null);
|
start(new EmptyServerHandler());
|
||||||
client.stop();
|
client.stop();
|
||||||
client.setConnectTimeout(connectTimeout);
|
client.setConnectTimeout(connectTimeout);
|
||||||
client.start();
|
client.start();
|
||||||
|
|
||||||
final CountDownLatch latch = new CountDownLatch(1);
|
final CountDownLatch latch = new CountDownLatch(1);
|
||||||
Request request = client.newRequest(host, port);
|
Request request = client.newRequest(host, port);
|
||||||
request.send(new Response.CompleteListener()
|
request.send(result1 ->
|
||||||
{
|
{
|
||||||
@Override
|
if (result1.isFailed())
|
||||||
public void onComplete(Result result)
|
|
||||||
{
|
{
|
||||||
if (result.isFailed())
|
// Retry
|
||||||
|
client.newRequest(host, port).send(result2 ->
|
||||||
{
|
{
|
||||||
// Retry
|
if (result2.isFailed())
|
||||||
client.newRequest(host, port).send(new Response.CompleteListener()
|
latch.countDown();
|
||||||
{
|
});
|
||||||
@Override
|
|
||||||
public void onComplete(Result result)
|
|
||||||
{
|
|
||||||
if (result.isFailed())
|
|
||||||
latch.countDown();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue