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 public class ServletHttpExchange
extends HttpsExchange
{
22 private final HttpContext httpContext
;
23 private final HttpServletRequest httpServletRequest
;
24 private final HttpServletResponse httpServletResponse
;
26 private final Headers requestHeaders
;
27 private final Headers responseHeaders
;
29 private InputStream filteredIn
;
30 private OutputStream filteredOut
;
32 private HttpPrincipal principal
;
34 public ServletHttpExchange(HttpContext httpContext
, HttpServletRequest httpServletRequest
,
35 HttpServletResponse httpServletResponse
) {
36 this.httpContext
= httpContext
;
37 this.httpServletRequest
= httpServletRequest
;
38 this.httpServletResponse
= httpServletResponse
;
41 requestHeaders
= new Headers();
42 for (Enumeration
<String
> headerNames
= httpServletRequest
.getHeaderNames(); headerNames
.hasMoreElements();) {
43 String headerName
= headerNames
.nextElement();
44 List
<String
> values
= new ArrayList
<>();
45 for (Enumeration
<String
> headerValues
= httpServletRequest
.getHeaders(headerName
); headerValues
47 values
.add(headerValues
.nextElement());
48 requestHeaders
.put(headerName
, values
);
51 responseHeaders
= new Headers();
55 public SSLSession
getSSLSession() {
56 Object obj
= httpServletRequest
.getAttribute("javax.net.ssl.session");
57 if (obj
== null || !(obj
instanceof SSLSession
))
58 throw new IllegalStateException("SSL session not found");
59 return (SSLSession
) obj
;
63 public Headers
getRequestHeaders() {
64 return requestHeaders
;
68 public Headers
getResponseHeaders() {
69 return responseHeaders
;
73 public URI
getRequestURI() {
74 return URI
.create(httpServletRequest
.getRequestURI());
78 public String
getRequestMethod() {
79 return httpServletRequest
.getMethod();
83 public HttpContext
getHttpContext() {
90 httpServletRequest
.getInputStream().close();
91 } catch (IOException e
) {
92 // TODO use proper logging
96 httpServletResponse
.getOutputStream().close();
97 } catch (IOException e
) {
98 // TODO use proper logging
105 public InputStream
getRequestBody() {
107 if (filteredIn
!= null)
110 return httpServletRequest
.getInputStream();
111 } catch (IOException e
) {
112 throw new IllegalStateException("Cannot get request body", e
);
117 public OutputStream
getResponseBody() {
119 if (filteredOut
!= null)
122 return httpServletResponse
.getOutputStream();
123 } catch (IOException e
) {
124 throw new IllegalStateException("Cannot get response body", e
);
129 public void sendResponseHeaders(int rCode
, long responseLength
) throws IOException
{
130 for (String headerName
: responseHeaders
.keySet()) {
131 for (String headerValue
: responseHeaders
.get(headerName
)) {
132 httpServletResponse
.addHeader(headerName
, headerValue
);
135 // TODO deal with content length etc.
136 httpServletResponse
.setStatus(rCode
);
140 public InetSocketAddress
getRemoteAddress() {
141 return new InetSocketAddress(httpServletRequest
.getRemoteHost(), httpServletRequest
.getRemotePort());
145 public int getResponseCode() {
146 return httpServletResponse
.getStatus();
150 public InetSocketAddress
getLocalAddress() {
151 return new InetSocketAddress(httpServletRequest
.getLocalName(), httpServletRequest
.getLocalPort());
155 public String
getProtocol() {
156 return httpServletRequest
.getProtocol();
160 public Object
getAttribute(String name
) {
161 return httpServletRequest
.getAttribute(name
);
165 public void setAttribute(String name
, Object value
) {
166 httpServletRequest
.setAttribute(name
, value
);
170 public void setStreams(InputStream i
, OutputStream o
) {
179 public HttpPrincipal
getPrincipal() {
183 void setPrincipal(HttpPrincipal principal
) {
184 this.principal
= principal
;