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