1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.apache.hc.client5.http.protocol;
28
29 import org.apache.hc.client5.http.HttpRoute;
30 import org.apache.hc.client5.http.RouteInfo.LayerType;
31 import org.apache.hc.client5.http.RouteInfo.TunnelType;
32 import org.apache.hc.core5.http.Header;
33 import org.apache.hc.core5.http.HeaderElements;
34 import org.apache.hc.core5.http.HttpHeaders;
35 import org.apache.hc.core5.http.HttpHost;
36 import org.apache.hc.core5.http.HttpRequest;
37 import org.apache.hc.core5.http.HttpRequestInterceptor;
38 import org.apache.hc.core5.http.message.BasicHttpRequest;
39 import org.junit.jupiter.api.Assertions;
40 import org.junit.jupiter.api.Test;
41
42 class TestRequestClientConnControl {
43
44 @Test
45 void testRequestParameterCheck() {
46 final HttpClientContext context = HttpClientContext.create();
47 final HttpRequestInterceptor interceptor = new RequestClientConnControl();
48 Assertions.assertThrows(NullPointerException.class, () ->
49 interceptor.process(null, null, context));
50 }
51
52 @Test
53 void testConnectionKeepAliveForConnectRequest() throws Exception {
54 final HttpRequest request = new BasicHttpRequest("CONNECT", "www.somedomain.com");
55 final HttpClientContext context = HttpClientContext.create();
56
57 final HttpRequestInterceptor interceptor = new RequestClientConnControl();
58 interceptor.process(request, null, context);
59 final Header header = request.getFirstHeader(HttpHeaders.CONNECTION);
60 Assertions.assertNull(header);
61 }
62
63 @Test
64 void testConnectionKeepAliveForDirectRequests() throws Exception {
65 final HttpRequest request = new BasicHttpRequest("GET", "/");
66 final HttpClientContext context = HttpClientContext.create();
67
68 final HttpHost target = new HttpHost("http", "localhost", 80);
69 final HttpRoute route = new HttpRoute(target, null, false);
70
71 context.setRoute(route);
72
73 final HttpRequestInterceptor interceptor = new RequestClientConnControl();
74 interceptor.process(request, null, context);
75
76 final Header header = request.getFirstHeader(HttpHeaders.CONNECTION);
77 Assertions.assertNotNull(header);
78 Assertions.assertEquals(HeaderElements.KEEP_ALIVE, header.getValue());
79 }
80
81 @Test
82 void testConnectionKeepAliveForTunneledRequests() throws Exception {
83 final HttpRequest request = new BasicHttpRequest("GET", "/");
84 final HttpClientContext context = HttpClientContext.create();
85
86 final HttpHost target = new HttpHost("https", "localhost", 443);
87 final HttpHost proxy = new HttpHost("localhost", 8080);
88 final HttpRoute route = new HttpRoute(target, null, proxy, true,
89 TunnelType.TUNNELLED, LayerType.LAYERED);
90
91 context.setRoute(route);
92
93 final HttpRequestInterceptor interceptor = new RequestClientConnControl();
94 interceptor.process(request, null, context);
95
96 final Header header = request.getFirstHeader(HttpHeaders.CONNECTION);
97 Assertions.assertNotNull(header);
98 Assertions.assertEquals(HeaderElements.KEEP_ALIVE, header.getValue());
99 }
100
101 @Test
102 void testProxyConnectionKeepAliveForRequestsOverProxy() throws Exception {
103 final HttpRequest request = new BasicHttpRequest("GET", "/");
104 final HttpClientContext context = HttpClientContext.create();
105
106 final HttpHost target = new HttpHost("http", "localhost", 80);
107 final HttpHost proxy = new HttpHost("localhost", 8080);
108 final HttpRoute route = new HttpRoute(target, null, proxy, false,
109 TunnelType.PLAIN, LayerType.PLAIN);
110
111 context.setRoute(route);
112
113 final HttpRequestInterceptor interceptor = new RequestClientConnControl();
114 interceptor.process(request, null, context);
115
116 final Header header = request.getFirstHeader(HttpHeaders.CONNECTION);
117 Assertions.assertNull(header);
118 }
119
120 @Test
121 void testPreserveCustomConnectionHeader() throws Exception {
122 final HttpRequest request = new BasicHttpRequest("GET", "/");
123 request.addHeader(HttpHeaders.CONNECTION, HeaderElements.CLOSE);
124 final HttpClientContext context = HttpClientContext.create();
125
126 final HttpHost target = new HttpHost("https", "localhost", 443);
127 final HttpHost proxy = new HttpHost("localhost", 8080);
128 final HttpRoute route = new HttpRoute(target, null, proxy, true,
129 TunnelType.TUNNELLED, LayerType.LAYERED);
130
131 context.setRoute(route);
132
133 final HttpRequestInterceptor interceptor = new RequestClientConnControl();
134 interceptor.process(request, null, context);
135
136 final Header header = request.getFirstHeader(HttpHeaders.CONNECTION);
137 Assertions.assertNotNull(header);
138 Assertions.assertEquals(HeaderElements.CLOSE, header.getValue());
139 }
140
141 }