1
2
3
4
5
6
7
8
9
10
11 package org.mule.transport.http.functional;
12
13 import static org.junit.Assert.assertEquals;
14 import static org.junit.Assert.assertNotNull;
15
16 import org.mule.api.endpoint.InboundEndpoint;
17 import org.mule.module.client.MuleClient;
18 import org.mule.tck.AbstractServiceAndFlowTestCase;
19 import org.mule.tck.junit4.rule.DynamicPort;
20 import org.mule.transport.http.HttpConstants;
21
22 import java.util.Arrays;
23 import java.util.Collection;
24
25 import org.apache.commons.httpclient.Header;
26 import org.apache.commons.httpclient.HttpClient;
27 import org.apache.commons.httpclient.HttpMethod;
28 import org.apache.commons.httpclient.HttpStatus;
29 import org.apache.commons.httpclient.HttpVersion;
30 import org.apache.commons.httpclient.methods.GetMethod;
31 import org.apache.commons.httpclient.params.HttpClientParams;
32 import org.junit.Rule;
33 import org.junit.Test;
34 import org.junit.runners.Parameterized.Parameters;
35
36
37
38
39 public class HttpKeepAliveFunctionalTestCase extends AbstractServiceAndFlowTestCase
40 {
41
42 private HttpClient http10Client;
43 private HttpClient http11Client;
44 private MuleClient client = null;
45
46 @Rule
47 public DynamicPort dynamicPort1 = new DynamicPort("port1");
48
49 @Rule
50 public DynamicPort dynamicPort2 = new DynamicPort("port2");
51
52 public HttpKeepAliveFunctionalTestCase(ConfigVariant variant, String configResources)
53 {
54 super(variant, configResources);
55 }
56
57 @Parameters
58 public static Collection<Object[]> parameters()
59 {
60 return Arrays.asList(new Object[][]{
61 {ConfigVariant.SERVICE, "http-keep-alive-config-service.xml"},
62 {ConfigVariant.FLOW, "http-keep-alive-config-flow.xml"}
63 });
64 }
65
66 @Override
67 protected void doSetUp() throws Exception
68 {
69 super.doSetUp();
70
71 http10Client = setupHttpClient(HttpVersion.HTTP_1_0);
72 http11Client = setupHttpClient(HttpVersion.HTTP_1_1);
73 client = new MuleClient(muleContext);
74 }
75
76 private HttpClient setupHttpClient(HttpVersion version)
77 {
78 HttpClientParams params = new HttpClientParams();
79 params.setVersion(version);
80 return new HttpClient(params);
81 }
82
83 @Test
84 public void testHttp10WithoutConnectionHeader() throws Exception
85 {
86 GetMethod request = new GetMethod(((InboundEndpoint) client.getMuleContext().getRegistry().lookupObject("inWithoutEndpointOverride")).getAddress());
87 request.removeRequestHeader(HttpConstants.HEADER_CONNECTION);
88 runHttp10MethodAndAssertConnectionHeader(request, "close");
89 }
90
91 @Test
92 public void testHttp10WithCloseConnectionHeader() throws Exception
93 {
94 GetMethod request = new GetMethod(((InboundEndpoint) client.getMuleContext().getRegistry().lookupObject("inWithoutEndpointOverride")).getAddress());
95 request.setRequestHeader(HttpConstants.HEADER_CONNECTION, "close");
96 runHttp10MethodAndAssertConnectionHeader(request, "close");
97 }
98
99 @Test
100 public void testHttp10KeepAlive() throws Exception
101 {
102 doTestKeepAlive(((InboundEndpoint) client.getMuleContext().getRegistry().lookupObject("inWithoutEndpointOverride")).getAddress());
103 }
104
105 @Test
106 public void testHttp10KeepAliveWitEpOverride() throws Exception
107 {
108 doTestKeepAlive(((InboundEndpoint) client.getMuleContext().getRegistry().lookupObject("inWithoutEndpointOverride")).getAddress());
109 }
110
111 private void doTestKeepAlive(String url) throws Exception
112 {
113 GetMethod request = new GetMethod(url);
114 request.addRequestHeader(HttpConstants.HEADER_CONNECTION, "Keep-Alive");
115 runHttp10MethodAndAssertConnectionHeader(request, "Keep-Alive");
116
117 request.setRequestHeader(HttpConstants.HEADER_CONNECTION, "close");
118 runHttp10MethodAndAssertConnectionHeader(request, "close");
119 }
120
121 private void runHttp10MethodAndAssertConnectionHeader(HttpMethod request, String expectedConnectionHeaderValue) throws Exception
122 {
123 int status = http10Client.executeMethod(request);
124 assertEquals(HttpStatus.SC_OK, status);
125 String connectionHeader = request.getResponseHeader(HttpConstants.HEADER_CONNECTION).getValue();
126 assertNotNull(connectionHeader);
127 assertEquals(expectedConnectionHeaderValue, connectionHeader);
128 }
129
130 @Test
131 public void testHttp11KeepAlive() throws Exception
132 {
133 doTestHttp11KeepAlive(((InboundEndpoint) client.getMuleContext().getRegistry().lookupObject("inWithoutEndpointOverride")).getAddress());
134 }
135
136 @Test
137 public void testHttp11KeepAliveWithEpOverride() throws Exception
138 {
139 doTestHttp11KeepAlive(((InboundEndpoint) client.getMuleContext().getRegistry().lookupObject("inWithoutEndpointOverride")).getAddress());
140 }
141
142 public void doTestHttp11KeepAlive(String url) throws Exception
143 {
144 GetMethod request = new GetMethod(url);
145 runHttp11MethodAndAssert(request);
146
147
148 request = new GetMethod(url);
149 request.setRequestHeader(HttpConstants.HEADER_CONNECTION, "close");
150 runHttp11MethodAndAssert(request);
151
152 Header connectHeader = request.getResponseHeader(HttpConstants.HEADER_CONNECTION);
153 assertNotNull(connectHeader);
154 assertEquals("close", connectHeader.getValue());
155 }
156
157 private void runHttp11MethodAndAssert(HttpMethod request) throws Exception
158 {
159 int status = http11Client.executeMethod(request);
160 assertEquals(HttpStatus.SC_OK, status);
161 assertEquals("/http-in", request.getResponseBodyAsString());
162 }
163
164 }
165
166