Request.java (1054:70837ad51a13) Request.java (1121:c0468d3daf98)
1package nginx.unit;
2
3import java.io.BufferedReader;
1package nginx.unit;
2
3import java.io.BufferedReader;
4import java.io.ByteArrayOutputStream;
5import java.io.File;
4import java.io.InputStreamReader;
5import java.io.IOException;
6import java.io.UnsupportedEncodingException;
7
8import java.lang.IllegalArgumentException;
9import java.lang.IllegalStateException;
10import java.lang.Object;
11import java.lang.String;
12import java.lang.StringBuffer;
13
14import java.net.URI;
15import java.net.URISyntaxException;
16
6import java.io.InputStreamReader;
7import java.io.IOException;
8import java.io.UnsupportedEncodingException;
9
10import java.lang.IllegalArgumentException;
11import java.lang.IllegalStateException;
12import java.lang.Object;
13import java.lang.String;
14import java.lang.StringBuffer;
15
16import java.net.URI;
17import java.net.URISyntaxException;
18
19import java.nio.charset.Charset;
20import java.nio.charset.StandardCharsets;
21
17import java.text.ParseException;
18import java.text.SimpleDateFormat;
19
20import java.util.Collection;
21import java.util.Collections;
22import java.util.Date;
23import java.util.Enumeration;
24import java.util.HashMap;
25import java.util.HashSet;
26import java.util.List;
27import java.util.Locale;
28import java.util.Map;
29import java.util.Set;
30
31import java.security.Principal;
32
33import javax.servlet.AsyncContext;
34import javax.servlet.DispatcherType;
22import java.text.ParseException;
23import java.text.SimpleDateFormat;
24
25import java.util.Collection;
26import java.util.Collections;
27import java.util.Date;
28import java.util.Enumeration;
29import java.util.HashMap;
30import java.util.HashSet;
31import java.util.List;
32import java.util.Locale;
33import java.util.Map;
34import java.util.Set;
35
36import java.security.Principal;
37
38import javax.servlet.AsyncContext;
39import javax.servlet.DispatcherType;
40import javax.servlet.MultipartConfigElement;
35import javax.servlet.RequestDispatcher;
36import javax.servlet.ServletContext;
37import javax.servlet.ServletException;
38import javax.servlet.ServletInputStream;
39import javax.servlet.ServletRequest;
40import javax.servlet.ServletRequestAttributeEvent;
41import javax.servlet.ServletRequestAttributeListener;
42import javax.servlet.ServletResponse;
43import javax.servlet.SessionTrackingMode;
44import javax.servlet.SessionCookieConfig;
45import javax.servlet.http.Cookie;
46import javax.servlet.http.HttpSession;
47import javax.servlet.http.HttpServletRequest;
48import javax.servlet.http.HttpServletResponse;
49import javax.servlet.http.HttpUpgradeHandler;
50import javax.servlet.http.Part;
51
41import javax.servlet.RequestDispatcher;
42import javax.servlet.ServletContext;
43import javax.servlet.ServletException;
44import javax.servlet.ServletInputStream;
45import javax.servlet.ServletRequest;
46import javax.servlet.ServletRequestAttributeEvent;
47import javax.servlet.ServletRequestAttributeListener;
48import javax.servlet.ServletResponse;
49import javax.servlet.SessionTrackingMode;
50import javax.servlet.SessionCookieConfig;
51import javax.servlet.http.Cookie;
52import javax.servlet.http.HttpSession;
53import javax.servlet.http.HttpServletRequest;
54import javax.servlet.http.HttpServletResponse;
55import javax.servlet.http.HttpUpgradeHandler;
56import javax.servlet.http.Part;
57
58import org.eclipse.jetty.util.IO;
52import org.eclipse.jetty.util.MultiMap;
53import org.eclipse.jetty.util.UrlEncoded;
54import org.eclipse.jetty.util.StringUtil;
55
56import org.eclipse.jetty.server.CookieCutter;
59import org.eclipse.jetty.util.MultiMap;
60import org.eclipse.jetty.util.UrlEncoded;
61import org.eclipse.jetty.util.StringUtil;
62
63import org.eclipse.jetty.server.CookieCutter;
64import org.eclipse.jetty.http.MultiPartFormInputStream;
65import org.eclipse.jetty.http.HttpFields;
57import org.eclipse.jetty.http.MimeTypes;
58
59public class Request implements HttpServletRequest, DynamicPathRequest
60{
61 private final Context context;
62 private final long req_info_ptr;
63 private final long req_ptr;
64

--- 39 unchanged lines hidden (view full) ---

104 private boolean request_session_id_from_cookie = false;
105 private boolean request_session_id_from_url = false;
106 private Session session = null;
107
108 private final ServletRequestAttributeListener attr_listener;
109
110 public static final String BARE = "nginx.unit.request.bare";
111
66import org.eclipse.jetty.http.MimeTypes;
67
68public class Request implements HttpServletRequest, DynamicPathRequest
69{
70 private final Context context;
71 private final long req_info_ptr;
72 private final long req_ptr;
73

--- 39 unchanged lines hidden (view full) ---

113 private boolean request_session_id_from_cookie = false;
114 private boolean request_session_id_from_url = false;
115 private Session session = null;
116
117 private final ServletRequestAttributeListener attr_listener;
118
119 public static final String BARE = "nginx.unit.request.bare";
120
121 private MultiPartFormInputStream multi_parts;
122 private MultipartConfigElement multipart_config;
123
112 public Request(Context ctx, long req_info, long req) {
113 context = ctx;
114 req_info_ptr = req_info;
115 req_ptr = req;
116
117 attr_listener = context.getRequestAttributeListener();
118 context_path = context.getContextPath();
119 }

--- 146 unchanged lines hidden (view full) ---

266 }
267
268 private static native String getMethod(long req_ptr);
269
270
271 @Override
272 public Part getPart(String name) throws IOException, ServletException
273 {
124 public Request(Context ctx, long req_info, long req) {
125 context = ctx;
126 req_info_ptr = req_info;
127 req_ptr = req;
128
129 attr_listener = context.getRequestAttributeListener();
130 context_path = context.getContextPath();
131 }

--- 146 unchanged lines hidden (view full) ---

278 }
279
280 private static native String getMethod(long req_ptr);
281
282
283 @Override
284 public Part getPart(String name) throws IOException, ServletException
285 {
274 log("getPart: " + name);
286 trace("getPart: " + name);
275
287
276 return null;
288 if (multi_parts == null) {
289 parseMultiParts();
290 }
291
292 return multi_parts.getPart(name);
277 }
278
279 @Override
280 public Collection<Part> getParts() throws IOException, ServletException
281 {
293 }
294
295 @Override
296 public Collection<Part> getParts() throws IOException, ServletException
297 {
282 log("getParts");
298 trace("getParts");
283
299
284 return Collections.emptyList();
300 if (multi_parts == null) {
301 parseMultiParts();
302 }
303
304 return multi_parts.getParts();
285 }
286
305 }
306
307 private boolean checkMultiPart(String content_type)
308 {
309 return content_type != null
310 && MimeTypes.Type.MULTIPART_FORM_DATA.is(HttpFields.valueParameters(content_type, null));
311 }
312
313 private void parseMultiParts() throws IOException, ServletException, IllegalStateException
314 {
315 String content_type = getContentType();
316
317 if (!checkMultiPart(content_type)) {
318 throw new ServletException("Content-Type != multipart/form-data");
319 }
320
321 if (multipart_config == null) {
322 throw new IllegalStateException("No multipart config for servlet");
323 }
324
325 parseMultiParts(content_type);
326 }
327
328 private void parseMultiParts(String content_type) throws IOException
329 {
330 File tmpDir = (File) context.getAttribute(ServletContext.TEMPDIR);
331
332 multi_parts = new MultiPartFormInputStream(getInputStream(),
333 content_type, multipart_config, tmpDir);
334 }
335
336 public void setMultipartConfig(MultipartConfigElement mce)
337 {
338 multipart_config = mce;
339 }
340
341 public MultipartConfigElement getMultipartConfig()
342 {
343 return multipart_config;
344 }
345
287 @Override
288 public String getPathInfo()
289 {
290 trace("getPathInfo: " + path_info);
291
292 return path_info;
293 }
294

--- 466 unchanged lines hidden (view full) ---

761 parameters = new MultiMap<>();
762
763 String query = getQueryString();
764
765 if (query != null) {
766 UrlEncoded.decodeUtf8To(query, parameters);
767 }
768
346 @Override
347 public String getPathInfo()
348 {
349 trace("getPathInfo: " + path_info);
350
351 return path_info;
352 }
353

--- 466 unchanged lines hidden (view full) ---

820 parameters = new MultiMap<>();
821
822 String query = getQueryString();
823
824 if (query != null) {
825 UrlEncoded.decodeUtf8To(query, parameters);
826 }
827
769 if (getContentLength() > 0 &&
770 getMethod().equals("POST") &&
771 getContentType().startsWith("application/x-www-form-urlencoded"))
772 {
773 try {
828 int content_length = getContentLength();
829
830 if (content_length == 0 || !getMethod().equals("POST")) {
831 return parameters;
832 }
833
834 String content_type = getContentType();
835
836 try {
837 if (content_type.startsWith("application/x-www-form-urlencoded")) {
774 UrlEncoded.decodeUtf8To(new InputStream(req_info_ptr),
838 UrlEncoded.decodeUtf8To(new InputStream(req_info_ptr),
775 parameters, getContentLength(), -1);
776 } catch (IOException e) {
777 log("Unhandled IOException: " + e);
839 parameters, content_length, -1);
840 } else if (checkMultiPart(content_type) && multipart_config != null) {
841 if (multi_parts == null) {
842 parseMultiParts(content_type);
843 }
844
845 if (multi_parts != null) {
846 Collection<Part> parts = multi_parts.getParts();
847
848 String _charset_ = null;
849 Part charset_part = multi_parts.getPart("_charset_");
850 if (charset_part != null) {
851 try (java.io.InputStream is = charset_part.getInputStream())
852 {
853 ByteArrayOutputStream os = new ByteArrayOutputStream();
854 IO.copy(is, os);
855 _charset_ = new String(os.toByteArray(),StandardCharsets.UTF_8);
856 }
857 }
858
859 /*
860 Select Charset to use for this part. (NOTE: charset behavior is for the part value only and not the part header/field names)
861 1. Use the part specific charset as provided in that part's Content-Type header; else
862 2. Use the overall default charset. Determined by:
863 a. if part name _charset_ exists, use that part's value.
864 b. if the request.getCharacterEncoding() returns a value, use that.
865 (note, this can be either from the charset field on the request Content-Type
866 header, or from a manual call to request.setCharacterEncoding())
867 c. use utf-8.
868 */
869 Charset def_charset;
870 if (_charset_ != null) {
871 def_charset = Charset.forName(_charset_);
872 } else if (getCharacterEncoding() != null) {
873 def_charset = Charset.forName(getCharacterEncoding());
874 } else {
875 def_charset = StandardCharsets.UTF_8;
876 }
877
878 ByteArrayOutputStream os = null;
879 for (Part p : parts) {
880 if (p.getSubmittedFileName() != null) {
881 continue;
882 }
883
884 // Servlet Spec 3.0 pg 23, parts without filename must be put into params.
885 String charset = null;
886 if (p.getContentType() != null) {
887 charset = MimeTypes.getCharsetFromContentType(p.getContentType());
888 }
889
890 try (java.io.InputStream is = p.getInputStream())
891 {
892 if (os == null) {
893 os = new ByteArrayOutputStream();
894 }
895 IO.copy(is, os);
896
897 String content = new String(os.toByteArray(), charset == null ? def_charset : Charset.forName(charset));
898 parameters.add(p.getName(), content);
899 }
900 os.reset();
901 }
902 }
778 }
903 }
904 } catch (IOException e) {
905 log("Unhandled IOException: " + e);
779 }
780
781 return parameters;
782 }
783
784 public void setParameters(MultiMap<String> p)
785 {
786 parameters = p;

--- 339 unchanged lines hidden ---
906 }
907
908 return parameters;
909 }
910
911 public void setParameters(MultiMap<String> p)
912 {
913 parameters = p;

--- 339 unchanged lines hidden ---