xref: /unit/src/java/nginx/unit/Request.java (revision 1157:7ae152bda303)
1977Smax.romanov@gmail.com package nginx.unit;
2977Smax.romanov@gmail.com 
3977Smax.romanov@gmail.com import java.io.BufferedReader;
41121Smax.romanov@nginx.com import java.io.ByteArrayOutputStream;
51121Smax.romanov@nginx.com import java.io.File;
6977Smax.romanov@gmail.com import java.io.InputStreamReader;
7977Smax.romanov@gmail.com import java.io.IOException;
8977Smax.romanov@gmail.com import java.io.UnsupportedEncodingException;
9977Smax.romanov@gmail.com 
10977Smax.romanov@gmail.com import java.lang.IllegalArgumentException;
11977Smax.romanov@gmail.com import java.lang.IllegalStateException;
12977Smax.romanov@gmail.com import java.lang.Object;
13977Smax.romanov@gmail.com import java.lang.String;
14977Smax.romanov@gmail.com import java.lang.StringBuffer;
15977Smax.romanov@gmail.com 
16977Smax.romanov@gmail.com import java.net.URI;
17977Smax.romanov@gmail.com import java.net.URISyntaxException;
18977Smax.romanov@gmail.com 
19*1157Smax.romanov@nginx.com import java.nio.ByteBuffer;
201121Smax.romanov@nginx.com import java.nio.charset.Charset;
211121Smax.romanov@nginx.com import java.nio.charset.StandardCharsets;
221121Smax.romanov@nginx.com 
23977Smax.romanov@gmail.com import java.text.ParseException;
24977Smax.romanov@gmail.com import java.text.SimpleDateFormat;
25977Smax.romanov@gmail.com 
26977Smax.romanov@gmail.com import java.util.Collection;
27977Smax.romanov@gmail.com import java.util.Collections;
28977Smax.romanov@gmail.com import java.util.Date;
29977Smax.romanov@gmail.com import java.util.Enumeration;
30977Smax.romanov@gmail.com import java.util.HashMap;
31977Smax.romanov@gmail.com import java.util.HashSet;
32977Smax.romanov@gmail.com import java.util.List;
33977Smax.romanov@gmail.com import java.util.Locale;
34977Smax.romanov@gmail.com import java.util.Map;
35977Smax.romanov@gmail.com import java.util.Set;
36977Smax.romanov@gmail.com 
37977Smax.romanov@gmail.com import java.security.Principal;
38977Smax.romanov@gmail.com 
39977Smax.romanov@gmail.com import javax.servlet.AsyncContext;
40977Smax.romanov@gmail.com import javax.servlet.DispatcherType;
411121Smax.romanov@nginx.com import javax.servlet.MultipartConfigElement;
42977Smax.romanov@gmail.com import javax.servlet.RequestDispatcher;
43977Smax.romanov@gmail.com import javax.servlet.ServletContext;
44977Smax.romanov@gmail.com import javax.servlet.ServletException;
45977Smax.romanov@gmail.com import javax.servlet.ServletInputStream;
46977Smax.romanov@gmail.com import javax.servlet.ServletRequest;
47977Smax.romanov@gmail.com import javax.servlet.ServletRequestAttributeEvent;
48977Smax.romanov@gmail.com import javax.servlet.ServletRequestAttributeListener;
49977Smax.romanov@gmail.com import javax.servlet.ServletResponse;
50977Smax.romanov@gmail.com import javax.servlet.SessionTrackingMode;
51977Smax.romanov@gmail.com import javax.servlet.SessionCookieConfig;
52977Smax.romanov@gmail.com import javax.servlet.http.Cookie;
53977Smax.romanov@gmail.com import javax.servlet.http.HttpSession;
54977Smax.romanov@gmail.com import javax.servlet.http.HttpServletRequest;
55977Smax.romanov@gmail.com import javax.servlet.http.HttpServletResponse;
56977Smax.romanov@gmail.com import javax.servlet.http.HttpUpgradeHandler;
57977Smax.romanov@gmail.com import javax.servlet.http.Part;
58977Smax.romanov@gmail.com 
591121Smax.romanov@nginx.com import org.eclipse.jetty.util.IO;
60977Smax.romanov@gmail.com import org.eclipse.jetty.util.MultiMap;
61977Smax.romanov@gmail.com import org.eclipse.jetty.util.UrlEncoded;
62977Smax.romanov@gmail.com import org.eclipse.jetty.util.StringUtil;
63977Smax.romanov@gmail.com 
64977Smax.romanov@gmail.com import org.eclipse.jetty.server.CookieCutter;
651121Smax.romanov@nginx.com import org.eclipse.jetty.http.MultiPartFormInputStream;
661121Smax.romanov@nginx.com import org.eclipse.jetty.http.HttpFields;
67977Smax.romanov@gmail.com import org.eclipse.jetty.http.MimeTypes;
68977Smax.romanov@gmail.com 
69*1157Smax.romanov@nginx.com import nginx.unit.websocket.WsSession;
70*1157Smax.romanov@nginx.com import nginx.unit.websocket.WsIOException;
71*1157Smax.romanov@nginx.com 
72977Smax.romanov@gmail.com public class Request implements HttpServletRequest, DynamicPathRequest
73977Smax.romanov@gmail.com {
74977Smax.romanov@gmail.com     private final Context context;
75977Smax.romanov@gmail.com     private final long req_info_ptr;
76977Smax.romanov@gmail.com     private final long req_ptr;
77977Smax.romanov@gmail.com 
78977Smax.romanov@gmail.com     protected String authType = null;
79977Smax.romanov@gmail.com 
80977Smax.romanov@gmail.com     protected boolean cookiesParsed = false;
81977Smax.romanov@gmail.com 
82977Smax.romanov@gmail.com     protected CookieCutter cookies = null;
83977Smax.romanov@gmail.com 
84977Smax.romanov@gmail.com     private final Map<String, Object> attributes = new HashMap<>();
85977Smax.romanov@gmail.com 
86977Smax.romanov@gmail.com     private MultiMap<String> parameters = null;
87977Smax.romanov@gmail.com 
88977Smax.romanov@gmail.com     private final String context_path;
89977Smax.romanov@gmail.com     private String filter_path = null;
90977Smax.romanov@gmail.com     private String servlet_path = null;
91977Smax.romanov@gmail.com     private String path_info = null;
92977Smax.romanov@gmail.com     private String request_uri = null;
93977Smax.romanov@gmail.com     private String query_string = null;
94977Smax.romanov@gmail.com     private boolean query_string_valid = false;
95977Smax.romanov@gmail.com 
96977Smax.romanov@gmail.com     private DispatcherType dispatcher_type = DispatcherType.REQUEST;
97977Smax.romanov@gmail.com 
98977Smax.romanov@gmail.com     private String characterEncoding = null;
99977Smax.romanov@gmail.com 
100977Smax.romanov@gmail.com     /**
101977Smax.romanov@gmail.com      * The only date format permitted when generating HTTP headers.
102977Smax.romanov@gmail.com      */
103977Smax.romanov@gmail.com     public static final String RFC1123_DATE =
104977Smax.romanov@gmail.com             "EEE, dd MMM yyyy HH:mm:ss zzz";
105977Smax.romanov@gmail.com 
106977Smax.romanov@gmail.com     private static final SimpleDateFormat formats[] = {
107977Smax.romanov@gmail.com         new SimpleDateFormat(RFC1123_DATE, Locale.US),
108977Smax.romanov@gmail.com         new SimpleDateFormat("EEEEEE, dd-MMM-yy HH:mm:ss zzz", Locale.US),
109977Smax.romanov@gmail.com         new SimpleDateFormat("EEE MMMM d HH:mm:ss yyyy", Locale.US)
110977Smax.romanov@gmail.com     };
111977Smax.romanov@gmail.com 
112977Smax.romanov@gmail.com     private InputStream inputStream = null;
113977Smax.romanov@gmail.com     private BufferedReader reader = null;
114977Smax.romanov@gmail.com 
115977Smax.romanov@gmail.com     private boolean request_session_id_parsed = false;
116977Smax.romanov@gmail.com     private String request_session_id = null;
117977Smax.romanov@gmail.com     private boolean request_session_id_from_cookie = false;
118977Smax.romanov@gmail.com     private boolean request_session_id_from_url = false;
119977Smax.romanov@gmail.com     private Session session = null;
120977Smax.romanov@gmail.com 
121*1157Smax.romanov@nginx.com     private WsSession wsSession = null;
122*1157Smax.romanov@nginx.com     private boolean skip_close_ws = false;
123*1157Smax.romanov@nginx.com 
124977Smax.romanov@gmail.com     private final ServletRequestAttributeListener attr_listener;
125977Smax.romanov@gmail.com 
126977Smax.romanov@gmail.com     public static final String BARE = "nginx.unit.request.bare";
127977Smax.romanov@gmail.com 
1281121Smax.romanov@nginx.com     private MultiPartFormInputStream multi_parts;
1291121Smax.romanov@nginx.com     private MultipartConfigElement multipart_config;
1301121Smax.romanov@nginx.com 
Request(Context ctx, long req_info, long req)131977Smax.romanov@gmail.com     public Request(Context ctx, long req_info, long req) {
132977Smax.romanov@gmail.com         context = ctx;
133977Smax.romanov@gmail.com         req_info_ptr = req_info;
134977Smax.romanov@gmail.com         req_ptr = req;
135977Smax.romanov@gmail.com 
136977Smax.romanov@gmail.com         attr_listener = context.getRequestAttributeListener();
137977Smax.romanov@gmail.com         context_path = context.getContextPath();
138977Smax.romanov@gmail.com     }
139977Smax.romanov@gmail.com 
140977Smax.romanov@gmail.com     @Override
authenticate(HttpServletResponse response)141977Smax.romanov@gmail.com     public boolean authenticate(HttpServletResponse response)
142977Smax.romanov@gmail.com         throws IOException, ServletException
143977Smax.romanov@gmail.com     {
144977Smax.romanov@gmail.com         log("authenticate");
145977Smax.romanov@gmail.com 
146977Smax.romanov@gmail.com         if (response.isCommitted()) {
147977Smax.romanov@gmail.com             throw new IllegalStateException();
148977Smax.romanov@gmail.com         }
149977Smax.romanov@gmail.com 
150977Smax.romanov@gmail.com         return false;
151977Smax.romanov@gmail.com     }
152977Smax.romanov@gmail.com 
153977Smax.romanov@gmail.com     @Override
getAuthType()154977Smax.romanov@gmail.com     public String getAuthType()
155977Smax.romanov@gmail.com     {
156977Smax.romanov@gmail.com         log("getAuthType");
157977Smax.romanov@gmail.com 
158977Smax.romanov@gmail.com         return authType;
159977Smax.romanov@gmail.com     }
160977Smax.romanov@gmail.com 
161977Smax.romanov@gmail.com     @Override
getContextPath()162977Smax.romanov@gmail.com     public String getContextPath()
163977Smax.romanov@gmail.com     {
164977Smax.romanov@gmail.com         trace("getContextPath: " + context_path);
165977Smax.romanov@gmail.com 
166977Smax.romanov@gmail.com         return context_path;
167977Smax.romanov@gmail.com     }
168977Smax.romanov@gmail.com 
169977Smax.romanov@gmail.com     @Override
getCookies()170977Smax.romanov@gmail.com     public Cookie[] getCookies()
171977Smax.romanov@gmail.com     {
172977Smax.romanov@gmail.com         trace("getCookies");
173977Smax.romanov@gmail.com 
174977Smax.romanov@gmail.com         if (!cookiesParsed) {
175977Smax.romanov@gmail.com             parseCookies();
176977Smax.romanov@gmail.com         }
177977Smax.romanov@gmail.com 
178977Smax.romanov@gmail.com         //Javadoc for Request.getCookies() stipulates null for no cookies
179977Smax.romanov@gmail.com         if (cookies == null || cookies.getCookies().length == 0) {
180977Smax.romanov@gmail.com             return null;
181977Smax.romanov@gmail.com         }
182977Smax.romanov@gmail.com 
183977Smax.romanov@gmail.com         return cookies.getCookies();
184977Smax.romanov@gmail.com     }
185977Smax.romanov@gmail.com 
parseCookies()186977Smax.romanov@gmail.com     protected void parseCookies()
187977Smax.romanov@gmail.com     {
188977Smax.romanov@gmail.com         cookiesParsed = true;
189977Smax.romanov@gmail.com 
190977Smax.romanov@gmail.com         cookies = new CookieCutter();
191977Smax.romanov@gmail.com 
192977Smax.romanov@gmail.com         Enumeration<String> cookie_headers = getHeaders("Cookie");
193977Smax.romanov@gmail.com 
194977Smax.romanov@gmail.com         while (cookie_headers.hasMoreElements()) {
195977Smax.romanov@gmail.com             cookies.addCookieField(cookie_headers.nextElement());
196977Smax.romanov@gmail.com         }
197977Smax.romanov@gmail.com     }
198977Smax.romanov@gmail.com 
199977Smax.romanov@gmail.com     @Override
getDateHeader(String name)200977Smax.romanov@gmail.com     public long getDateHeader(String name)
201977Smax.romanov@gmail.com     {
202977Smax.romanov@gmail.com         trace("getDateHeader: " + name);
203977Smax.romanov@gmail.com 
204977Smax.romanov@gmail.com         String value = getHeader(name);
205977Smax.romanov@gmail.com         if (value == null) {
206977Smax.romanov@gmail.com             return -1L;
207977Smax.romanov@gmail.com         }
208977Smax.romanov@gmail.com 
209977Smax.romanov@gmail.com         long res = parseDate(value);
210977Smax.romanov@gmail.com         if (res == -1L) {
211977Smax.romanov@gmail.com             throw new IllegalArgumentException(value);
212977Smax.romanov@gmail.com         }
213977Smax.romanov@gmail.com 
214977Smax.romanov@gmail.com         return res;
215977Smax.romanov@gmail.com     }
216977Smax.romanov@gmail.com 
parseDate(String value)217977Smax.romanov@gmail.com     protected long parseDate(String value)
218977Smax.romanov@gmail.com     {
219977Smax.romanov@gmail.com         Date date = null;
220977Smax.romanov@gmail.com         for (int i = 0; (date == null) && (i < formats.length); i++) {
221977Smax.romanov@gmail.com             try {
222977Smax.romanov@gmail.com                 date = formats[i].parse(value);
223977Smax.romanov@gmail.com             } catch (ParseException e) {
224977Smax.romanov@gmail.com                 // Ignore
225977Smax.romanov@gmail.com             }
226977Smax.romanov@gmail.com         }
227977Smax.romanov@gmail.com         if (date == null) {
228977Smax.romanov@gmail.com             return -1L;
229977Smax.romanov@gmail.com         }
230977Smax.romanov@gmail.com         return date.getTime();
231977Smax.romanov@gmail.com     }
232977Smax.romanov@gmail.com 
233977Smax.romanov@gmail.com     @Override
getHeader(String name)234977Smax.romanov@gmail.com     public String getHeader(String name)
235977Smax.romanov@gmail.com     {
236977Smax.romanov@gmail.com         String res = getHeader(req_ptr, name, name.length());
237977Smax.romanov@gmail.com 
238977Smax.romanov@gmail.com         trace("getHeader: " + name + " = '" + res + "'");
239977Smax.romanov@gmail.com 
240977Smax.romanov@gmail.com         return res;
241977Smax.romanov@gmail.com     }
242977Smax.romanov@gmail.com 
getHeader(long req_ptr, String name, int name_len)243977Smax.romanov@gmail.com     private static native String getHeader(long req_ptr, String name, int name_len);
244977Smax.romanov@gmail.com 
245977Smax.romanov@gmail.com 
246977Smax.romanov@gmail.com     @Override
getHeaderNames()247977Smax.romanov@gmail.com     public Enumeration<String> getHeaderNames()
248977Smax.romanov@gmail.com     {
249977Smax.romanov@gmail.com         trace("getHeaderNames");
250977Smax.romanov@gmail.com 
251977Smax.romanov@gmail.com         return getHeaderNames(req_ptr);
252977Smax.romanov@gmail.com     }
253977Smax.romanov@gmail.com 
getHeaderNames(long req_ptr)254977Smax.romanov@gmail.com     private static native Enumeration<String> getHeaderNames(long req_ptr);
255977Smax.romanov@gmail.com 
256977Smax.romanov@gmail.com 
257977Smax.romanov@gmail.com     @Override
getHeaders(String name)258977Smax.romanov@gmail.com     public Enumeration<String> getHeaders(String name)
259977Smax.romanov@gmail.com     {
260977Smax.romanov@gmail.com         trace("getHeaders: " + name);
261977Smax.romanov@gmail.com 
262977Smax.romanov@gmail.com         return getHeaders(req_ptr, name, name.length());
263977Smax.romanov@gmail.com     }
264977Smax.romanov@gmail.com 
getHeaders(long req_ptr, String name, int name_len)265977Smax.romanov@gmail.com     private static native Enumeration<String> getHeaders(long req_ptr, String name, int name_len);
266977Smax.romanov@gmail.com 
267977Smax.romanov@gmail.com 
268977Smax.romanov@gmail.com     @Override
getIntHeader(String name)269977Smax.romanov@gmail.com     public int getIntHeader(String name)
270977Smax.romanov@gmail.com     {
271977Smax.romanov@gmail.com         trace("getIntHeader: " + name);
272977Smax.romanov@gmail.com 
273977Smax.romanov@gmail.com         return getIntHeader(req_ptr, name, name.length());
274977Smax.romanov@gmail.com     }
275977Smax.romanov@gmail.com 
getIntHeader(long req_ptr, String name, int name_len)276977Smax.romanov@gmail.com     private static native int getIntHeader(long req_ptr, String name, int name_len);
277977Smax.romanov@gmail.com 
278977Smax.romanov@gmail.com 
279977Smax.romanov@gmail.com     @Override
getMethod()280977Smax.romanov@gmail.com     public String getMethod()
281977Smax.romanov@gmail.com     {
282977Smax.romanov@gmail.com         trace("getMethod");
283977Smax.romanov@gmail.com 
284977Smax.romanov@gmail.com         return getMethod(req_ptr);
285977Smax.romanov@gmail.com     }
286977Smax.romanov@gmail.com 
getMethod(long req_ptr)287977Smax.romanov@gmail.com     private static native String getMethod(long req_ptr);
288977Smax.romanov@gmail.com 
289977Smax.romanov@gmail.com 
290977Smax.romanov@gmail.com     @Override
getPart(String name)291977Smax.romanov@gmail.com     public Part getPart(String name) throws IOException, ServletException
292977Smax.romanov@gmail.com     {
2931121Smax.romanov@nginx.com         trace("getPart: " + name);
294977Smax.romanov@gmail.com 
2951121Smax.romanov@nginx.com         if (multi_parts == null) {
2961121Smax.romanov@nginx.com             parseMultiParts();
2971121Smax.romanov@nginx.com         }
2981121Smax.romanov@nginx.com 
2991121Smax.romanov@nginx.com         return multi_parts.getPart(name);
300977Smax.romanov@gmail.com     }
301977Smax.romanov@gmail.com 
302977Smax.romanov@gmail.com     @Override
getParts()303977Smax.romanov@gmail.com     public Collection<Part> getParts() throws IOException, ServletException
304977Smax.romanov@gmail.com     {
3051121Smax.romanov@nginx.com         trace("getParts");
3061121Smax.romanov@nginx.com 
3071121Smax.romanov@nginx.com         if (multi_parts == null) {
3081121Smax.romanov@nginx.com             parseMultiParts();
3091121Smax.romanov@nginx.com         }
3101121Smax.romanov@nginx.com 
3111121Smax.romanov@nginx.com         return multi_parts.getParts();
3121121Smax.romanov@nginx.com     }
3131121Smax.romanov@nginx.com 
checkMultiPart(String content_type)3141121Smax.romanov@nginx.com     private boolean checkMultiPart(String content_type)
3151121Smax.romanov@nginx.com     {
3161121Smax.romanov@nginx.com         return content_type != null
3171121Smax.romanov@nginx.com                && MimeTypes.Type.MULTIPART_FORM_DATA.is(HttpFields.valueParameters(content_type, null));
3181121Smax.romanov@nginx.com     }
3191121Smax.romanov@nginx.com 
parseMultiParts()3201121Smax.romanov@nginx.com     private void parseMultiParts() throws IOException, ServletException, IllegalStateException
3211121Smax.romanov@nginx.com     {
3221121Smax.romanov@nginx.com         String content_type = getContentType();
3231121Smax.romanov@nginx.com 
3241121Smax.romanov@nginx.com         if (!checkMultiPart(content_type)) {
3251121Smax.romanov@nginx.com             throw new ServletException("Content-Type != multipart/form-data");
3261121Smax.romanov@nginx.com         }
327977Smax.romanov@gmail.com 
3281121Smax.romanov@nginx.com         if (multipart_config == null) {
3291121Smax.romanov@nginx.com             throw new IllegalStateException("No multipart config for servlet");
3301121Smax.romanov@nginx.com         }
3311121Smax.romanov@nginx.com 
3321121Smax.romanov@nginx.com         parseMultiParts(content_type);
3331121Smax.romanov@nginx.com     }
3341121Smax.romanov@nginx.com 
parseMultiParts(String content_type)3351121Smax.romanov@nginx.com     private void parseMultiParts(String content_type) throws IOException
3361121Smax.romanov@nginx.com     {
3371121Smax.romanov@nginx.com         File tmpDir = (File) context.getAttribute(ServletContext.TEMPDIR);
3381121Smax.romanov@nginx.com 
3391121Smax.romanov@nginx.com         multi_parts = new MultiPartFormInputStream(getInputStream(),
3401121Smax.romanov@nginx.com             content_type, multipart_config, tmpDir);
3411121Smax.romanov@nginx.com     }
3421121Smax.romanov@nginx.com 
setMultipartConfig(MultipartConfigElement mce)3431121Smax.romanov@nginx.com     public void setMultipartConfig(MultipartConfigElement mce)
3441121Smax.romanov@nginx.com     {
3451121Smax.romanov@nginx.com         multipart_config = mce;
3461121Smax.romanov@nginx.com     }
3471121Smax.romanov@nginx.com 
getMultipartConfig()3481121Smax.romanov@nginx.com     public MultipartConfigElement getMultipartConfig()
3491121Smax.romanov@nginx.com     {
3501121Smax.romanov@nginx.com         return multipart_config;
351977Smax.romanov@gmail.com     }
352977Smax.romanov@gmail.com 
353977Smax.romanov@gmail.com     @Override
getPathInfo()354977Smax.romanov@gmail.com     public String getPathInfo()
355977Smax.romanov@gmail.com     {
356977Smax.romanov@gmail.com         trace("getPathInfo: " + path_info);
357977Smax.romanov@gmail.com 
358977Smax.romanov@gmail.com         return path_info;
359977Smax.romanov@gmail.com     }
360977Smax.romanov@gmail.com 
361977Smax.romanov@gmail.com     @Override
getPathTranslated()362977Smax.romanov@gmail.com     public String getPathTranslated()
363977Smax.romanov@gmail.com     {
364977Smax.romanov@gmail.com         trace("getPathTranslated");
365977Smax.romanov@gmail.com 
366977Smax.romanov@gmail.com         if (path_info == null) {
367977Smax.romanov@gmail.com             return null;
368977Smax.romanov@gmail.com         }
369977Smax.romanov@gmail.com 
370977Smax.romanov@gmail.com         return context.getRealPath(path_info);
371977Smax.romanov@gmail.com     }
372977Smax.romanov@gmail.com 
373977Smax.romanov@gmail.com     @Override
getQueryString()374977Smax.romanov@gmail.com     public String getQueryString()
375977Smax.romanov@gmail.com     {
376977Smax.romanov@gmail.com         if (!query_string_valid) {
377977Smax.romanov@gmail.com             query_string = getQueryString(req_ptr);
378977Smax.romanov@gmail.com             query_string_valid = true;
379977Smax.romanov@gmail.com         }
380977Smax.romanov@gmail.com 
381977Smax.romanov@gmail.com         trace("getQueryString: " + query_string);
382977Smax.romanov@gmail.com 
383977Smax.romanov@gmail.com         return query_string;
384977Smax.romanov@gmail.com     }
385977Smax.romanov@gmail.com 
getQueryString(long req_ptr)386977Smax.romanov@gmail.com     private static native String getQueryString(long req_ptr);
387977Smax.romanov@gmail.com 
388977Smax.romanov@gmail.com     @Override
setQueryString(String query)389977Smax.romanov@gmail.com     public void setQueryString(String query)
390977Smax.romanov@gmail.com     {
391977Smax.romanov@gmail.com         trace("setQueryString: " + query);
392977Smax.romanov@gmail.com 
393977Smax.romanov@gmail.com         query_string = query;
394977Smax.romanov@gmail.com         query_string_valid = true;
395977Smax.romanov@gmail.com     }
396977Smax.romanov@gmail.com 
397977Smax.romanov@gmail.com     @Override
getRemoteUser()398977Smax.romanov@gmail.com     public String getRemoteUser()
399977Smax.romanov@gmail.com     {
400977Smax.romanov@gmail.com         log("getRemoteUser");
401977Smax.romanov@gmail.com 
402977Smax.romanov@gmail.com         /* TODO */
403977Smax.romanov@gmail.com         return null;
404977Smax.romanov@gmail.com     }
405977Smax.romanov@gmail.com 
406977Smax.romanov@gmail.com     @Override
getRequestedSessionId()407977Smax.romanov@gmail.com     public String getRequestedSessionId()
408977Smax.romanov@gmail.com     {
409977Smax.romanov@gmail.com         trace("getRequestedSessionId");
410977Smax.romanov@gmail.com 
411977Smax.romanov@gmail.com         if (!request_session_id_parsed) {
412977Smax.romanov@gmail.com             parseRequestSessionId();
413977Smax.romanov@gmail.com         }
414977Smax.romanov@gmail.com 
415977Smax.romanov@gmail.com         return request_session_id;
416977Smax.romanov@gmail.com     }
417977Smax.romanov@gmail.com 
parseRequestSessionId()418977Smax.romanov@gmail.com     private void parseRequestSessionId()
419977Smax.romanov@gmail.com     {
420977Smax.romanov@gmail.com         request_session_id_parsed = true;
421977Smax.romanov@gmail.com 
422977Smax.romanov@gmail.com         Cookie[] cookies = getCookies();
423977Smax.romanov@gmail.com         if (cookies == null) {
424977Smax.romanov@gmail.com             return;
425977Smax.romanov@gmail.com         }
426977Smax.romanov@gmail.com 
427977Smax.romanov@gmail.com         if (context.getEffectiveSessionTrackingModes().contains(
428977Smax.romanov@gmail.com             SessionTrackingMode.COOKIE))
429977Smax.romanov@gmail.com         {
430977Smax.romanov@gmail.com             final String name = context.getSessionCookieConfig().getName();
431977Smax.romanov@gmail.com 
432977Smax.romanov@gmail.com             for (Cookie c : cookies) {
433977Smax.romanov@gmail.com                 if (c.getName().equals(name)) {
434977Smax.romanov@gmail.com                     request_session_id = c.getValue();
435977Smax.romanov@gmail.com                     request_session_id_from_cookie = true;
436977Smax.romanov@gmail.com 
437977Smax.romanov@gmail.com                     return;
438977Smax.romanov@gmail.com                 }
439977Smax.romanov@gmail.com             }
440977Smax.romanov@gmail.com         }
441977Smax.romanov@gmail.com     }
442977Smax.romanov@gmail.com 
443977Smax.romanov@gmail.com     @Override
getRequestURI()444977Smax.romanov@gmail.com     public String getRequestURI()
445977Smax.romanov@gmail.com     {
446977Smax.romanov@gmail.com         if (request_uri == null) {
447977Smax.romanov@gmail.com             request_uri = getRequestURI(req_ptr);
448977Smax.romanov@gmail.com         }
449977Smax.romanov@gmail.com 
450977Smax.romanov@gmail.com         trace("getRequestURI: " + request_uri);
451977Smax.romanov@gmail.com 
452977Smax.romanov@gmail.com         return request_uri;
453977Smax.romanov@gmail.com     }
454977Smax.romanov@gmail.com 
getRequestURI(long req_ptr)455977Smax.romanov@gmail.com     private static native String getRequestURI(long req_ptr);
456977Smax.romanov@gmail.com 
457977Smax.romanov@gmail.com 
458977Smax.romanov@gmail.com     @Override
setRequestURI(String uri)459977Smax.romanov@gmail.com     public void setRequestURI(String uri)
460977Smax.romanov@gmail.com     {
461977Smax.romanov@gmail.com         trace("setRequestURI: " + uri);
462977Smax.romanov@gmail.com 
463977Smax.romanov@gmail.com         request_uri = uri;
464977Smax.romanov@gmail.com     }
465977Smax.romanov@gmail.com 
466977Smax.romanov@gmail.com 
467977Smax.romanov@gmail.com     @Override
getRequestURL()468977Smax.romanov@gmail.com     public StringBuffer getRequestURL()
469977Smax.romanov@gmail.com     {
470977Smax.romanov@gmail.com         String host = getHeader("Host");
471977Smax.romanov@gmail.com         String uri = getRequestURI();
472977Smax.romanov@gmail.com         StringBuffer res = new StringBuffer("http://" + host + uri);
473977Smax.romanov@gmail.com 
474977Smax.romanov@gmail.com         trace("getRequestURL: " + res);
475977Smax.romanov@gmail.com 
476977Smax.romanov@gmail.com         return res;
477977Smax.romanov@gmail.com     }
478977Smax.romanov@gmail.com 
479977Smax.romanov@gmail.com     @Override
getServletPath()480977Smax.romanov@gmail.com     public String getServletPath()
481977Smax.romanov@gmail.com     {
482977Smax.romanov@gmail.com         trace("getServletPath: " + servlet_path);
483977Smax.romanov@gmail.com 
484977Smax.romanov@gmail.com         return servlet_path;
485977Smax.romanov@gmail.com     }
486977Smax.romanov@gmail.com 
487977Smax.romanov@gmail.com     @Override
setServletPath(String servlet_path, String path_info)488977Smax.romanov@gmail.com     public void setServletPath(String servlet_path, String path_info)
489977Smax.romanov@gmail.com     {
490977Smax.romanov@gmail.com         trace("setServletPath: " + servlet_path);
491977Smax.romanov@gmail.com 
492977Smax.romanov@gmail.com         this.filter_path = servlet_path;
493977Smax.romanov@gmail.com         this.servlet_path = servlet_path;
494977Smax.romanov@gmail.com         this.path_info = path_info;
495977Smax.romanov@gmail.com     }
496977Smax.romanov@gmail.com 
497977Smax.romanov@gmail.com     @Override
setServletPath(String filter_path, String servlet_path, String path_info)498977Smax.romanov@gmail.com     public void setServletPath(String filter_path, String servlet_path, String path_info)
499977Smax.romanov@gmail.com     {
500977Smax.romanov@gmail.com         trace("setServletPath: " + filter_path + ", " + servlet_path);
501977Smax.romanov@gmail.com 
502977Smax.romanov@gmail.com         this.filter_path = filter_path;
503977Smax.romanov@gmail.com         this.servlet_path = servlet_path;
504977Smax.romanov@gmail.com         this.path_info = path_info;
505977Smax.romanov@gmail.com     }
506977Smax.romanov@gmail.com 
507977Smax.romanov@gmail.com     @Override
getFilterPath()508977Smax.romanov@gmail.com     public String getFilterPath()
509977Smax.romanov@gmail.com     {
510977Smax.romanov@gmail.com         return filter_path;
511977Smax.romanov@gmail.com     }
512977Smax.romanov@gmail.com 
513977Smax.romanov@gmail.com     @Override
getSession()514977Smax.romanov@gmail.com     public HttpSession getSession()
515977Smax.romanov@gmail.com     {
516977Smax.romanov@gmail.com         return getSession(true);
517977Smax.romanov@gmail.com     }
518977Smax.romanov@gmail.com 
519977Smax.romanov@gmail.com     @Override
getSession(boolean create)520977Smax.romanov@gmail.com     public HttpSession getSession(boolean create)
521977Smax.romanov@gmail.com     {
522977Smax.romanov@gmail.com         if (session != null) {
523977Smax.romanov@gmail.com             if (context.isSessionIdValid(session.getId())) {
524977Smax.romanov@gmail.com                 trace("getSession(" + create + "): " + session.getId());
525977Smax.romanov@gmail.com 
526977Smax.romanov@gmail.com                 return session;
527977Smax.romanov@gmail.com             }
528977Smax.romanov@gmail.com 
529977Smax.romanov@gmail.com             session = null;
530977Smax.romanov@gmail.com         }
531977Smax.romanov@gmail.com 
532977Smax.romanov@gmail.com         if (!request_session_id_parsed) {
533977Smax.romanov@gmail.com             parseRequestSessionId();
534977Smax.romanov@gmail.com 
535977Smax.romanov@gmail.com             session = context.getSession(request_session_id);
536977Smax.romanov@gmail.com         }
537977Smax.romanov@gmail.com 
538977Smax.romanov@gmail.com         if (session != null || !create) {
539977Smax.romanov@gmail.com             trace("getSession(" + create + "): " + (session != null ? session.getId() : "null"));
540977Smax.romanov@gmail.com 
541977Smax.romanov@gmail.com             return session;
542977Smax.romanov@gmail.com         }
543977Smax.romanov@gmail.com 
544977Smax.romanov@gmail.com         session = context.createSession();
545977Smax.romanov@gmail.com 
546977Smax.romanov@gmail.com         if (context.getEffectiveSessionTrackingModes().contains(
547977Smax.romanov@gmail.com             SessionTrackingMode.COOKIE))
548977Smax.romanov@gmail.com         {
549977Smax.romanov@gmail.com             setSessionIdCookie();
550977Smax.romanov@gmail.com         }
551977Smax.romanov@gmail.com 
552977Smax.romanov@gmail.com         trace("getSession(" + create + "): " + session.getId());
553977Smax.romanov@gmail.com 
554977Smax.romanov@gmail.com         return session;
555977Smax.romanov@gmail.com     }
556977Smax.romanov@gmail.com 
setSessionIdCookie()557977Smax.romanov@gmail.com     private void setSessionIdCookie()
558977Smax.romanov@gmail.com     {
559977Smax.romanov@gmail.com         SessionCookieConfig config = context.getSessionCookieConfig();
560977Smax.romanov@gmail.com 
561977Smax.romanov@gmail.com         Cookie c = new Cookie(config.getName(), session.getId());
562977Smax.romanov@gmail.com 
563977Smax.romanov@gmail.com         c.setComment(config.getComment());
564977Smax.romanov@gmail.com         if (!StringUtil.isBlank(config.getDomain())) {
565977Smax.romanov@gmail.com             c.setDomain(config.getDomain());
566977Smax.romanov@gmail.com         }
567977Smax.romanov@gmail.com 
568977Smax.romanov@gmail.com         c.setHttpOnly(config.isHttpOnly());
569977Smax.romanov@gmail.com         if (!StringUtil.isBlank(config.getPath())) {
570977Smax.romanov@gmail.com             c.setPath(config.getPath());
571977Smax.romanov@gmail.com         }
572977Smax.romanov@gmail.com 
573977Smax.romanov@gmail.com         c.setMaxAge(config.getMaxAge());
574977Smax.romanov@gmail.com 
575977Smax.romanov@gmail.com         getResponse(req_info_ptr).addSessionIdCookie(c);
576977Smax.romanov@gmail.com     }
577977Smax.romanov@gmail.com 
578977Smax.romanov@gmail.com     @Override
getUserPrincipal()579977Smax.romanov@gmail.com     public Principal getUserPrincipal()
580977Smax.romanov@gmail.com     {
581977Smax.romanov@gmail.com         log("getUserPrincipal");
582977Smax.romanov@gmail.com 
583977Smax.romanov@gmail.com         return null;
584977Smax.romanov@gmail.com     }
585977Smax.romanov@gmail.com 
586977Smax.romanov@gmail.com     @Override
isRequestedSessionIdFromCookie()587977Smax.romanov@gmail.com     public boolean isRequestedSessionIdFromCookie()
588977Smax.romanov@gmail.com     {
589977Smax.romanov@gmail.com         trace("isRequestedSessionIdFromCookie");
590977Smax.romanov@gmail.com 
591977Smax.romanov@gmail.com         if (!request_session_id_parsed) {
592977Smax.romanov@gmail.com             parseRequestSessionId();
593977Smax.romanov@gmail.com         }
594977Smax.romanov@gmail.com 
595977Smax.romanov@gmail.com         return request_session_id_from_cookie;
596977Smax.romanov@gmail.com     }
597977Smax.romanov@gmail.com 
598977Smax.romanov@gmail.com     @Override
599977Smax.romanov@gmail.com     @Deprecated
isRequestedSessionIdFromUrl()600977Smax.romanov@gmail.com     public boolean isRequestedSessionIdFromUrl()
601977Smax.romanov@gmail.com     {
602977Smax.romanov@gmail.com         trace("isRequestedSessionIdFromUrl");
603977Smax.romanov@gmail.com 
604977Smax.romanov@gmail.com         if (!request_session_id_parsed) {
605977Smax.romanov@gmail.com             parseRequestSessionId();
606977Smax.romanov@gmail.com         }
607977Smax.romanov@gmail.com 
608977Smax.romanov@gmail.com         return request_session_id_from_url;
609977Smax.romanov@gmail.com     }
610977Smax.romanov@gmail.com 
611977Smax.romanov@gmail.com     @Override
isRequestedSessionIdFromURL()612977Smax.romanov@gmail.com     public boolean isRequestedSessionIdFromURL()
613977Smax.romanov@gmail.com     {
614977Smax.romanov@gmail.com         trace("isRequestedSessionIdFromURL");
615977Smax.romanov@gmail.com 
616977Smax.romanov@gmail.com         if (!request_session_id_parsed) {
617977Smax.romanov@gmail.com             parseRequestSessionId();
618977Smax.romanov@gmail.com         }
619977Smax.romanov@gmail.com 
620977Smax.romanov@gmail.com         return request_session_id_from_url;
621977Smax.romanov@gmail.com     }
622977Smax.romanov@gmail.com 
623977Smax.romanov@gmail.com     @Override
isRequestedSessionIdValid()624977Smax.romanov@gmail.com     public boolean isRequestedSessionIdValid()
625977Smax.romanov@gmail.com     {
626977Smax.romanov@gmail.com         trace("isRequestedSessionIdValid");
627977Smax.romanov@gmail.com 
628977Smax.romanov@gmail.com         if (!request_session_id_parsed) {
629977Smax.romanov@gmail.com             parseRequestSessionId();
630977Smax.romanov@gmail.com         }
631977Smax.romanov@gmail.com 
632977Smax.romanov@gmail.com         return context.isSessionIdValid(request_session_id);
633977Smax.romanov@gmail.com     }
634977Smax.romanov@gmail.com 
635977Smax.romanov@gmail.com     @Override
isUserInRole(String role)636977Smax.romanov@gmail.com     public boolean isUserInRole(String role)
637977Smax.romanov@gmail.com     {
638977Smax.romanov@gmail.com         log("isUserInRole: " + role);
639977Smax.romanov@gmail.com 
640977Smax.romanov@gmail.com         return false;
641977Smax.romanov@gmail.com     }
642977Smax.romanov@gmail.com 
643977Smax.romanov@gmail.com     @Override
login(String username, String password)644977Smax.romanov@gmail.com     public void login(String username, String password) throws ServletException
645977Smax.romanov@gmail.com     {
646977Smax.romanov@gmail.com         log("login: " + username + "," + password);
647977Smax.romanov@gmail.com     }
648977Smax.romanov@gmail.com 
649977Smax.romanov@gmail.com     @Override
logout()650977Smax.romanov@gmail.com     public void logout() throws ServletException
651977Smax.romanov@gmail.com     {
652977Smax.romanov@gmail.com         log("logout");
653977Smax.romanov@gmail.com     }
654977Smax.romanov@gmail.com 
655977Smax.romanov@gmail.com 
656977Smax.romanov@gmail.com     @Override
getAsyncContext()657977Smax.romanov@gmail.com     public AsyncContext getAsyncContext()
658977Smax.romanov@gmail.com     {
659977Smax.romanov@gmail.com         log("getAsyncContext");
660977Smax.romanov@gmail.com 
661977Smax.romanov@gmail.com         return null;
662977Smax.romanov@gmail.com     }
663977Smax.romanov@gmail.com 
664977Smax.romanov@gmail.com     @Override
getAttribute(String name)665977Smax.romanov@gmail.com     public Object getAttribute(String name)
666977Smax.romanov@gmail.com     {
667977Smax.romanov@gmail.com         if (BARE.equals(name)) {
668977Smax.romanov@gmail.com             return this;
669977Smax.romanov@gmail.com         }
670977Smax.romanov@gmail.com 
671977Smax.romanov@gmail.com         Object o = attributes.get(name);
672977Smax.romanov@gmail.com 
673977Smax.romanov@gmail.com         trace("getAttribute: " + name + " = " + o);
674977Smax.romanov@gmail.com 
675977Smax.romanov@gmail.com         return o;
676977Smax.romanov@gmail.com     }
677977Smax.romanov@gmail.com 
678977Smax.romanov@gmail.com     @Override
getAttributeNames()679977Smax.romanov@gmail.com     public Enumeration<String> getAttributeNames()
680977Smax.romanov@gmail.com     {
681977Smax.romanov@gmail.com         trace("getAttributeNames");
682977Smax.romanov@gmail.com 
683977Smax.romanov@gmail.com         Set<String> names = attributes.keySet();
684977Smax.romanov@gmail.com         return Collections.enumeration(names);
685977Smax.romanov@gmail.com     }
686977Smax.romanov@gmail.com 
687977Smax.romanov@gmail.com     @Override
getCharacterEncoding()688977Smax.romanov@gmail.com     public String getCharacterEncoding()
689977Smax.romanov@gmail.com     {
690977Smax.romanov@gmail.com         trace("getCharacterEncoding");
691977Smax.romanov@gmail.com 
692977Smax.romanov@gmail.com         if (characterEncoding != null) {
693977Smax.romanov@gmail.com             return characterEncoding;
694977Smax.romanov@gmail.com         }
695977Smax.romanov@gmail.com 
696977Smax.romanov@gmail.com         getContentType();
697977Smax.romanov@gmail.com 
698977Smax.romanov@gmail.com         return characterEncoding;
699977Smax.romanov@gmail.com     }
700977Smax.romanov@gmail.com 
701977Smax.romanov@gmail.com     @Override
getContentLength()702977Smax.romanov@gmail.com     public int getContentLength()
703977Smax.romanov@gmail.com     {
704977Smax.romanov@gmail.com         trace("getContentLength");
705977Smax.romanov@gmail.com 
706977Smax.romanov@gmail.com         return (int) getContentLength(req_ptr);
707977Smax.romanov@gmail.com     }
708977Smax.romanov@gmail.com 
getContentLength(long req_ptr)709977Smax.romanov@gmail.com     private static native long getContentLength(long req_ptr);
710977Smax.romanov@gmail.com 
711977Smax.romanov@gmail.com     @Override
getContentLengthLong()712977Smax.romanov@gmail.com     public long getContentLengthLong()
713977Smax.romanov@gmail.com     {
714977Smax.romanov@gmail.com         trace("getContentLengthLong");
715977Smax.romanov@gmail.com 
716977Smax.romanov@gmail.com         return getContentLength(req_ptr);
717977Smax.romanov@gmail.com     }
718977Smax.romanov@gmail.com 
719977Smax.romanov@gmail.com     @Override
getContentType()720977Smax.romanov@gmail.com     public String getContentType()
721977Smax.romanov@gmail.com     {
722977Smax.romanov@gmail.com         trace("getContentType");
723977Smax.romanov@gmail.com 
724977Smax.romanov@gmail.com         String content_type = getContentType(req_ptr);
725977Smax.romanov@gmail.com 
726977Smax.romanov@gmail.com         if (characterEncoding == null && content_type != null) {
727977Smax.romanov@gmail.com             MimeTypes.Type mime = MimeTypes.CACHE.get(content_type);
728977Smax.romanov@gmail.com             String charset = (mime == null || mime.getCharset() == null) ? MimeTypes.getCharsetFromContentType(content_type) : mime.getCharset().toString();
729977Smax.romanov@gmail.com             if (charset != null) {
730977Smax.romanov@gmail.com                 characterEncoding = charset;
731977Smax.romanov@gmail.com             }
732977Smax.romanov@gmail.com         }
733977Smax.romanov@gmail.com 
734977Smax.romanov@gmail.com         return content_type;
735977Smax.romanov@gmail.com     }
736977Smax.romanov@gmail.com 
getContentType(long req_ptr)737977Smax.romanov@gmail.com     private static native String getContentType(long req_ptr);
738977Smax.romanov@gmail.com 
739977Smax.romanov@gmail.com 
740977Smax.romanov@gmail.com     @Override
getDispatcherType()741977Smax.romanov@gmail.com     public DispatcherType getDispatcherType()
742977Smax.romanov@gmail.com     {
743977Smax.romanov@gmail.com         trace("getDispatcherType: " + dispatcher_type);
744977Smax.romanov@gmail.com 
745977Smax.romanov@gmail.com         return dispatcher_type;
746977Smax.romanov@gmail.com     }
747977Smax.romanov@gmail.com 
748977Smax.romanov@gmail.com     @Override
setDispatcherType(DispatcherType type)749977Smax.romanov@gmail.com     public void setDispatcherType(DispatcherType type)
750977Smax.romanov@gmail.com     {
751977Smax.romanov@gmail.com         trace("setDispatcherType: " + type);
752977Smax.romanov@gmail.com 
753977Smax.romanov@gmail.com         dispatcher_type = type;
754977Smax.romanov@gmail.com     }
755977Smax.romanov@gmail.com 
756977Smax.romanov@gmail.com     @Override
getInputStream()757977Smax.romanov@gmail.com     public ServletInputStream getInputStream() throws IOException
758977Smax.romanov@gmail.com     {
759977Smax.romanov@gmail.com         trace("getInputStream");
760977Smax.romanov@gmail.com 
761977Smax.romanov@gmail.com         if (reader != null) {
762977Smax.romanov@gmail.com             throw new IllegalStateException("getInputStream: getReader() already used");
763977Smax.romanov@gmail.com         }
764977Smax.romanov@gmail.com 
765977Smax.romanov@gmail.com         if (inputStream == null) {
766977Smax.romanov@gmail.com             inputStream = new InputStream(req_info_ptr);
767977Smax.romanov@gmail.com         }
768977Smax.romanov@gmail.com 
769977Smax.romanov@gmail.com         return inputStream;
770977Smax.romanov@gmail.com     }
771977Smax.romanov@gmail.com 
772977Smax.romanov@gmail.com     @Override
getLocalAddr()773977Smax.romanov@gmail.com     public String getLocalAddr()
774977Smax.romanov@gmail.com     {
775977Smax.romanov@gmail.com         trace("getLocalAddr");
776977Smax.romanov@gmail.com 
777977Smax.romanov@gmail.com         return getLocalAddr(req_ptr);
778977Smax.romanov@gmail.com     }
779977Smax.romanov@gmail.com 
getLocalAddr(long req_ptr)780977Smax.romanov@gmail.com     private static native String getLocalAddr(long req_ptr);
781977Smax.romanov@gmail.com 
782977Smax.romanov@gmail.com 
783977Smax.romanov@gmail.com     @Override
getLocale()784977Smax.romanov@gmail.com     public Locale getLocale()
785977Smax.romanov@gmail.com     {
786977Smax.romanov@gmail.com         log("getLocale");
787977Smax.romanov@gmail.com 
788977Smax.romanov@gmail.com         return Locale.getDefault();
789977Smax.romanov@gmail.com     }
790977Smax.romanov@gmail.com 
791977Smax.romanov@gmail.com     @Override
getLocales()792977Smax.romanov@gmail.com     public Enumeration<Locale> getLocales()
793977Smax.romanov@gmail.com     {
794977Smax.romanov@gmail.com         log("getLocales");
795977Smax.romanov@gmail.com 
796977Smax.romanov@gmail.com         return Collections.emptyEnumeration();
797977Smax.romanov@gmail.com     }
798977Smax.romanov@gmail.com 
799977Smax.romanov@gmail.com     @Override
getLocalName()800977Smax.romanov@gmail.com     public String getLocalName()
801977Smax.romanov@gmail.com     {
802977Smax.romanov@gmail.com         trace("getLocalName");
803977Smax.romanov@gmail.com 
804977Smax.romanov@gmail.com         return getLocalName(req_ptr);
805977Smax.romanov@gmail.com     }
806977Smax.romanov@gmail.com 
getLocalName(long req_ptr)807977Smax.romanov@gmail.com     private static native String getLocalName(long req_ptr);
808977Smax.romanov@gmail.com 
809977Smax.romanov@gmail.com 
810977Smax.romanov@gmail.com     @Override
getLocalPort()811977Smax.romanov@gmail.com     public int getLocalPort()
812977Smax.romanov@gmail.com     {
813977Smax.romanov@gmail.com         trace("getLocalPort");
814977Smax.romanov@gmail.com 
815977Smax.romanov@gmail.com         return getLocalPort(req_ptr);
816977Smax.romanov@gmail.com     }
817977Smax.romanov@gmail.com 
getLocalPort(long req_ptr)818977Smax.romanov@gmail.com     private static native int getLocalPort(long req_ptr);
819977Smax.romanov@gmail.com 
820977Smax.romanov@gmail.com 
getParameters()821977Smax.romanov@gmail.com     public MultiMap<String> getParameters()
822977Smax.romanov@gmail.com     {
823977Smax.romanov@gmail.com         if (parameters != null) {
824977Smax.romanov@gmail.com             return parameters;
825977Smax.romanov@gmail.com         }
826977Smax.romanov@gmail.com 
827977Smax.romanov@gmail.com         parameters = new MultiMap<>();
828977Smax.romanov@gmail.com 
829977Smax.romanov@gmail.com         String query = getQueryString();
830977Smax.romanov@gmail.com 
831977Smax.romanov@gmail.com         if (query != null) {
832977Smax.romanov@gmail.com             UrlEncoded.decodeUtf8To(query, parameters);
833977Smax.romanov@gmail.com         }
834977Smax.romanov@gmail.com 
8351121Smax.romanov@nginx.com         int content_length = getContentLength();
8361121Smax.romanov@nginx.com 
8371121Smax.romanov@nginx.com         if (content_length == 0 || !getMethod().equals("POST")) {
8381121Smax.romanov@nginx.com             return parameters;
8391121Smax.romanov@nginx.com         }
8401121Smax.romanov@nginx.com 
8411121Smax.romanov@nginx.com         String content_type = getContentType();
8421121Smax.romanov@nginx.com 
8431121Smax.romanov@nginx.com         try {
8441121Smax.romanov@nginx.com             if (content_type.startsWith("application/x-www-form-urlencoded")) {
845977Smax.romanov@gmail.com                 UrlEncoded.decodeUtf8To(new InputStream(req_info_ptr),
8461121Smax.romanov@nginx.com                     parameters, content_length, -1);
8471121Smax.romanov@nginx.com             } else if (checkMultiPart(content_type) && multipart_config != null) {
8481121Smax.romanov@nginx.com                 if (multi_parts == null) {
8491121Smax.romanov@nginx.com                     parseMultiParts(content_type);
8501121Smax.romanov@nginx.com                 }
8511121Smax.romanov@nginx.com 
8521121Smax.romanov@nginx.com                 if (multi_parts != null) {
8531121Smax.romanov@nginx.com                     Collection<Part> parts = multi_parts.getParts();
8541121Smax.romanov@nginx.com 
8551121Smax.romanov@nginx.com                     String _charset_ = null;
8561121Smax.romanov@nginx.com                     Part charset_part = multi_parts.getPart("_charset_");
8571121Smax.romanov@nginx.com                     if (charset_part != null) {
8581121Smax.romanov@nginx.com                         try (java.io.InputStream is = charset_part.getInputStream())
8591121Smax.romanov@nginx.com                         {
8601121Smax.romanov@nginx.com                             ByteArrayOutputStream os = new ByteArrayOutputStream();
8611121Smax.romanov@nginx.com                             IO.copy(is, os);
8621121Smax.romanov@nginx.com                             _charset_ = new String(os.toByteArray(),StandardCharsets.UTF_8);
8631121Smax.romanov@nginx.com                         }
8641121Smax.romanov@nginx.com                     }
8651121Smax.romanov@nginx.com 
8661121Smax.romanov@nginx.com                     /*
8671121Smax.romanov@nginx.com                     Select Charset to use for this part. (NOTE: charset behavior is for the part value only and not the part header/field names)
8681121Smax.romanov@nginx.com                         1. Use the part specific charset as provided in that part's Content-Type header; else
8691121Smax.romanov@nginx.com                         2. Use the overall default charset. Determined by:
8701121Smax.romanov@nginx.com                             a. if part name _charset_ exists, use that part's value.
8711121Smax.romanov@nginx.com                             b. if the request.getCharacterEncoding() returns a value, use that.
8721121Smax.romanov@nginx.com                                 (note, this can be either from the charset field on the request Content-Type
8731121Smax.romanov@nginx.com                                 header, or from a manual call to request.setCharacterEncoding())
8741121Smax.romanov@nginx.com                             c. use utf-8.
8751121Smax.romanov@nginx.com                      */
8761121Smax.romanov@nginx.com                     Charset def_charset;
8771121Smax.romanov@nginx.com                     if (_charset_ != null) {
8781121Smax.romanov@nginx.com                         def_charset = Charset.forName(_charset_);
8791121Smax.romanov@nginx.com                     } else if (getCharacterEncoding() != null) {
8801121Smax.romanov@nginx.com                         def_charset = Charset.forName(getCharacterEncoding());
8811121Smax.romanov@nginx.com                     } else {
8821121Smax.romanov@nginx.com                         def_charset = StandardCharsets.UTF_8;
8831121Smax.romanov@nginx.com                     }
8841121Smax.romanov@nginx.com 
8851121Smax.romanov@nginx.com                     ByteArrayOutputStream os = null;
8861121Smax.romanov@nginx.com                     for (Part p : parts) {
8871121Smax.romanov@nginx.com                         if (p.getSubmittedFileName() != null) {
8881121Smax.romanov@nginx.com                             continue;
8891121Smax.romanov@nginx.com                         }
8901121Smax.romanov@nginx.com 
8911121Smax.romanov@nginx.com                         // Servlet Spec 3.0 pg 23, parts without filename must be put into params.
8921121Smax.romanov@nginx.com                         String charset = null;
8931121Smax.romanov@nginx.com                         if (p.getContentType() != null) {
8941121Smax.romanov@nginx.com                             charset = MimeTypes.getCharsetFromContentType(p.getContentType());
8951121Smax.romanov@nginx.com                         }
8961121Smax.romanov@nginx.com 
8971121Smax.romanov@nginx.com                         try (java.io.InputStream is = p.getInputStream())
8981121Smax.romanov@nginx.com                         {
8991121Smax.romanov@nginx.com                             if (os == null) {
9001121Smax.romanov@nginx.com                                 os = new ByteArrayOutputStream();
9011121Smax.romanov@nginx.com                             }
9021121Smax.romanov@nginx.com                             IO.copy(is, os);
9031121Smax.romanov@nginx.com 
9041121Smax.romanov@nginx.com                             String content = new String(os.toByteArray(), charset == null ? def_charset : Charset.forName(charset));
9051121Smax.romanov@nginx.com                             parameters.add(p.getName(), content);
9061121Smax.romanov@nginx.com                         }
9071121Smax.romanov@nginx.com                         os.reset();
9081121Smax.romanov@nginx.com                     }
9091121Smax.romanov@nginx.com                 }
910977Smax.romanov@gmail.com             }
9111121Smax.romanov@nginx.com         } catch (IOException e) {
9121121Smax.romanov@nginx.com             log("Unhandled IOException: " + e);
913977Smax.romanov@gmail.com         }
914977Smax.romanov@gmail.com 
915977Smax.romanov@gmail.com         return parameters;
916977Smax.romanov@gmail.com     }
917977Smax.romanov@gmail.com 
setParameters(MultiMap<String> p)918977Smax.romanov@gmail.com     public void setParameters(MultiMap<String> p)
919977Smax.romanov@gmail.com     {
920977Smax.romanov@gmail.com         parameters = p;
921977Smax.romanov@gmail.com     }
922977Smax.romanov@gmail.com 
923977Smax.romanov@gmail.com     @Override
getParameter(String name)924977Smax.romanov@gmail.com     public String getParameter(String name)
925977Smax.romanov@gmail.com     {
926977Smax.romanov@gmail.com         trace("getParameter: " + name);
927977Smax.romanov@gmail.com 
928977Smax.romanov@gmail.com         return getParameters().getValue(name, 0);
929977Smax.romanov@gmail.com     }
930977Smax.romanov@gmail.com 
931977Smax.romanov@gmail.com     @Override
getParameterMap()932977Smax.romanov@gmail.com     public Map<String,String[]> getParameterMap()
933977Smax.romanov@gmail.com     {
934977Smax.romanov@gmail.com         trace("getParameterMap");
935977Smax.romanov@gmail.com 
936977Smax.romanov@gmail.com         return Collections.unmodifiableMap(getParameters().toStringArrayMap());
937977Smax.romanov@gmail.com     }
938977Smax.romanov@gmail.com 
939977Smax.romanov@gmail.com     @Override
getParameterNames()940977Smax.romanov@gmail.com     public Enumeration<String> getParameterNames()
941977Smax.romanov@gmail.com     {
942977Smax.romanov@gmail.com         trace("getParameterNames");
943977Smax.romanov@gmail.com 
944977Smax.romanov@gmail.com         return Collections.enumeration(getParameters().keySet());
945977Smax.romanov@gmail.com     }
946977Smax.romanov@gmail.com 
947977Smax.romanov@gmail.com     @Override
getParameterValues(String name)948977Smax.romanov@gmail.com     public String[] getParameterValues(String name)
949977Smax.romanov@gmail.com     {
950977Smax.romanov@gmail.com         trace("getParameterValues: " + name);
951977Smax.romanov@gmail.com 
952977Smax.romanov@gmail.com         List<String> vals = getParameters().getValues(name);
953977Smax.romanov@gmail.com         if (vals == null)
954977Smax.romanov@gmail.com             return null;
955977Smax.romanov@gmail.com         return vals.toArray(new String[vals.size()]);
956977Smax.romanov@gmail.com     }
957977Smax.romanov@gmail.com 
958977Smax.romanov@gmail.com     @Override
getProtocol()959977Smax.romanov@gmail.com     public String getProtocol()
960977Smax.romanov@gmail.com     {
961977Smax.romanov@gmail.com         trace("getProtocol");
962977Smax.romanov@gmail.com 
963977Smax.romanov@gmail.com         return getProtocol(req_ptr);
964977Smax.romanov@gmail.com     }
965977Smax.romanov@gmail.com 
getProtocol(long req_ptr)966977Smax.romanov@gmail.com     private static native String getProtocol(long req_ptr);
967977Smax.romanov@gmail.com 
968977Smax.romanov@gmail.com     @Override
getReader()969977Smax.romanov@gmail.com     public BufferedReader getReader() throws IOException
970977Smax.romanov@gmail.com     {
971977Smax.romanov@gmail.com         trace("getReader");
972977Smax.romanov@gmail.com 
973977Smax.romanov@gmail.com         if (inputStream != null) {
974977Smax.romanov@gmail.com             throw new IllegalStateException("getReader: getInputStream() already used");
975977Smax.romanov@gmail.com         }
976977Smax.romanov@gmail.com 
977977Smax.romanov@gmail.com         if (reader == null) {
978977Smax.romanov@gmail.com             reader = new BufferedReader(new InputStreamReader(new InputStream(req_info_ptr)));
979977Smax.romanov@gmail.com         }
980977Smax.romanov@gmail.com 
981977Smax.romanov@gmail.com         return reader;
982977Smax.romanov@gmail.com     }
983977Smax.romanov@gmail.com 
984977Smax.romanov@gmail.com     @Override
985977Smax.romanov@gmail.com     @Deprecated
getRealPath(String path)986977Smax.romanov@gmail.com     public String getRealPath(String path)
987977Smax.romanov@gmail.com     {
988977Smax.romanov@gmail.com         trace("getRealPath: " + path);
989977Smax.romanov@gmail.com 
990977Smax.romanov@gmail.com         return context.getRealPath(path);
991977Smax.romanov@gmail.com     }
992977Smax.romanov@gmail.com 
993977Smax.romanov@gmail.com     @Override
getRemoteAddr()994977Smax.romanov@gmail.com     public String getRemoteAddr()
995977Smax.romanov@gmail.com     {
996977Smax.romanov@gmail.com         String res = getRemoteAddr(req_ptr);
997977Smax.romanov@gmail.com 
998977Smax.romanov@gmail.com         trace("getRemoteAddr: " + res);
999977Smax.romanov@gmail.com 
1000977Smax.romanov@gmail.com         return res;
1001977Smax.romanov@gmail.com     }
1002977Smax.romanov@gmail.com 
getRemoteAddr(long req_ptr)1003977Smax.romanov@gmail.com     private static native String getRemoteAddr(long req_ptr);
1004977Smax.romanov@gmail.com 
1005977Smax.romanov@gmail.com 
1006977Smax.romanov@gmail.com     @Override
getRemoteHost()1007977Smax.romanov@gmail.com     public String getRemoteHost()
1008977Smax.romanov@gmail.com     {
1009977Smax.romanov@gmail.com         String res = getRemoteHost(req_ptr);
1010977Smax.romanov@gmail.com 
1011977Smax.romanov@gmail.com         trace("getRemoteHost: " + res);
1012977Smax.romanov@gmail.com 
1013977Smax.romanov@gmail.com         return res;
1014977Smax.romanov@gmail.com     }
1015977Smax.romanov@gmail.com 
getRemoteHost(long req_ptr)1016977Smax.romanov@gmail.com     private static native String getRemoteHost(long req_ptr);
1017977Smax.romanov@gmail.com 
1018977Smax.romanov@gmail.com 
1019977Smax.romanov@gmail.com     @Override
getRemotePort()1020977Smax.romanov@gmail.com     public int getRemotePort()
1021977Smax.romanov@gmail.com     {
1022977Smax.romanov@gmail.com         int res = getRemotePort(req_ptr);
1023977Smax.romanov@gmail.com 
1024977Smax.romanov@gmail.com         trace("getRemotePort: " + res);
1025977Smax.romanov@gmail.com 
1026977Smax.romanov@gmail.com         return res;
1027977Smax.romanov@gmail.com     }
1028977Smax.romanov@gmail.com 
getRemotePort(long req_ptr)1029977Smax.romanov@gmail.com     private static native int getRemotePort(long req_ptr);
1030977Smax.romanov@gmail.com 
1031977Smax.romanov@gmail.com 
1032977Smax.romanov@gmail.com     @Override
getRequestDispatcher(String path)1033977Smax.romanov@gmail.com     public RequestDispatcher getRequestDispatcher(String path)
1034977Smax.romanov@gmail.com     {
1035977Smax.romanov@gmail.com         trace("getRequestDispatcher: " + path);
1036977Smax.romanov@gmail.com 
1037977Smax.romanov@gmail.com         if (path.startsWith("/")) {
1038977Smax.romanov@gmail.com             return context.getRequestDispatcher(path);
1039977Smax.romanov@gmail.com         }
1040977Smax.romanov@gmail.com 
1041977Smax.romanov@gmail.com         try {
1042977Smax.romanov@gmail.com             URI uri = new URI(getRequestURI());
1043977Smax.romanov@gmail.com             uri = uri.resolve(path);
1044977Smax.romanov@gmail.com 
1045977Smax.romanov@gmail.com             return context.getRequestDispatcher(uri);
1046977Smax.romanov@gmail.com         } catch (URISyntaxException e) {
1047977Smax.romanov@gmail.com             log("getRequestDispatcher: failed to create dispatcher: " + e);
1048977Smax.romanov@gmail.com         }
1049977Smax.romanov@gmail.com 
1050977Smax.romanov@gmail.com         return null;
1051977Smax.romanov@gmail.com     }
1052977Smax.romanov@gmail.com 
1053977Smax.romanov@gmail.com 
1054977Smax.romanov@gmail.com     @Override
getScheme()1055977Smax.romanov@gmail.com     public String getScheme()
1056977Smax.romanov@gmail.com     {
10571054Smax.romanov@nginx.com         trace("getScheme");
1058977Smax.romanov@gmail.com 
1059977Smax.romanov@gmail.com         return getScheme(req_ptr);
1060977Smax.romanov@gmail.com     }
1061977Smax.romanov@gmail.com 
getScheme(long req_ptr)1062977Smax.romanov@gmail.com     private static native String getScheme(long req_ptr);
1063977Smax.romanov@gmail.com 
1064977Smax.romanov@gmail.com 
1065977Smax.romanov@gmail.com     @Override
getServerName()1066977Smax.romanov@gmail.com     public String getServerName()
1067977Smax.romanov@gmail.com     {
1068977Smax.romanov@gmail.com         String res = getServerName(req_ptr);
1069977Smax.romanov@gmail.com 
1070977Smax.romanov@gmail.com         trace("getServerName: " + res);
1071977Smax.romanov@gmail.com 
1072977Smax.romanov@gmail.com         return res;
1073977Smax.romanov@gmail.com     }
1074977Smax.romanov@gmail.com 
getServerName(long req_ptr)1075977Smax.romanov@gmail.com     private static native String getServerName(long req_ptr);
1076977Smax.romanov@gmail.com 
1077977Smax.romanov@gmail.com 
1078977Smax.romanov@gmail.com     @Override
getServerPort()1079977Smax.romanov@gmail.com     public int getServerPort()
1080977Smax.romanov@gmail.com     {
1081977Smax.romanov@gmail.com         int res = getServerPort(req_ptr);
1082977Smax.romanov@gmail.com 
1083977Smax.romanov@gmail.com         trace("getServerPort: " + res);
1084977Smax.romanov@gmail.com 
1085977Smax.romanov@gmail.com         return res;
1086977Smax.romanov@gmail.com     }
1087977Smax.romanov@gmail.com 
getServerPort(long req_ptr)1088977Smax.romanov@gmail.com     private static native int getServerPort(long req_ptr);
1089977Smax.romanov@gmail.com 
1090977Smax.romanov@gmail.com     @Override
getServletContext()1091977Smax.romanov@gmail.com     public ServletContext getServletContext()
1092977Smax.romanov@gmail.com     {
1093977Smax.romanov@gmail.com         trace("getServletContext");
1094977Smax.romanov@gmail.com 
1095977Smax.romanov@gmail.com         return context;
1096977Smax.romanov@gmail.com     }
1097977Smax.romanov@gmail.com 
1098977Smax.romanov@gmail.com     @Override
isAsyncStarted()1099977Smax.romanov@gmail.com     public boolean isAsyncStarted()
1100977Smax.romanov@gmail.com     {
1101977Smax.romanov@gmail.com         log("isAsyncStarted");
1102977Smax.romanov@gmail.com 
1103977Smax.romanov@gmail.com         return false;
1104977Smax.romanov@gmail.com     }
1105977Smax.romanov@gmail.com 
1106977Smax.romanov@gmail.com     @Override
isAsyncSupported()1107977Smax.romanov@gmail.com     public boolean isAsyncSupported()
1108977Smax.romanov@gmail.com     {
1109977Smax.romanov@gmail.com         log("isAsyncSupported");
1110977Smax.romanov@gmail.com 
1111977Smax.romanov@gmail.com         return false;
1112977Smax.romanov@gmail.com     }
1113977Smax.romanov@gmail.com 
1114977Smax.romanov@gmail.com     @Override
isSecure()1115977Smax.romanov@gmail.com     public boolean isSecure()
1116977Smax.romanov@gmail.com     {
11171011Smax.romanov@nginx.com         trace("isSecure");
1118977Smax.romanov@gmail.com 
11191011Smax.romanov@nginx.com         return isSecure(req_ptr);
1120977Smax.romanov@gmail.com     }
1121977Smax.romanov@gmail.com 
isSecure(long req_ptr)11221011Smax.romanov@nginx.com     private static native boolean isSecure(long req_ptr);
11231011Smax.romanov@nginx.com 
1124977Smax.romanov@gmail.com     @Override
removeAttribute(String name)1125977Smax.romanov@gmail.com     public void removeAttribute(String name)
1126977Smax.romanov@gmail.com     {
1127977Smax.romanov@gmail.com         trace("removeAttribute: " + name);
1128977Smax.romanov@gmail.com 
1129977Smax.romanov@gmail.com         Object prev = attributes.remove(name);
1130977Smax.romanov@gmail.com 
1131977Smax.romanov@gmail.com         if (attr_listener == null || prev == null) {
1132977Smax.romanov@gmail.com             return;
1133977Smax.romanov@gmail.com         }
1134977Smax.romanov@gmail.com 
1135977Smax.romanov@gmail.com         attr_listener.attributeRemoved(
1136977Smax.romanov@gmail.com             new ServletRequestAttributeEvent(context, this, name, prev));
1137977Smax.romanov@gmail.com     }
1138977Smax.romanov@gmail.com 
1139977Smax.romanov@gmail.com     @Override
setAttribute(String name, Object o)1140977Smax.romanov@gmail.com     public void setAttribute(String name, Object o)
1141977Smax.romanov@gmail.com     {
1142977Smax.romanov@gmail.com         trace("setAttribute: " + name + ", " + o);
1143977Smax.romanov@gmail.com 
1144977Smax.romanov@gmail.com         Object prev;
1145977Smax.romanov@gmail.com 
1146977Smax.romanov@gmail.com         if (o != null) {
1147977Smax.romanov@gmail.com             prev = attributes.put(name, o);
1148977Smax.romanov@gmail.com         } else {
1149977Smax.romanov@gmail.com             prev = attributes.remove(name);
1150977Smax.romanov@gmail.com         }
1151977Smax.romanov@gmail.com 
1152977Smax.romanov@gmail.com         if (attr_listener == null) {
1153977Smax.romanov@gmail.com             return;
1154977Smax.romanov@gmail.com         }
1155977Smax.romanov@gmail.com 
1156977Smax.romanov@gmail.com         if (prev == null) {
1157977Smax.romanov@gmail.com             if (o == null) {
1158977Smax.romanov@gmail.com                 return;
1159977Smax.romanov@gmail.com             }
1160977Smax.romanov@gmail.com 
1161977Smax.romanov@gmail.com             attr_listener.attributeAdded(new ServletRequestAttributeEvent(
1162977Smax.romanov@gmail.com                 context, this, name, o));
1163977Smax.romanov@gmail.com         } else {
1164977Smax.romanov@gmail.com             if (o != null) {
1165977Smax.romanov@gmail.com                 attr_listener.attributeReplaced(
1166977Smax.romanov@gmail.com                     new ServletRequestAttributeEvent(context, this, name, prev));
1167977Smax.romanov@gmail.com             } else {
1168977Smax.romanov@gmail.com                 attr_listener.attributeRemoved(
1169977Smax.romanov@gmail.com                     new ServletRequestAttributeEvent(context, this, name, prev));
1170977Smax.romanov@gmail.com             }
1171977Smax.romanov@gmail.com         }
1172977Smax.romanov@gmail.com     }
1173977Smax.romanov@gmail.com 
setAttribute_(String name, Object o)1174977Smax.romanov@gmail.com     public void setAttribute_(String name, Object o)
1175977Smax.romanov@gmail.com     {
1176977Smax.romanov@gmail.com         trace("setAttribute_: " + name + ", " + o);
1177977Smax.romanov@gmail.com 
1178977Smax.romanov@gmail.com         if (o != null) {
1179977Smax.romanov@gmail.com             attributes.put(name, o);
1180977Smax.romanov@gmail.com         } else {
1181977Smax.romanov@gmail.com             attributes.remove(name);
1182977Smax.romanov@gmail.com         }
1183977Smax.romanov@gmail.com     }
1184977Smax.romanov@gmail.com 
1185977Smax.romanov@gmail.com     @Override
setCharacterEncoding(String env)1186977Smax.romanov@gmail.com     public void setCharacterEncoding(String env) throws UnsupportedEncodingException
1187977Smax.romanov@gmail.com     {
1188977Smax.romanov@gmail.com         trace("setCharacterEncoding: " + env);
1189977Smax.romanov@gmail.com 
1190977Smax.romanov@gmail.com         characterEncoding = env;
1191977Smax.romanov@gmail.com     }
1192977Smax.romanov@gmail.com 
1193977Smax.romanov@gmail.com     @Override
startAsync()1194977Smax.romanov@gmail.com     public AsyncContext startAsync() throws IllegalStateException
1195977Smax.romanov@gmail.com     {
1196977Smax.romanov@gmail.com         log("startAsync");
1197977Smax.romanov@gmail.com 
1198977Smax.romanov@gmail.com         return null;
1199977Smax.romanov@gmail.com     }
1200977Smax.romanov@gmail.com 
1201977Smax.romanov@gmail.com     @Override
startAsync(ServletRequest servletRequest, ServletResponse servletResponse)1202977Smax.romanov@gmail.com     public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws IllegalStateException
1203977Smax.romanov@gmail.com     {
1204977Smax.romanov@gmail.com         log("startAsync(Req, resp)");
1205977Smax.romanov@gmail.com 
1206977Smax.romanov@gmail.com         return null;
1207977Smax.romanov@gmail.com     }
1208977Smax.romanov@gmail.com 
1209977Smax.romanov@gmail.com     @Override
upgrade( Class<T> httpUpgradeHandlerClass)1210977Smax.romanov@gmail.com     public <T extends HttpUpgradeHandler> T upgrade(
1211977Smax.romanov@gmail.com             Class<T> httpUpgradeHandlerClass) throws java.io.IOException, ServletException
1212977Smax.romanov@gmail.com     {
1213*1157Smax.romanov@nginx.com         trace("upgrade: " + httpUpgradeHandlerClass.getName());
1214*1157Smax.romanov@nginx.com 
1215*1157Smax.romanov@nginx.com         T handler;
1216*1157Smax.romanov@nginx.com 
1217*1157Smax.romanov@nginx.com         try {
1218*1157Smax.romanov@nginx.com             handler = httpUpgradeHandlerClass.getConstructor().newInstance();
1219*1157Smax.romanov@nginx.com         } catch (Exception e) {
1220*1157Smax.romanov@nginx.com             throw new ServletException(e);
1221*1157Smax.romanov@nginx.com         }
1222*1157Smax.romanov@nginx.com 
1223*1157Smax.romanov@nginx.com         upgrade(req_info_ptr);
1224977Smax.romanov@gmail.com 
1225*1157Smax.romanov@nginx.com         return handler;
1226977Smax.romanov@gmail.com     }
1227977Smax.romanov@gmail.com 
upgrade(long req_info_ptr)1228*1157Smax.romanov@nginx.com     private static native void upgrade(long req_info_ptr);
1229*1157Smax.romanov@nginx.com 
isUpgrade()1230*1157Smax.romanov@nginx.com     public boolean isUpgrade()
1231*1157Smax.romanov@nginx.com     {
1232*1157Smax.romanov@nginx.com         return isUpgrade(req_info_ptr);
1233*1157Smax.romanov@nginx.com     }
1234*1157Smax.romanov@nginx.com 
isUpgrade(long req_info_ptr)1235*1157Smax.romanov@nginx.com     private static native boolean isUpgrade(long req_info_ptr);
1236*1157Smax.romanov@nginx.com 
1237977Smax.romanov@gmail.com     @Override
changeSessionId()1238977Smax.romanov@gmail.com     public String changeSessionId()
1239977Smax.romanov@gmail.com     {
1240977Smax.romanov@gmail.com         trace("changeSessionId");
1241977Smax.romanov@gmail.com 
1242977Smax.romanov@gmail.com         getSession(false);
1243977Smax.romanov@gmail.com 
1244977Smax.romanov@gmail.com         if (session == null) {
1245977Smax.romanov@gmail.com             return null;
1246977Smax.romanov@gmail.com         }
1247977Smax.romanov@gmail.com 
1248977Smax.romanov@gmail.com         context.changeSessionId(session);
1249977Smax.romanov@gmail.com 
1250977Smax.romanov@gmail.com         if (context.getEffectiveSessionTrackingModes().contains(
1251977Smax.romanov@gmail.com             SessionTrackingMode.COOKIE))
1252977Smax.romanov@gmail.com         {
1253977Smax.romanov@gmail.com             setSessionIdCookie();
1254977Smax.romanov@gmail.com         }
1255977Smax.romanov@gmail.com 
1256977Smax.romanov@gmail.com         return session.getId();
1257977Smax.romanov@gmail.com     }
1258977Smax.romanov@gmail.com 
log(String msg)1259977Smax.romanov@gmail.com     private void log(String msg)
1260977Smax.romanov@gmail.com     {
1261977Smax.romanov@gmail.com         msg = "Request." + msg;
1262977Smax.romanov@gmail.com         log(req_info_ptr, msg, msg.length());
1263977Smax.romanov@gmail.com     }
1264977Smax.romanov@gmail.com 
log(long req_info_ptr, String msg, int msg_len)1265977Smax.romanov@gmail.com     public static native void log(long req_info_ptr, String msg, int msg_len);
1266977Smax.romanov@gmail.com 
1267977Smax.romanov@gmail.com 
trace(String msg)1268977Smax.romanov@gmail.com     private void trace(String msg)
1269977Smax.romanov@gmail.com     {
1270977Smax.romanov@gmail.com         msg = "Request." + msg;
1271977Smax.romanov@gmail.com         trace(req_info_ptr, msg, msg.length());
1272977Smax.romanov@gmail.com     }
1273977Smax.romanov@gmail.com 
trace(long req_info_ptr, String msg, int msg_len)1274977Smax.romanov@gmail.com     public static native void trace(long req_info_ptr, String msg, int msg_len);
1275977Smax.romanov@gmail.com 
getResponse(long req_info_ptr)1276977Smax.romanov@gmail.com     private static native Response getResponse(long req_info_ptr);
1277*1157Smax.romanov@nginx.com 
1278*1157Smax.romanov@nginx.com 
setWsSession(WsSession s)1279*1157Smax.romanov@nginx.com     public void setWsSession(WsSession s)
1280*1157Smax.romanov@nginx.com     {
1281*1157Smax.romanov@nginx.com         wsSession = s;
1282*1157Smax.romanov@nginx.com     }
1283*1157Smax.romanov@nginx.com 
processWsFrame(ByteBuffer buf, byte opCode, boolean last)1284*1157Smax.romanov@nginx.com     private void processWsFrame(ByteBuffer buf, byte opCode, boolean last)
1285*1157Smax.romanov@nginx.com         throws IOException
1286*1157Smax.romanov@nginx.com     {
1287*1157Smax.romanov@nginx.com         trace("processWsFrame: " + opCode + ", [" + buf.position() + ", " + buf.limit() + "]");
1288*1157Smax.romanov@nginx.com         try {
1289*1157Smax.romanov@nginx.com             wsSession.processFrame(buf, opCode, last);
1290*1157Smax.romanov@nginx.com         } catch (WsIOException e) {
1291*1157Smax.romanov@nginx.com             wsSession.onClose(e.getCloseReason());
1292*1157Smax.romanov@nginx.com         }
1293*1157Smax.romanov@nginx.com     }
1294*1157Smax.romanov@nginx.com 
closeWsSession()1295*1157Smax.romanov@nginx.com     private void closeWsSession()
1296*1157Smax.romanov@nginx.com     {
1297*1157Smax.romanov@nginx.com         trace("closeWsSession");
1298*1157Smax.romanov@nginx.com         skip_close_ws = true;
1299*1157Smax.romanov@nginx.com 
1300*1157Smax.romanov@nginx.com         wsSession.onClose();
1301*1157Smax.romanov@nginx.com     }
1302*1157Smax.romanov@nginx.com 
sendWsFrame(ByteBuffer payload, byte opCode, boolean last, long timeoutExpiry)1303*1157Smax.romanov@nginx.com     public void sendWsFrame(ByteBuffer payload, byte opCode, boolean last,
1304*1157Smax.romanov@nginx.com         long timeoutExpiry) throws IOException
1305*1157Smax.romanov@nginx.com     {
1306*1157Smax.romanov@nginx.com         trace("sendWsFrame: " + opCode + ", [" + payload.position() +
1307*1157Smax.romanov@nginx.com               ", " + payload.limit() + "]");
1308*1157Smax.romanov@nginx.com 
1309*1157Smax.romanov@nginx.com         if (payload.isDirect()) {
1310*1157Smax.romanov@nginx.com             sendWsFrame(req_info_ptr, payload, payload.position(),
1311*1157Smax.romanov@nginx.com                         payload.limit() - payload.position(), opCode, last);
1312*1157Smax.romanov@nginx.com         } else {
1313*1157Smax.romanov@nginx.com             sendWsFrame(req_info_ptr, payload.array(), payload.position(),
1314*1157Smax.romanov@nginx.com                         payload.limit() - payload.position(), opCode, last);
1315*1157Smax.romanov@nginx.com         }
1316*1157Smax.romanov@nginx.com     }
1317*1157Smax.romanov@nginx.com 
sendWsFrame(long req_info_ptr, ByteBuffer buf, int pos, int len, byte opCode, boolean last)1318*1157Smax.romanov@nginx.com     private static native void sendWsFrame(long req_info_ptr,
1319*1157Smax.romanov@nginx.com         ByteBuffer buf, int pos, int len, byte opCode, boolean last);
1320*1157Smax.romanov@nginx.com 
sendWsFrame(long req_info_ptr, byte[] arr, int pos, int len, byte opCode, boolean last)1321*1157Smax.romanov@nginx.com     private static native void sendWsFrame(long req_info_ptr,
1322*1157Smax.romanov@nginx.com         byte[] arr, int pos, int len, byte opCode, boolean last);
1323*1157Smax.romanov@nginx.com 
1324*1157Smax.romanov@nginx.com 
closeWs()1325*1157Smax.romanov@nginx.com     public void closeWs()
1326*1157Smax.romanov@nginx.com     {
1327*1157Smax.romanov@nginx.com         if (skip_close_ws) {
1328*1157Smax.romanov@nginx.com             return;
1329*1157Smax.romanov@nginx.com         }
1330*1157Smax.romanov@nginx.com 
1331*1157Smax.romanov@nginx.com         trace("closeWs");
1332*1157Smax.romanov@nginx.com 
1333*1157Smax.romanov@nginx.com         closeWs(req_info_ptr);
1334*1157Smax.romanov@nginx.com     }
1335*1157Smax.romanov@nginx.com 
closeWs(long req_info_ptr)1336*1157Smax.romanov@nginx.com     private static native void closeWs(long req_info_ptr);
1337977Smax.romanov@gmail.com }
1338977Smax.romanov@gmail.com 
1339