1
2
3
4
5
6
7
8
9
10
11 package org.mule.transport.http;
12
13 import org.mule.api.MessagingException;
14 import org.mule.api.MuleMessage;
15 import org.mule.api.endpoint.InboundEndpoint;
16 import org.mule.api.lifecycle.CreateException;
17 import org.mule.api.service.Service;
18 import org.mule.api.transport.Connector;
19 import org.mule.transport.http.i18n.HttpMessages;
20
21 import java.io.IOException;
22 import java.net.Socket;
23 import java.security.cert.Certificate;
24
25 import javax.net.ssl.HandshakeCompletedEvent;
26 import javax.net.ssl.HandshakeCompletedListener;
27 import javax.net.ssl.SSLPeerUnverifiedException;
28 import javax.net.ssl.SSLSocket;
29 import javax.resource.spi.work.Work;
30
31 import edu.emory.mathcs.backport.java.util.concurrent.CountDownLatch;
32 import edu.emory.mathcs.backport.java.util.concurrent.TimeUnit;
33
34 public class HttpsMessageReceiver extends HttpMessageReceiver
35 {
36
37 public HttpsMessageReceiver(Connector connector, Service service, InboundEndpoint endpoint)
38 throws CreateException
39 {
40 super(connector, service, endpoint);
41 }
42
43 @Override
44 protected Work createWork(Socket socket) throws IOException
45 {
46 return new HttpsWorker(socket);
47 }
48
49 private class HttpsWorker extends HttpWorker implements HandshakeCompletedListener
50 {
51 private Certificate[] peerCertificateChain;
52 private Certificate[] localCertificateChain;
53 private final CountDownLatch latch = new CountDownLatch(1);
54
55 public HttpsWorker(Socket socket) throws IOException
56 {
57 super(socket);
58 ((SSLSocket) socket).addHandshakeCompletedListener(this);
59 }
60
61 @Override
62 protected void preRouteMessage(MuleMessage message) throws MessagingException
63 {
64 try
65 {
66 long timeout = ((HttpsConnector) getConnector()).getSslHandshakeTimeout();
67 boolean handshakeComplete = latch.await(timeout, TimeUnit.MILLISECONDS);
68 if (!handshakeComplete)
69 {
70 throw new MessagingException(HttpMessages.sslHandshakeDidNotComplete(), message);
71 }
72 }
73 catch (InterruptedException e)
74 {
75 throw new MessagingException(HttpMessages.sslHandshakeDidNotComplete(),
76 message, e);
77 }
78
79 super.preRouteMessage(message);
80
81 if (peerCertificateChain != null)
82 {
83 message.setOutboundProperty(HttpsConnector.PEER_CERTIFICATES, peerCertificateChain);
84 }
85 if (localCertificateChain != null)
86 {
87 message.setOutboundProperty(HttpsConnector.LOCAL_CERTIFICATES, localCertificateChain);
88 }
89 }
90
91 public void handshakeCompleted(HandshakeCompletedEvent event)
92 {
93 try
94 {
95 localCertificateChain = event.getLocalCertificates();
96 try
97 {
98 peerCertificateChain = event.getPeerCertificates();
99 }
100 catch (SSLPeerUnverifiedException e)
101 {
102 logger.debug("Cannot get peer certificate chain: "+ e.getMessage());
103 }
104 }
105 finally
106 {
107 latch.countDown();
108 }
109 }
110 }
111
112 }