1
2
3
4
5
6
7
8
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
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 }