Example usage for io.netty.handler.codec.http HttpHeaderValues MULTIPART_MIXED

List of usage examples for io.netty.handler.codec.http HttpHeaderValues MULTIPART_MIXED

Introduction

In this page you can find the example usage for io.netty.handler.codec.http HttpHeaderValues MULTIPART_MIXED.

Prototype

AsciiString MULTIPART_MIXED

To view the source code for io.netty.handler.codec.http HttpHeaderValues MULTIPART_MIXED.

Click Source Link

Document

"multipart/mixed"

Usage

From source file:reactor.ipc.netty.http.client.HttpClientFormEncoder.java

License:Open Source License

/**
 * Add the InterfaceHttpData to the Body list
 *
 * @throws NullPointerException      for data
 * @throws ErrorDataEncoderException if the encoding is in error or if the finalize
 *                                   were already done
 *///  w  ww.  ja  v a  2 s  .  co  m
void addBodyHttpData(InterfaceHttpData data) throws ErrorDataEncoderException {
    if (headerFinalized) {
        throw new ErrorDataEncoderException("Cannot add value once finalized");
    }
    if (data == null) {
        throw new NullPointerException("data");
    }
    bodyListDatas.add(data);
    if (!isMultipart) {
        if (data instanceof Attribute) {
            Attribute attribute = (Attribute) data;
            try {
                // name=value& with encoded name and attribute
                String key = encodeAttribute(attribute.getName(), charset);
                String value = encodeAttribute(attribute.getValue(), charset);
                Attribute newattribute = factory.createAttribute(request, key, value);
                multipartHttpDatas.add(newattribute);
                globalBodySize += newattribute.getName().length() + 1 + newattribute.length() + 1;
            } catch (IOException e) {
                throw new ErrorDataEncoderException(e);
            }
        } else if (data instanceof FileUpload) {
            // since not Multipart, only name=filename => Attribute
            FileUpload fileUpload = (FileUpload) data;
            // name=filename& with encoded name and filename
            String key = encodeAttribute(fileUpload.getName(), charset);
            String value = encodeAttribute(fileUpload.getFilename(), charset);
            Attribute newattribute = factory.createAttribute(request, key, value);
            multipartHttpDatas.add(newattribute);
            globalBodySize += newattribute.getName().length() + 1 + newattribute.length() + 1;
        }
        return;
    }
    /*
     * Logic:
       * if not Attribute:
       *      add Data to body list
       *      if (duringMixedMode)
       *          add endmixedmultipart delimiter
       *          currentFileUpload = null
       *          duringMixedMode = false;
       *      add multipart delimiter, multipart body header and Data to multipart list
       *      reset currentFileUpload, duringMixedMode
       * if FileUpload: take care of multiple file for one field => mixed mode
       *      if (duringMixeMode)
       *          if (currentFileUpload.name == data.name)
       *              add mixedmultipart delimiter, mixedmultipart body header and Data to multipart list
       *          else
       *              add endmixedmultipart delimiter, multipart body header and Data to multipart list
       *              currentFileUpload = data
       *              duringMixedMode = false;
       *      else
       *          if (currentFileUpload.name == data.name)
       *              change multipart body header of previous file into multipart list to
       *                      mixedmultipart start, mixedmultipart body header
       *              add mixedmultipart delimiter, mixedmultipart body header and Data to multipart list
       *              duringMixedMode = true
       *          else
       *              add multipart delimiter, multipart body header and Data to multipart list
       *              currentFileUpload = data
       *              duringMixedMode = false;
       * Do not add last delimiter! Could be:
       * if duringmixedmode: endmixedmultipart + endmultipart
       * else only endmultipart
       */
    if (data instanceof Attribute) {
        if (duringMixedMode) {
            InternalAttribute internal = new InternalAttribute(charset);
            internal.addValue("\r\n--" + multipartMixedBoundary + "--");
            multipartHttpDatas.add(internal);
            multipartMixedBoundary = null;
            currentFileUpload = null;
            duringMixedMode = false;
        }
        InternalAttribute internal = new InternalAttribute(charset);
        if (!multipartHttpDatas.isEmpty()) {
            // previously a data field so CRLF
            internal.addValue("\r\n");
        }
        internal.addValue("--" + multipartDataBoundary + "\r\n");
        // content-disposition: form-data; name="field1"
        Attribute attribute = (Attribute) data;
        internal.addValue(HttpHeaderNames.CONTENT_DISPOSITION + ": " + HttpHeaderValues.FORM_DATA + "; "
                + HttpHeaderValues.NAME + "=\"" + attribute.getName() + "\"\r\n");
        // Add Content-Length: xxx
        internal.addValue(HttpHeaderNames.CONTENT_LENGTH + ": " + attribute.length() + "\r\n");
        Charset localcharset = attribute.getCharset();
        if (localcharset != null) {
            // Content-Type: text/plain; charset=charset
            internal.addValue(HttpHeaderNames.CONTENT_TYPE + ": " + DEFAULT_TEXT_CONTENT_TYPE + "; "
                    + HttpHeaderValues.CHARSET + '=' + localcharset.name() + "\r\n");
        }
        // CRLF between body header and data
        internal.addValue("\r\n");
        multipartHttpDatas.add(internal);
        multipartHttpDatas.add(data);
        globalBodySize += attribute.length() + internal.size();
    } else if (data instanceof FileUpload) {
        FileUpload fileUpload = (FileUpload) data;
        InternalAttribute internal = new InternalAttribute(charset);
        if (!multipartHttpDatas.isEmpty()) {
            // previously a data field so CRLF
            internal.addValue("\r\n");
        }
        boolean localMixed;
        if (duringMixedMode) {
            if (currentFileUpload != null && currentFileUpload.getName().equals(fileUpload.getName())) {
                // continue a mixed mode

                localMixed = true;
            } else {
                // end a mixed mode

                // add endmixedmultipart delimiter, multipart body header
                // and
                // Data to multipart list
                internal.addValue("--" + multipartMixedBoundary + "--");
                multipartHttpDatas.add(internal);
                multipartMixedBoundary = null;
                // start a new one (could be replaced if mixed start again
                // from here
                internal = new InternalAttribute(charset);
                internal.addValue("\r\n");
                localMixed = false;
                // new currentFileUpload and no more in Mixed mode
                currentFileUpload = fileUpload;
                duringMixedMode = false;
            }
        } else {
            if (encoderMode != EncoderMode.HTML5 && currentFileUpload != null
                    && currentFileUpload.getName().equals(fileUpload.getName())) {
                // create a new mixed mode (from previous file)

                // change multipart body header of previous file into
                // multipart list to
                // mixedmultipart start, mixedmultipart body header

                // change Internal (size()-2 position in multipartHttpDatas)
                // from (line starting with *)
                // --AaB03x
                // * Content-Disposition: form-data; name="files";
                // filename="file1.txt"
                // Content-Type: text/plain
                // to (lines starting with *)
                // --AaB03x
                // * Content-Disposition: form-data; name="files"
                // * Content-Type: multipart/mixed; boundary=BbC04y
                // *
                // * --BbC04y
                // * Content-Disposition: attachment; filename="file1.txt"
                // Content-Type: text/plain
                initMixedMultipart();
                InternalAttribute pastAttribute = (InternalAttribute) multipartHttpDatas
                        .get(multipartHttpDatas.size() - 2);
                // remove past size
                globalBodySize -= pastAttribute.size();
                StringBuilder replacement = new StringBuilder(
                        139 + multipartDataBoundary.length() + multipartMixedBoundary.length() * 2
                                + fileUpload.getFilename().length() + fileUpload.getName().length())

                                        .append("--").append(multipartDataBoundary).append("\r\n")

                                        .append(HttpHeaderNames.CONTENT_DISPOSITION).append(": ")
                                        .append(HttpHeaderValues.FORM_DATA).append("; ")
                                        .append(HttpHeaderValues.NAME).append("=\"")
                                        .append(fileUpload.getName()).append("\"\r\n")

                                        .append(HttpHeaderNames.CONTENT_TYPE).append(": ")
                                        .append(HttpHeaderValues.MULTIPART_MIXED).append("; ")
                                        .append(HttpHeaderValues.BOUNDARY).append('=')
                                        .append(multipartMixedBoundary).append("\r\n\r\n")

                                        .append("--").append(multipartMixedBoundary).append("\r\n")

                                        .append(HttpHeaderNames.CONTENT_DISPOSITION).append(": ")
                                        .append(HttpHeaderValues.ATTACHMENT).append("; ");

                if (!fileUpload.getFilename().isEmpty()) {
                    replacement.append(HttpHeaderValues.FILENAME).append("=\"")
                            .append(fileUpload.getFilename());
                }

                replacement.append("\"\r\n");

                pastAttribute.setValue(replacement.toString(), 1);
                pastAttribute.setValue("", 2);

                // update past size
                globalBodySize += pastAttribute.size();

                // now continue
                // add mixedmultipart delimiter, mixedmultipart body header
                // and
                // Data to multipart list
                localMixed = true;
                duringMixedMode = true;
            } else {
                // a simple new multipart
                // add multipart delimiter, multipart body header and Data
                // to multipart list
                localMixed = false;
                currentFileUpload = fileUpload;
                duringMixedMode = false;
            }
        }

        if (localMixed) {
            // add mixedmultipart delimiter, mixedmultipart body header and
            // Data to multipart list
            internal.addValue("--" + multipartMixedBoundary + "\r\n");
            // Content-Disposition: attachment; filename="file1.txt"
            if (!fileUpload.getFilename().isEmpty()) {
                internal.addValue(HttpHeaderNames.CONTENT_DISPOSITION + ": " + HttpHeaderValues.ATTACHMENT
                        + "; " + HttpHeaderValues.FILENAME + "=\"" + fileUpload.getFilename() + "\"\r\n");
            } else {
                internal.addValue(
                        HttpHeaderNames.CONTENT_DISPOSITION + ": " + HttpHeaderValues.ATTACHMENT + ";\r\n");
            }
        } else {
            internal.addValue("--" + multipartDataBoundary + "\r\n");
            // Content-Disposition: form-data; name="files";
            // filename="file1.txt"
            if (!fileUpload.getFilename().isEmpty()) {
                internal.addValue(HttpHeaderNames.CONTENT_DISPOSITION + ": " + HttpHeaderValues.FORM_DATA + "; "
                        + HttpHeaderValues.NAME + "=\"" + fileUpload.getName() + "\"; "
                        + HttpHeaderValues.FILENAME + "=\"" + fileUpload.getFilename() + "\"\r\n");
            } else {
                internal.addValue(HttpHeaderNames.CONTENT_DISPOSITION + ": " + HttpHeaderValues.FORM_DATA + "; "
                        + HttpHeaderValues.NAME + "=\"" + fileUpload.getName() + "\";\r\n");
            }
        }
        // Add Content-Length: xxx
        internal.addValue(HttpHeaderNames.CONTENT_LENGTH + ": " + fileUpload.length() + "\r\n");
        // Content-Type: image/gif
        // Content-Type: text/plain; charset=ISO-8859-1
        // Content-Transfer-Encoding: binary
        internal.addValue(HttpHeaderNames.CONTENT_TYPE + ": " + fileUpload.getContentType());
        String contentTransferEncoding = fileUpload.getContentTransferEncoding();
        if (contentTransferEncoding != null && contentTransferEncoding.equals(DEFAULT_TRANSFER_ENCODING)) {
            internal.addValue("\r\n" + HttpHeaderNames.CONTENT_TRANSFER_ENCODING + ": "
                    + DEFAULT_BINARY_CONTENT_TYPE + "\r\n\r\n");
        } else if (fileUpload.getCharset() != null) {
            internal.addValue(
                    "; " + HttpHeaderValues.CHARSET + '=' + fileUpload.getCharset().name() + "\r\n\r\n");
        } else {
            internal.addValue("\r\n\r\n");
        }
        multipartHttpDatas.add(internal);
        multipartHttpDatas.add(data);
        globalBodySize += fileUpload.length() + internal.size();
    }
}