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
.util
.ArrayList
;
9 import java
.util
.Enumeration
;
10 import java
.util
.List
;
12 import javax
.net
.ssl
.SSLSession
;
13 import javax
.servlet
.http
.HttpServletRequest
;
14 import javax
.servlet
.http
.HttpServletResponse
;
16 import com
.sun
.net
.httpserver
.Headers
;
17 import com
.sun
.net
.httpserver
.HttpContext
;
18 import com
.sun
.net
.httpserver
.HttpPrincipal
;
19 import com
.sun
.net
.httpserver
.HttpsExchange
;
21 /** Integrates {@link HttpsExchange} in a servlet container. */
22 class ServletHttpExchange
extends HttpsExchange
{
23 private final HttpContext httpContext
;
24 private final HttpServletRequest httpServletRequest
;
25 private final HttpServletResponse httpServletResponse
;
27 private final Headers requestHeaders
;
28 private final Headers responseHeaders
;
30 private InputStream filteredIn
;
31 private OutputStream filteredOut
;
33 private HttpPrincipal principal
;
35 public ServletHttpExchange(HttpContext httpContext
, HttpServletRequest httpServletRequest
,
36 HttpServletResponse httpServletResponse
) {
37 this.httpContext
= httpContext
;
38 this.httpServletRequest
= httpServletRequest
;
39 this.httpServletResponse
= httpServletResponse
;
42 requestHeaders
= new Headers();
43 for (Enumeration
<String
> headerNames
= httpServletRequest
.getHeaderNames(); headerNames
.hasMoreElements();) {
44 String headerName
= headerNames
.nextElement();
45 List
<String
> values
= new ArrayList
<>();
46 for (Enumeration
<String
> headerValues
= httpServletRequest
.getHeaders(headerName
); headerValues
48 values
.add(headerValues
.nextElement());
49 requestHeaders
.put(headerName
, values
);
52 responseHeaders
= new Headers();
56 public SSLSession
getSSLSession() {
57 Object obj
= httpServletRequest
.getAttribute("javax.net.ssl.session");
58 if (obj
== null || !(obj
instanceof SSLSession
))
59 throw new IllegalStateException("SSL session not found");
60 return (SSLSession
) obj
;
64 public Headers
getRequestHeaders() {
65 return requestHeaders
;
69 public Headers
getResponseHeaders() {
70 return responseHeaders
;
74 public URI
getRequestURI() {
75 return URI
.create(httpServletRequest
.getRequestURI());
79 public String
getRequestMethod() {
80 return httpServletRequest
.getMethod();
84 public HttpContext
getHttpContext() {
91 httpServletRequest
.getInputStream().close();
92 } catch (IOException e
) {
93 // TODO use proper logging
97 httpServletResponse
.getOutputStream().close();
98 } catch (IOException e
) {
99 // TODO use proper logging
106 public InputStream
getRequestBody() {
108 if (filteredIn
!= null)
111 return httpServletRequest
.getInputStream();
112 } catch (IOException e
) {
113 throw new IllegalStateException("Cannot get request body", e
);
118 public OutputStream
getResponseBody() {
120 if (filteredOut
!= null)
123 return httpServletResponse
.getOutputStream();
124 } catch (IOException e
) {
125 throw new IllegalStateException("Cannot get response body", e
);
130 public void sendResponseHeaders(int rCode
, long responseLength
) throws IOException
{
131 for (String headerName
: responseHeaders
.keySet()) {
132 for (String headerValue
: responseHeaders
.get(headerName
)) {
133 httpServletResponse
.addHeader(headerName
, headerValue
);
136 // TODO deal with content length etc.
137 httpServletResponse
.setStatus(rCode
);
141 public InetSocketAddress
getRemoteAddress() {
142 return new InetSocketAddress(httpServletRequest
.getRemoteHost(), httpServletRequest
.getRemotePort());
146 public int getResponseCode() {
147 return httpServletResponse
.getStatus();
151 public InetSocketAddress
getLocalAddress() {
152 return new InetSocketAddress(httpServletRequest
.getLocalName(), httpServletRequest
.getLocalPort());
156 public String
getProtocol() {
157 return httpServletRequest
.getProtocol();
161 public Object
getAttribute(String name
) {
162 return httpServletRequest
.getAttribute(name
);
166 public void setAttribute(String name
, Object value
) {
167 httpServletRequest
.setAttribute(name
, value
);
171 public void setStreams(InputStream i
, OutputStream o
) {
180 public HttpPrincipal
getPrincipal() {
184 void setPrincipal(HttpPrincipal principal
) {
185 this.principal
= principal
;