@Override
  public void process(RequestTemplate template, Charset charset, Map<String, Object> data)
      throws EncodeException {
    val boundary = Long.toHexString(System.currentTimeMillis());
    try (val output = new Output(charset)) {
      for (val entry : data.entrySet()) {
        if (entry == null || entry.getKey() == null || entry.getValue() == null) {
          continue;
        }
        val writer = findApplicableWriter(entry.getValue());
        writer.write(output, boundary, entry.getKey(), entry.getValue());
      }

      output.write("--").write(boundary).write("--").write(CRLF);

      val contentTypeHeaderValue =
          new StringBuilder()
              .append(getSupportedContentType().getHeader())
              .append("; charset=")
              .append(charset.name())
              .append("; boundary=")
              .append(boundary)
              .toString();

      template.header(CONTENT_TYPE_HEADER, Collections.<String>emptyList()); // reset header
      template.header(CONTENT_TYPE_HEADER, contentTypeHeaderValue);

      // Feign's clients try to determine binary/string content by charset presence
      // so, I set it to null (in spite of availability charset) for backward
      // compatibility.
      val bytes = output.toByteArray();
      template.body(bytes, null);
    } catch (IOException ex) {
      throw new EncodeException("Output closing error", ex);
    }
  }
Constructor with specific delegate encoder.

@param delegate specific delegate encoder for cases, when this processor couldn't handle
    request parameter.
form/src/main/java/feign/form/MultipartFormContentProcessor.java