Deleted
Added
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 --- |