Class HttpPostRequestEncoder

  • All Implemented Interfaces:
    ChunkedInput

    public class HttpPostRequestEncoder
    extends java.lang.Object
    implements ChunkedInput
    This encoder will help to encode Request for a FORM as POST.
    • Field Detail

      • percentEncodings

        private static final java.util.Map<java.util.regex.Pattern,​java.lang.String> percentEncodings
      • factory

        private final HttpDataFactory factory
        Factory used to create InterfaceHttpData
      • request

        private final HttpRequest request
        Request to encode
      • charset

        private final java.nio.charset.Charset charset
        Default charset to use
      • isChunked

        private boolean isChunked
        Chunked false by default
      • bodyListDatas

        private final java.util.List<InterfaceHttpData> bodyListDatas
        InterfaceHttpData for Body (without encoding)
      • multipartHttpDatas

        final java.util.List<InterfaceHttpData> multipartHttpDatas
        The final Multipart List of InterfaceHttpData including encoding
      • isMultipart

        private final boolean isMultipart
        Does this request is a Multipart request
      • multipartDataBoundary

        java.lang.String multipartDataBoundary
        If multipart, this is the boundary for the flobal multipart
      • multipartMixedBoundary

        java.lang.String multipartMixedBoundary
        If multipart, there could be internal multiparts (mixed) to the global multipart. Only one level is allowed.
      • headerFinalized

        private boolean headerFinalized
        To check if the header has been finalized
      • isLastChunk

        private boolean isLastChunk
        Does the last non empty chunk already encoded so that next chunk will be empty (last chunk)
      • isLastChunkSent

        private boolean isLastChunkSent
        Last chunk already sent
      • currentFileUpload

        private FileUpload currentFileUpload
        The current FileUpload that is currently in encode process
      • duringMixedMode

        private boolean duringMixedMode
        While adding a FileUpload, is the multipart currently in Mixed Mode
      • globalBodySize

        private long globalBodySize
        Global Body size
      • iterator

        private java.util.ListIterator<InterfaceHttpData> iterator
        Iterator to be used when encoding will be called chunk after chunk
      • currentBuffer

        private ChannelBuffer currentBuffer
        The ChannelBuffer currently used by the encoder
      • currentData

        private InterfaceHttpData currentData
        The current InterfaceHttpData to encode (used if more chunks are available)
      • isKey

        private boolean isKey
        If not multipart, does the currentBuffer stands for the Key or for the Value
    • Method Detail

      • cleanFiles

        public void cleanFiles()
        Clean all HttpDatas (on Disk) for the current request.
      • isMultipart

        public boolean isMultipart()
        True if this request is a Multipart request
        Returns:
        True if this request is a Multipart request
      • initDataMultipart

        private void initDataMultipart()
        Init the delimiter for Global Part (Data).
      • initMixedMultipart

        private void initMixedMultipart()
        Init the delimiter for Mixed Part (Mixed).
      • getNewMultipartDelimiter

        private static java.lang.String getNewMultipartDelimiter()
        Returns:
        a newly generated Delimiter (either for DATA or MIXED)
      • getBodyListAttributes

        public java.util.List<InterfaceHttpData> getBodyListAttributes()
        This method returns a List of all InterfaceHttpData from body part.
        Returns:
        the list of InterfaceHttpData from Body part
      • addBodyFileUpload

        public void addBodyFileUpload​(java.lang.String name,
                                      java.io.File file,
                                      java.lang.String contentType,
                                      boolean isText)
                               throws HttpPostRequestEncoder.ErrorDataEncoderException
        Add a file as a FileUpload
        Parameters:
        name - the name of the parameter
        file - the file to be uploaded (if not Multipart mode, only the filename will be included)
        contentType - the associated contentType for the File
        isText - True if this file should be transmitted in Text format (else binary)
        Throws:
        java.lang.NullPointerException - for name and file
        HttpPostRequestEncoder.ErrorDataEncoderException - if the encoding is in error or if the finalize were already done
      • addBodyFileUploads

        public void addBodyFileUploads​(java.lang.String name,
                                       java.io.File[] file,
                                       java.lang.String[] contentType,
                                       boolean[] isText)
                                throws HttpPostRequestEncoder.ErrorDataEncoderException
        Add a series of Files associated with one File parameter
        Parameters:
        name - the name of the parameter
        file - the array of files
        contentType - the array of content Types associated with each file
        isText - the array of isText attribute (False meaning binary mode) for each file
        Throws:
        java.lang.NullPointerException - also throws if array have different sizes
        HttpPostRequestEncoder.ErrorDataEncoderException - if the encoding is in error or if the finalize were already done
      • finalizeRequest

        public HttpRequest finalizeRequest()
                                    throws HttpPostRequestEncoder.ErrorDataEncoderException
        Finalize the request by preparing the Header in the request and returns the request ready to be sent.
        Once finalized, no data must be added.
        If the request does not need chunk (isChunked() == false), this request is the only object to send to the remote server.
        Returns:
        the request object (chunked or not according to size of body)
        Throws:
        HttpPostRequestEncoder.ErrorDataEncoderException - if the encoding is in error or if the finalize were already done
      • isChunked

        public boolean isChunked()
        Returns:
        True if the request is by Chunk
      • fillChannelBuffer

        private ChannelBuffer fillChannelBuffer()
        Returns:
        the next ChannelBuffer to send as a HttpChunk and modifying currentBuffer accordingly
      • encodeNextChunkMultipart

        private HttpChunk encodeNextChunkMultipart​(int sizeleft)
                                            throws HttpPostRequestEncoder.ErrorDataEncoderException
        From the current context (currentBuffer and currentData), returns the next HttpChunk (if possible) trying to get sizeleft bytes more into the currentBuffer. This is the Multipart version.
        Parameters:
        sizeleft - the number of bytes to try to get from currentData
        Returns:
        the next HttpChunk or null if not enough bytes were found
        Throws:
        HttpPostRequestEncoder.ErrorDataEncoderException - if the encoding is in error
      • encodeNextChunkUrlEncoded

        private HttpChunk encodeNextChunkUrlEncoded​(int sizeleft)
                                             throws HttpPostRequestEncoder.ErrorDataEncoderException
        From the current context (currentBuffer and currentData), returns the next HttpChunk (if possible) trying to get sizeleft bytes more into the currentBuffer. This is the UrlEncoded version.
        Parameters:
        sizeleft - the number of bytes to try to get from currentData
        Returns:
        the next HttpChunk or null if not enough bytes were found
        Throws:
        HttpPostRequestEncoder.ErrorDataEncoderException - if the encoding is in error
      • close

        public void close()
                   throws java.lang.Exception
        Description copied from interface: ChunkedInput
        Releases the resources associated with the stream.
        Specified by:
        close in interface ChunkedInput
        Throws:
        java.lang.Exception
      • isEndOfInput

        public boolean isEndOfInput()
                             throws java.lang.Exception
        Description copied from interface: ChunkedInput
        Return true if and only if there is no data left in the stream and the stream has reached at its end.
        Specified by:
        isEndOfInput in interface ChunkedInput
        Throws:
        java.lang.Exception
      • hasNextChunk

        public boolean hasNextChunk()
                             throws java.lang.Exception
        Description copied from interface: ChunkedInput
        Returns true if and only if there is any data left in the stream. Please note that false does not necessarily mean that the stream has reached at its end. In a slow stream, the next chunk might be unavailable just momentarily.
        Specified by:
        hasNextChunk in interface ChunkedInput
        Throws:
        java.lang.Exception