1 package org
.argeo
.cms
.servlet
.httpserver
;
3 import java
.io
.IOException
;
4 import java
.io
.InputStream
;
5 import java
.io
.OutputStream
;
6 import java
.net
.InetSocketAddress
;
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
;
15 import java
.util
.StringJoiner
;
17 import javax
.net
.ssl
.SSLSession
;
18 import javax
.servlet
.http
.HttpServletRequest
;
19 import javax
.servlet
.http
.HttpServletResponse
;
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
;
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
;
32 private final Headers requestHeaders
;
33 private final Headers responseHeaders
;
35 private InputStream filteredIn
;
36 private OutputStream filteredOut
;
38 private HttpPrincipal principal
;
40 public ServletHttpExchange(HttpContext httpContext
, HttpServletRequest httpServletRequest
,
41 HttpServletResponse httpServletResponse
) {
42 this.httpContext
= httpContext
;
43 this.httpServletRequest
= httpServletRequest
;
44 this.httpServletResponse
= httpServletResponse
;
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
53 values
.add(headerValues
.nextElement());
54 requestHeaders
.put(headerName
, values
);
57 responseHeaders
= new Headers();
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
;
69 public Headers
getRequestHeaders() {
70 return requestHeaders
;
74 public Headers
getResponseHeaders() {
75 return responseHeaders
;
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
);
90 return URI
.create(httpServletRequest
.getRequestURI() + (sb
.length() != 0 ?
'?' + sb
.toString() : ""));
94 public String
getRequestMethod() {
95 return httpServletRequest
.getMethod();
99 public HttpContext
getHttpContext() {
104 public void close() {
106 httpServletRequest
.getInputStream().close();
107 } catch (IOException e
) {
108 // TODO use proper logging
112 httpServletResponse
.getOutputStream().close();
113 } catch (IOException e
) {
114 // TODO use proper logging
121 public InputStream
getRequestBody() {
123 if (filteredIn
!= null)
126 return httpServletRequest
.getInputStream();
127 } catch (IOException e
) {
128 throw new IllegalStateException("Cannot get request body", e
);
133 public OutputStream
getResponseBody() {
135 if (filteredOut
!= null)
138 return httpServletResponse
.getOutputStream();
139 } catch (IOException e
) {
140 throw new IllegalStateException("Cannot get response body", e
);
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
);
151 // TODO deal with content length etc.
152 httpServletResponse
.setStatus(rCode
);
156 public InetSocketAddress
getRemoteAddress() {
157 return new InetSocketAddress(httpServletRequest
.getRemoteHost(), httpServletRequest
.getRemotePort());
161 public int getResponseCode() {
162 return httpServletResponse
.getStatus();
166 public InetSocketAddress
getLocalAddress() {
167 return new InetSocketAddress(httpServletRequest
.getLocalName(), httpServletRequest
.getLocalPort());
171 public String
getProtocol() {
172 return httpServletRequest
.getProtocol();
176 public Object
getAttribute(String name
) {
177 return httpServletRequest
.getAttribute(name
);
181 public void setAttribute(String name
, Object value
) {
182 httpServletRequest
.setAttribute(name
, value
);
186 public void setStreams(InputStream i
, OutputStream o
) {
195 public HttpPrincipal
getPrincipal() {
199 void setPrincipal(HttpPrincipal principal
) {
200 this.principal
= principal
;