View Javadoc

1   /*
2    * $Id: HttpsMessageReceiver.java 10961 2008-02-22 19:01:02Z dfeist $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSource, Inc.  All rights reserved.  http://www.mulesource.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
9    */
10  
11  package org.mule.transport.http;
12  
13  import org.mule.api.MuleMessage;
14  import org.mule.api.endpoint.InboundEndpoint;
15  import org.mule.api.lifecycle.CreateException;
16  import org.mule.api.service.Service;
17  import org.mule.api.transport.Connector;
18  
19  import java.io.IOException;
20  import java.net.Socket;
21  import java.security.cert.Certificate;
22  
23  import javax.net.ssl.HandshakeCompletedEvent;
24  import javax.net.ssl.HandshakeCompletedListener;
25  import javax.net.ssl.SSLPeerUnverifiedException;
26  import javax.net.ssl.SSLSocket;
27  import javax.resource.spi.work.Work;
28  
29  public class HttpsMessageReceiver extends HttpMessageReceiver
30  {
31  
32      public HttpsMessageReceiver(Connector connector, Service service, InboundEndpoint endpoint)
33              throws CreateException
34      {
35          super(connector, service, endpoint);
36      }
37  
38      // @Override
39      protected Work createWork(Socket socket) throws IOException
40      {
41          return new HttpsWorker(socket);
42      }
43  
44  
45      private class HttpsWorker extends HttpWorker implements HandshakeCompletedListener
46      {
47          private Certificate[] peerCertificateChain;
48          private Certificate[] localCertificateChain;
49  
50          public HttpsWorker(Socket socket) throws IOException
51          {
52              super(socket);
53              ((SSLSocket) socket).addHandshakeCompletedListener(this);
54          }
55  
56          protected void preRouteMessage(MuleMessage message)
57          {
58              super.preRouteMessage(message);
59              
60              if (peerCertificateChain != null)
61              {
62                  message.setProperty(HttpsConnector.PEER_CERTIFICATES, peerCertificateChain);
63              }
64              if (localCertificateChain != null)
65              {
66                  message.setProperty(HttpsConnector.LOCAL_CERTIFICATES, localCertificateChain);
67              }
68          }
69  
70          public void handshakeCompleted(HandshakeCompletedEvent event)
71          {
72              localCertificateChain = event.getLocalCertificates();
73              try
74              {
75                  peerCertificateChain = event.getPeerCertificates();
76              }
77              catch (SSLPeerUnverifiedException e)
78              {
79                  logger.debug("Cannot get peer certificate chain: "+ e.getMessage());
80              }
81          }
82  
83      }
84  
85  
86  }