]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms.ee/src/org/argeo/cms/servlet/httpserver/ServletHttpExchange.java
Refactor Argeo init
[lgpl/argeo-commons.git] / org.argeo.cms.ee / src / org / argeo / cms / servlet / httpserver / ServletHttpExchange.java
1 package org.argeo.cms.servlet.httpserver;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.io.OutputStream;
6 import java.net.InetSocketAddress;
7 import java.net.URI;
8 import java.net.URLEncoder;
9 import java.nio.charset.Charset;
10 import java.nio.charset.StandardCharsets;
11 import java.util.ArrayList;
12 import java.util.Enumeration;
13 import java.util.List;
14 import java.util.Map;
15 import java.util.StringJoiner;
16
17 import javax.net.ssl.SSLSession;
18 import javax.servlet.http.HttpServletRequest;
19 import javax.servlet.http.HttpServletResponse;
20
21 import com.sun.net.httpserver.Headers;
22 import com.sun.net.httpserver.HttpContext;
23 import com.sun.net.httpserver.HttpPrincipal;
24 import com.sun.net.httpserver.HttpsExchange;
25
26 /** Integrates {@link HttpsExchange} in a servlet container. */
27 class ServletHttpExchange extends HttpsExchange {
28 private final HttpContext httpContext;
29 private final HttpServletRequest httpServletRequest;
30 private final HttpServletResponse httpServletResponse;
31
32 private final Headers requestHeaders;
33 private final Headers responseHeaders;
34
35 private InputStream filteredIn;
36 private OutputStream filteredOut;
37
38 private HttpPrincipal principal;
39
40 public ServletHttpExchange(HttpContext httpContext, HttpServletRequest httpServletRequest,
41 HttpServletResponse httpServletResponse) {
42 this.httpContext = httpContext;
43 this.httpServletRequest = httpServletRequest;
44 this.httpServletResponse = httpServletResponse;
45
46 // request headers
47 requestHeaders = new Headers();
48 for (Enumeration<String> headerNames = httpServletRequest.getHeaderNames(); headerNames.hasMoreElements();) {
49 String headerName = headerNames.nextElement();
50 List<String> values = new ArrayList<>();
51 for (Enumeration<String> headerValues = httpServletRequest.getHeaders(headerName); headerValues
52 .hasMoreElements();)
53 values.add(headerValues.nextElement());
54 requestHeaders.put(headerName, values);
55 }
56
57 responseHeaders = new Headers();
58 }
59
60 @Override
61 public SSLSession getSSLSession() {
62 Object obj = httpServletRequest.getAttribute("javax.net.ssl.session");
63 if (obj == null || !(obj instanceof SSLSession))
64 throw new IllegalStateException("SSL session not found");
65 return (SSLSession) obj;
66 }
67
68 @Override
69 public Headers getRequestHeaders() {
70 return requestHeaders;
71 }
72
73 @Override
74 public Headers getResponseHeaders() {
75 return responseHeaders;
76 }
77
78 @Override
79 public URI getRequestURI() {
80 // TODO properly deal with charset?
81 Charset encoding = StandardCharsets.UTF_8;
82 Map<String, String[]> parameters = httpServletRequest.getParameterMap();
83 StringJoiner sb = new StringJoiner("&");
84 for (String key : parameters.keySet()) {
85 for (String value : parameters.get(key)) {
86 String pair = URLEncoder.encode(key, encoding) + '=' + URLEncoder.encode(value, encoding);
87 sb.add(pair);
88 }
89 }
90 return URI.create(httpServletRequest.getRequestURI() + (sb.length() != 0 ? '?' + sb.toString() : ""));
91 }
92
93 @Override
94 public String getRequestMethod() {
95 return httpServletRequest.getMethod();
96 }
97
98 @Override
99 public HttpContext getHttpContext() {
100 return httpContext;
101 }
102
103 @Override
104 public void close() {
105 try {
106 httpServletRequest.getInputStream().close();
107 } catch (IOException e) {
108 // TODO use proper logging
109 e.printStackTrace();
110 }
111 try {
112 httpServletResponse.getOutputStream().close();
113 } catch (IOException e) {
114 // TODO use proper logging
115 e.printStackTrace();
116 }
117
118 }
119
120 @Override
121 public InputStream getRequestBody() {
122 try {
123 if (filteredIn != null)
124 return filteredIn;
125 else
126 return httpServletRequest.getInputStream();
127 } catch (IOException e) {
128 throw new IllegalStateException("Cannot get request body", e);
129 }
130 }
131
132 @Override
133 public OutputStream getResponseBody() {
134 try {
135 if (filteredOut != null)
136 return filteredOut;
137 else
138 return httpServletResponse.getOutputStream();
139 } catch (IOException e) {
140 throw new IllegalStateException("Cannot get response body", e);
141 }
142 }
143
144 @Override
145 public void sendResponseHeaders(int rCode, long responseLength) throws IOException {
146 for (String headerName : responseHeaders.keySet()) {
147 for (String headerValue : responseHeaders.get(headerName)) {
148 httpServletResponse.addHeader(headerName, headerValue);
149 }
150 }
151 // TODO deal with content length etc.
152 httpServletResponse.setStatus(rCode);
153 }
154
155 @Override
156 public InetSocketAddress getRemoteAddress() {
157 return new InetSocketAddress(httpServletRequest.getRemoteHost(), httpServletRequest.getRemotePort());
158 }
159
160 @Override
161 public int getResponseCode() {
162 return httpServletResponse.getStatus();
163 }
164
165 @Override
166 public InetSocketAddress getLocalAddress() {
167 return new InetSocketAddress(httpServletRequest.getLocalName(), httpServletRequest.getLocalPort());
168 }
169
170 @Override
171 public String getProtocol() {
172 return httpServletRequest.getProtocol();
173 }
174
175 @Override
176 public Object getAttribute(String name) {
177 return httpServletRequest.getAttribute(name);
178 }
179
180 @Override
181 public void setAttribute(String name, Object value) {
182 httpServletRequest.setAttribute(name, value);
183 }
184
185 @Override
186 public void setStreams(InputStream i, OutputStream o) {
187 if (i != null)
188 filteredIn = i;
189 if (o != null)
190 filteredOut = o;
191
192 }
193
194 @Override
195 public HttpPrincipal getPrincipal() {
196 return principal;
197 }
198
199 void setPrincipal(HttpPrincipal principal) {
200 this.principal = principal;
201 }
202
203 }