1 package org.codehaus.xfire.transport.http;
2
3 import javax.servlet.http.HttpServletRequest;
4 import javax.servlet.http.HttpServletResponse;
5
6 import org.apache.commons.logging.Log;
7 import org.apache.commons.logging.LogFactory;
8 import org.codehaus.xfire.MessageContext;
9 import org.codehaus.xfire.handler.AbstractHandler;
10 import org.codehaus.xfire.handler.Phase;
11 import org.codehaus.xfire.service.Service;
12 import org.codehaus.xfire.transport.AbstractWSDLTransport;
13 import org.codehaus.xfire.transport.Channel;
14 import org.codehaus.xfire.transport.DefaultEndpoint;
15
16 /***
17 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
18 */
19 public class SoapHttpTransport
20 extends AbstractWSDLTransport
21 {
22 private static final Log log = LogFactory.getLog(SoapHttpTransport.class);
23
24 public final static String NAME = "Http";
25
26 public final static String HTTP_TRANSPORT_NS = "http://schemas.xmlsoap.org/soap/http";
27
28 private final static String URI_PREFIX = "urn:xfire:transport:http:";
29
30 public SoapHttpTransport()
31 {
32 addFaultHandler(new FaultResponseCodeHandler());
33 }
34
35 /***
36 * @see org.codehaus.xfire.transport.Transport#getName()
37 */
38 public String getName()
39 {
40 return NAME;
41 }
42
43 protected Channel createNewChannel(String uri)
44 {
45 log.debug("Creating new channel for uri: " + uri);
46
47 HttpSoapChannel c = new HttpSoapChannel(uri, this);
48 c.setEndpoint(new DefaultEndpoint());
49
50 return c;
51 }
52
53 protected String getUriPrefix()
54 {
55 return URI_PREFIX;
56 }
57 /***
58 * Get the URL for a particular service.
59 */
60 public String getServiceURL( Service service )
61 {
62 HttpServletRequest req = XFireServletController.getRequest();
63
64 if (req == null)
65 {
66 return "http://localhost/services/" + service.getName();
67 }
68
69 StringBuffer output = new StringBuffer( 128 );
70
71 output.append( req.getScheme() );
72 output.append( "://" );
73 output.append( req.getServerName() );
74
75 if ( req.getServerPort() != 80 &&
76 req.getServerPort() != 443 &&
77 req.getServerPort() != 0 )
78 {
79 output.append( ':' );
80 output.append( req.getServerPort() );
81 }
82
83 output.append( req.getRequestURI() );
84
85 return output.toString();
86 }
87
88 public String getTransportURI( Service service )
89 {
90 return HTTP_TRANSPORT_NS;
91 }
92
93 protected String getWebappBase(HttpServletRequest request)
94 {
95 StringBuffer baseURL = new StringBuffer(128);
96 baseURL.append(request.getScheme());
97 baseURL.append("://");
98 baseURL.append(request.getServerName());
99 if (request.getServerPort() != 80)
100 {
101 baseURL.append(":");
102 baseURL.append(request.getServerPort());
103 }
104 baseURL.append(request.getContextPath());
105 return baseURL.toString();
106 }
107
108 public String[] getKnownUriSchemes()
109 {
110 return new String[] { "http://", "https://" };
111 }
112
113 public class FaultResponseCodeHandler
114 extends AbstractHandler
115 {
116 public String getPhase()
117 {
118 return Phase.TRANSPORT;
119 }
120
121 /***
122 * @see org.codehaus.xfire.handler.Handler#invoke(org.codehaus.xfire.MessageContext)
123 * @param context
124 * @throws Exception
125 */
126 public void invoke(MessageContext context)
127 {
128 HttpServletResponse response = XFireServletController.getResponse();
129 if ( response != null )
130 response.setStatus(500);
131 }
132 }
133 }