1 /* 2 * Copyright 2012 The Netty Project 3 * 4 * The Netty Project licenses this file to you under the Apache License, 5 * version 2.0 (the "License"); you may not use this file except in compliance 6 * with the License. You may obtain a copy of the License at: 7 * 8 * https://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations 14 * under the License. 15 */ 16 package io.netty.handler.codec.http.multipart; 17 18 import io.netty.handler.codec.http.HttpContent; 19 20 import java.util.List; 21 22 /** 23 * This decoder will decode Body and can handle POST BODY. 24 * 25 * You <strong>MUST</strong> call {@link #destroy()} after completion to release all resources. 26 */ 27 public interface InterfaceHttpPostRequestDecoder { 28 /** 29 * True if this request is a Multipart request 30 * 31 * @return True if this request is a Multipart request 32 */ 33 boolean isMultipart(); 34 35 /** 36 * Set the amount of bytes after which read bytes in the buffer should be discarded. 37 * Setting this lower gives lower memory usage but with the overhead of more memory copies. 38 * Use {@code 0} to disable it. 39 */ 40 void setDiscardThreshold(int discardThreshold); 41 42 /** 43 * Return the threshold in bytes after which read data in the buffer should be discarded. 44 */ 45 int getDiscardThreshold(); 46 47 /** 48 * This getMethod returns a List of all HttpDatas from body.<br> 49 * 50 * If chunked, all chunks must have been offered using offer() getMethod. If 51 * not, NotEnoughDataDecoderException will be raised. 52 * 53 * @return the list of HttpDatas from Body part for POST getMethod 54 * @throws HttpPostRequestDecoder.NotEnoughDataDecoderException 55 * Need more chunks 56 */ 57 List<InterfaceHttpData> getBodyHttpDatas(); 58 59 /** 60 * This getMethod returns a List of all HttpDatas with the given name from 61 * body.<br> 62 * 63 * If chunked, all chunks must have been offered using offer() getMethod. If 64 * not, NotEnoughDataDecoderException will be raised. 65 * 66 * @return All Body HttpDatas with the given name (ignore case) 67 * @throws HttpPostRequestDecoder.NotEnoughDataDecoderException 68 * need more chunks 69 */ 70 List<InterfaceHttpData> getBodyHttpDatas(String name); 71 72 /** 73 * This getMethod returns the first InterfaceHttpData with the given name from 74 * body.<br> 75 * 76 * If chunked, all chunks must have been offered using offer() getMethod. If 77 * not, NotEnoughDataDecoderException will be raised. 78 * 79 * @return The first Body InterfaceHttpData with the given name (ignore 80 * case) 81 * @throws HttpPostRequestDecoder.NotEnoughDataDecoderException 82 * need more chunks 83 */ 84 InterfaceHttpData getBodyHttpData(String name); 85 86 /** 87 * Initialized the internals from a new chunk 88 * 89 * @param content 90 * the new received chunk 91 * @throws HttpPostRequestDecoder.ErrorDataDecoderException 92 * if there is a problem with the charset decoding or other 93 * errors 94 */ 95 InterfaceHttpPostRequestDecoder offer(HttpContent content); 96 97 /** 98 * True if at current getStatus, there is an available decoded 99 * InterfaceHttpData from the Body. 100 * 101 * This getMethod works for chunked and not chunked request. 102 * 103 * @return True if at current getStatus, there is a decoded InterfaceHttpData 104 * @throws HttpPostRequestDecoder.EndOfDataDecoderException 105 * No more data will be available 106 */ 107 boolean hasNext(); 108 109 /** 110 * Returns the next available InterfaceHttpData or null if, at the time it 111 * is called, there is no more available InterfaceHttpData. A subsequent 112 * call to offer(httpChunk) could enable more data. 113 * 114 * Be sure to call {@link InterfaceHttpData#release()} after you are done 115 * with processing to make sure to not leak any resources 116 * 117 * @return the next available InterfaceHttpData or null if none 118 * @throws HttpPostRequestDecoder.EndOfDataDecoderException 119 * No more data will be available 120 */ 121 InterfaceHttpData next(); 122 123 /** 124 * Returns the current InterfaceHttpData if currently in decoding status, 125 * meaning all data are not yet within, or null if there is no InterfaceHttpData 126 * currently in decoding status (either because none yet decoded or none currently partially 127 * decoded). Full decoded ones are accessible through hasNext() and next() methods. 128 * 129 * @return the current InterfaceHttpData if currently in decoding status or null if none. 130 */ 131 InterfaceHttpData currentPartialHttpData(); 132 133 /** 134 * Destroy the {@link InterfaceHttpPostRequestDecoder} and release all it resources. After this method 135 * was called it is not possible to operate on it anymore. 136 */ 137 void destroy(); 138 139 /** 140 * Clean all HttpDatas (on Disk) for the current request. 141 */ 142 void cleanFiles(); 143 144 /** 145 * Remove the given FileUpload from the list of FileUploads to clean 146 */ 147 void removeHttpDataFromClean(InterfaceHttpData data); 148 }