Home | History | Annotate | Download | only in elonen
      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 
     60         public NanoHttpdContext(NanoHTTPD.IHTTPSession session) {
     61             this.session = session;
     62         }
     63 
     64         @Override
     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
     78         public String getCharacterEncoding() {
     79             return "UTF-8";
     80         }
     81 
     82         @Override
     83         public String getContentType() {
     84             return this.session.getHeaders().get("content-type");
     85         }
     86 
     87         @Override
     88         public int getContentLength() {
     89             return (int) contentLength();
     90         }
     91 
     92         @Override
     93         public InputStream getInputStream() throws IOException {
     94             return session.getInputStream();
     95         }
     96     }
     97 
     98     public static final boolean isMultipartContent(NanoHTTPD.IHTTPSession session) {
     99         return session.getMethod() == POST && FileUploadBase.isMultipartContent(new NanoHttpdContext(session));
    100     }
    101 
    102     public NanoFileUpload(FileItemFactory fileItemFactory) {
    103         super(fileItemFactory);
    104     }
    105 
    106     public List<FileItem> parseRequest(NanoHTTPD.IHTTPSession session) throws FileUploadException {
    107         return this.parseRequest(new NanoHttpdContext(session));
    108     }
    109 
    110     public Map<String, List<FileItem>> parseParameterMap(NanoHTTPD.IHTTPSession session) throws FileUploadException {
    111         return this.parseParameterMap(new NanoHttpdContext(session));
    112     }
    113 
    114     public FileItemIterator getItemIterator(NanoHTTPD.IHTTPSession session) throws FileUploadException, IOException {
    115         return super.getItemIterator(new NanoHttpdContext(session));
    116     }
    117 
    118 }
    119