]> git.argeo.org Git - lgpl/argeo-commons.git/blob - argeo/cms/servlet/httpserver/ServletHttpExchange.java
Prepare next development cycle
[lgpl/argeo-commons.git] / 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.util.ArrayList;
9 import java.util.Enumeration;
10 import java.util.List;
11
12 import javax.net.ssl.SSLSession;
13 import javax.servlet.http.HttpServletRequest;
14 import javax.servlet.http.HttpServletResponse;
15
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;
20
21 public class ServletHttpExchange extends HttpsExchange {
22 private final HttpContext httpContext;
23 private final HttpServletRequest httpServletRequest;
24 private final HttpServletResponse httpServletResponse;
25
26 private final Headers requestHeaders;
27 private final Headers responseHeaders;
28
29 private InputStream filteredIn;
30 private OutputStream filteredOut;
31
32 private HttpPrincipal principal;
33
34 public ServletHttpExchange(HttpContext httpContext, HttpServletRequest httpServletRequest,
35 HttpServletResponse httpServletResponse) {
36 this.httpContext = httpContext;
37 this.httpServletRequest = httpServletRequest;
38 this.httpServletResponse = httpServletResponse;
39
40 // request headers
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
46 .hasMoreElements();)
47 values.add(headerValues.nextElement());
48 requestHeaders.put(headerName, values);
49 }
50
51 responseHeaders = new Headers();
52 }
53
54 @Override
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;
60 }
61
62 @Override
63 public Headers getRequestHeaders() {
64 return requestHeaders;
65 }
66
67 @Override
68 public Headers getResponseHeaders() {
69 return responseHeaders;
70 }
71
72 @Override
73 public URI getRequestURI() {
74 return URI.create(httpServletRequest.getRequestURI());
75 }
76
77 @Override
78 public String getRequestMethod() {
79 return httpServletRequest.getMethod();
80 }
81
82 @Override
83 public HttpContext getHttpContext() {
84 return httpContext;
85 }
86
87 @Override
88 public void close() {
89 try {
90 httpServletRequest.getInputStream().close();
91 } catch (IOException e) {
92 // TODO use proper logging
93 e.printStackTrace();
94 }
95 try {
96 httpServletResponse.getOutputStream().close();
97 } catch (IOException e) {
98 // TODO use proper logging
99 e.printStackTrace();
100 }
101
102 }
103
104 @Override
105 public InputStream getRequestBody() {
106 try {
107 if (filteredIn != null)
108 return filteredIn;
109 else
110 return httpServletRequest.getInputStream();
111 } catch (IOException e) {
112 throw new IllegalStateException("Cannot get request body", e);
113 }
114 }
115
116 @Override
117 public OutputStream getResponseBody() {
118 try {
119 if (filteredOut != null)
120 return filteredOut;
121 else
122 return httpServletResponse.getOutputStream();
123 } catch (IOException e) {
124 throw new IllegalStateException("Cannot get response body", e);
125 }
126 }
127
128 @Override
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);
133 }
134 }
135 // TODO deal with content length etc.
136 httpServletResponse.setStatus(rCode);
137 }
138
139 @Override
140 public InetSocketAddress getRemoteAddress() {
141 return new InetSocketAddress(httpServletRequest.getRemoteHost(), httpServletRequest.getRemotePort());
142 }
143
144 @Override
145 public int getResponseCode() {
146 return httpServletResponse.getStatus();
147 }
148
149 @Override
150 public InetSocketAddress getLocalAddress() {
151 return new InetSocketAddress(httpServletRequest.getLocalName(), httpServletRequest.getLocalPort());
152 }
153
154 @Override
155 public String getProtocol() {
156 return httpServletRequest.getProtocol();
157 }
158
159 @Override
160 public Object getAttribute(String name) {
161 return httpServletRequest.getAttribute(name);
162 }
163
164 @Override
165 public void setAttribute(String name, Object value) {
166 httpServletRequest.setAttribute(name, value);
167 }
168
169 @Override
170 public void setStreams(InputStream i, OutputStream o) {
171 if (i != null)
172 filteredIn = i;
173 if (o != null)
174 filteredOut = o;
175
176 }
177
178 @Override
179 public HttpPrincipal getPrincipal() {
180 return principal;
181 }
182
183 void setPrincipal(HttpPrincipal principal) {
184 this.principal = principal;
185 }
186
187 }