1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.opensaml.ws.soap.soap11.encoder.http;
18
19 import java.util.List;
20
21 import org.opensaml.ws.message.MessageContext;
22 import org.opensaml.ws.message.encoder.MessageEncodingException;
23 import org.opensaml.ws.soap.soap11.Envelope;
24 import org.opensaml.ws.soap.soap11.Header;
25 import org.opensaml.ws.soap.soap11.encoder.SOAP11Encoder;
26 import org.opensaml.ws.transport.http.HTTPOutTransport;
27 import org.opensaml.ws.transport.http.HTTPTransportUtils;
28 import org.opensaml.ws.wsaddressing.Action;
29 import org.opensaml.xml.XMLObject;
30 import org.slf4j.Logger;
31 import org.slf4j.LoggerFactory;
32
33
34
35
36 public class HTTPSOAP11Encoder extends SOAP11Encoder {
37
38
39 private final Logger log = LoggerFactory.getLogger(HTTPSOAP11Encoder.class);
40
41
42
43 public HTTPSOAP11Encoder() {
44 super();
45 }
46
47
48 protected void doEncode(MessageContext messageContext) throws MessageEncodingException {
49 if (!(messageContext.getOutboundMessageTransport() instanceof HTTPOutTransport)) {
50 log.error("Invalid outbound message transport type, this encoder only support HTTPOutTransport");
51 throw new MessageEncodingException(
52 "Invalid outbound message transport type, this encoder only support HTTPOutTransport");
53 }
54
55 super.doEncode(messageContext);
56 }
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 protected void preprocessTransport(MessageContext messageContext) throws MessageEncodingException {
81 HTTPOutTransport outTransport = (HTTPOutTransport) messageContext.getOutboundMessageTransport();
82 HTTPTransportUtils.addNoCacheHeaders(outTransport);
83 HTTPTransportUtils.setUTF8Encoding(outTransport);
84 HTTPTransportUtils.setContentType(outTransport, "text/xml");
85
86 String soapAction = getSOAPAction(messageContext);
87 if (soapAction != null) {
88 outTransport.setHeader("SOAPAction", soapAction);
89 } else {
90 outTransport.setHeader("SOAPAction", "");
91 }
92 }
93
94
95
96
97
98
99
100
101
102
103
104
105 protected String getSOAPAction(MessageContext messageContext) {
106 Envelope env = (Envelope) messageContext.getOutboundMessage();
107 Header header = env.getHeader();
108 if (header == null) {
109 return null;
110 }
111 List<XMLObject> objList = header.getUnknownXMLObjects(Action.ELEMENT_NAME);
112 if (objList == null || objList.isEmpty()) {
113 return null;
114 } else {
115 return ((Action)objList.get(0)).getValue();
116 }
117 }
118
119 }