title: How do I get a mixed multipart in a RESTEasy response?
body: <p>I am trying to use resteasy. While I am able to do send a mixed multipart as a request to a webservice, I am unable to do get a mixed multipart in the response.
  For eg: Requesting for a file (byte[] or stream) and the file name in a single Response.
  Following is what I have tested:</p>
  
  <p>Service code:</p>
  
  <pre><code>@Path("/myfiles")
  public class MyMultiPartWebService {
  
  @POST
  @Path("/filedetail")
  @Consumes("multipart/form-data")
  @Produces("multipart/mixed")
  public MultipartOutput fileDetail(MultipartFormDataInput input) throws IOException {
         MultipartOutput multipartOutput = new MultipartOutput();
         //some logic based on input to locate a file(s)
         File myFile = new File("samplefile.pdf");
         multipartOutput.addPart("fileName:"+ myFile.getName(), MediaType.TEXT_PLAIN_TYPE);
         multipartOutput.addPart(file, MediaType.APPLICATION_OCTET_STREAM_TYPE);
         return multipartOutput;
   }
  }
  </code></pre>
  
  <p>Client code:</p>
  
  <pre><code>public void getFileDetails(/*input params*/){
      HttpClient client = new DefaultHttpClient();
      HttpPost postRequest = new HttpPost("urlString");
      MultipartEntity multiPartEntity = new MultipartEntity();
      //prepare the request details        
      postRequest.setEntity(multiPartEntity);
  
      HttpResponse response = client.execute(postRequest);
      HttpEntity returnEntity = response.getEntity();
  
      //extracting data from the response
      Header header = returnEntity.getContentType();
      InputStream is = returnEntity.getContent();
      if (is != null) {
          byte[] bytes = IOUtils.toByteArray(is);
          //Can we see the 2 parts that were added?
          //Able to get a single InputStream only, and hence unable to differentiate two objects in the response
          //Trying to see the contents - printing as string
          System.out.println("Output from Response :: " + new String(bytes));
       }
   }
  </code></pre>
  
  <p>The output is as follows - able to see 2 different objects with different content types, but unable to extract them separately.</p>
  
  <pre><code>Output from Response :: 
  --af481055-4e4f-4860-9c0b-bb636d86d639
  Content-Type: text/plain
  
  fileName: samplefile.pdf
  --af481055-4e4f-4860-9c0b-bb636d86d639
  Content-Length: 1928
  Content-Type: application/octet-stream
  
  %PDF-1.4
  &lt;&lt;pdf content printed as junk chars&gt;&gt;
  </code></pre>
  
  <p>How can I extract the 2 objects from the response?</p>
  
  <p><em><strong>UPDATE:</em></strong></p>
  
  <p>Tried the following approach to extract the different parts - use the 'boundary' to break the MultipartStream; use the content type string to extract approp object.</p>
  
  <pre><code>    private void getResponeObject(HttpResponse response) throws IllegalStateException, IOException {
          HttpEntity returnEntity = response.getEntity();
          Header header = returnEntity.getContentType();
          String boundary = header.getValue();
          boundary = boundary.substring("multipart/mixed; boundary=".length(), boundary.length());
          System.out.println("Boundary" + boundary); // --af481055-4e4f-4860-9c0b-bb636d86d639
          InputStream is = returnEntity.getContent();
          splitter(is, boundary);
      }
  
      //extract subsets from the input stream based on content type
      private void splitter(InputStream is, String boundary) throws IOException {
          ByteArrayOutputStream boas = null;
          FileOutputStream fos = null;
  
          MultipartStream multipartStream = new MultipartStream(is, boundary.getBytes());
          boolean nextPart = multipartStream.skipPreamble();
          System.out.println("NEXT PART :: " + nextPart);
          while (nextPart) {
              String header = multipartStream.readHeaders();
              if (header.contains("Content-Type: "+MediaType.APPLICATION_OCTET_STREAM_TYPE)) {
                  fos = new FileOutputStream(new File("myfilename.pdf"));
                  multipartStream.readBodyData(fos);
              } else if (header.contains("Content-Type: "+MediaType.TEXT_PLAIN_TYPE)) {
                  boas = new ByteArrayOutputStream();
                  multipartStream.readBodyData(boas);
                  String newString = new String( boas.toByteArray());
              } else if (header.contains("Content-Type: "+ MediaType.APPLICATION_JSON_TYPE)) {
                  //extract string and create JSONObject from it
              } else if (header.contains("Content-Type: "+MediaType.APPLICATION_XML_TYPE)) {
                  //extract string and create XML object from it
              }
              nextPart = multipartStream.readBoundary();
          }
      }
  </code></pre>
  
  <p><strong>Is this the right approach?</strong></p>
  
  <p><em><strong>UPDATE 2:</em></strong>
  The logic above seems to work. But got another block, when receiving the RESPONSE from the webservice. I could not find any references to handle such issues in the Response.
  The logic assumes that there is ONE part for a part type. If there are, say, 2 JSON parts in the response, it would be difficult to identify which part is what. In other words, though we can add the part with a key name while creating the response, we are unable to extract the key names int he client side.
  Any clues?</p>