1 package fi.iki.elonen;
2 
3 /*
4  * #%L
5  * apache-fileupload-integration
6  * %%
7  * Copyright (C) 2012 - 2015 nanohttpd
8  * %%
9  * Redistribution and use in source and binary forms, with or without modification,
10  * are permitted provided that the following conditions are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright notice, this
13  *    list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright notice,
16  *    this list of conditions and the following disclaimer in the documentation
17  *    and/or other materials provided with the distribution.
18  *
19  * 3. Neither the name of the nanohttpd nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software without
21  *    specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
31  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
32  * OF THE POSSIBILITY OF SUCH DAMAGE.
33  * #L%
34  */
35 
36 import static fi.iki.elonen.NanoHTTPD.Method.POST;
37 
38 import java.io.IOException;
39 import java.io.InputStream;
40 import java.util.List;
41 import java.util.Map;
42 
43 import org.apache.commons.fileupload.FileItem;
44 import org.apache.commons.fileupload.FileItemFactory;
45 import org.apache.commons.fileupload.FileItemIterator;
46 import org.apache.commons.fileupload.FileUpload;
47 import org.apache.commons.fileupload.FileUploadBase;
48 import org.apache.commons.fileupload.FileUploadException;
49 import org.apache.commons.fileupload.UploadContext;
50 
51 /**
52  * @author victor & ritchieGitHub
53  */
54 public class NanoFileUpload extends FileUpload {
55 
56     public static class NanoHttpdContext implements UploadContext {
57 
58         private NanoHTTPD.IHTTPSession session;
59 
NanoHttpdContext(NanoHTTPD.IHTTPSession session)60         public NanoHttpdContext(NanoHTTPD.IHTTPSession session) {
61             this.session = session;
62         }
63 
64         @Override
contentLength()65         public long contentLength() {
66             long size;
67             try {
68                 String cl1 = session.getHeaders().get("content-length");
69                 size = Long.parseLong(cl1);
70             } catch (NumberFormatException var4) {
71                 size = -1L;
72             }
73 
74             return size;
75         }
76 
77         @Override
getCharacterEncoding()78         public String getCharacterEncoding() {
79             return "UTF-8";
80         }
81 
82         @Override
getContentType()83         public String getContentType() {
84             return this.session.getHeaders().get("content-type");
85         }
86 
87         @Override
getContentLength()88         public int getContentLength() {
89             return (int) contentLength();
90         }
91 
92         @Override
getInputStream()93         public InputStream getInputStream() throws IOException {
94             return session.getInputStream();
95         }
96     }
97 
isMultipartContent(NanoHTTPD.IHTTPSession session)98     public static final boolean isMultipartContent(NanoHTTPD.IHTTPSession session) {
99         return session.getMethod() == POST && FileUploadBase.isMultipartContent(new NanoHttpdContext(session));
100     }
101 
NanoFileUpload(FileItemFactory fileItemFactory)102     public NanoFileUpload(FileItemFactory fileItemFactory) {
103         super(fileItemFactory);
104     }
105 
parseRequest(NanoHTTPD.IHTTPSession session)106     public List<FileItem> parseRequest(NanoHTTPD.IHTTPSession session) throws FileUploadException {
107         return this.parseRequest(new NanoHttpdContext(session));
108     }
109 
parseParameterMap(NanoHTTPD.IHTTPSession session)110     public Map<String, List<FileItem>> parseParameterMap(NanoHTTPD.IHTTPSession session) throws FileUploadException {
111         return this.parseParameterMap(new NanoHttpdContext(session));
112     }
113 
getItemIterator(NanoHTTPD.IHTTPSession session)114     public FileItemIterator getItemIterator(NanoHTTPD.IHTTPSession session) throws FileUploadException, IOException {
115         return super.getItemIterator(new NanoHttpdContext(session));
116     }
117 
118 }
119