title: How do I sign an MTOM SOAP message using SOAPHandlers?
body: <p>Currently, I have two handlers, one for logging and one for signing the SOAP message (which inherently tampers with the SOAP message). Without the handler chain, MTOM works as expected, inserting a reference to the binary content, rather than inlining the base64 binary content. </p>
  
  <p>As soon as I introduce a handler, the MTOM content is now included inline.</p>
  
  <p>Is it possible to use handlers to sign a SOAP message or is there a more appropriate means of doing this?</p>
  
  <p><strong>Update 1</strong>
  Unable to post the full source. Essentially though, custom SOAPHandler implementation. It performs some basic XMLDsig type operations on a timestamp (in header), custom header and SOAP body. The resultant digest values are then injected into a signature element in the header.</p>
  
  <p>With respect to the logger, it is again a simple SOAPHandler. If either it or the signing handler are used exclusively, the result is the same, an MTOM message with the byte content inlined. The only progress I made was using a MessageHandler for logging. This allowed me to output the SOAP envelope (albeit with the byte content inlined) and still maintain the MTOM separation. So not really a solution but an indication that any modification of the SOAP message needs to occur at a lower level. This is leading me down the path of tubes.</p>
  
  <p><strong>Update 2</strong></p>
  
  <p>The following is an example of the <code>MessageHandler</code> approach. You can see that the raw HTTP dump will contain the multiple part message whereas the actually output inlines the base64. The only difference between this impementation and a <code>SOAPHandler</code> implementation is that the actual HTTP request changes to be a single part inlined MTOM message.</p>
  
  <pre><code>@Override
  public boolean handleMessage(MessageHandlerContext context) {
  
    HttpTransportPipe.dump = true;
  
    Boolean isOutgoing = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
  
    if (isOutgoing) {
      System.out.println("\nOutbound message:");
      XMLStreamWriter writer = XMLStreamWriterFactory.create(System.out);
      try {
        context.getMessage().writeTo(writer);
      } catch (XMLStreamException e) {
        throw new IllegalStateException("Unable to write");
      }
    } else {
      System.out.println("\nInbound message:");
    }
    return true;
  }
  </code></pre>