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 }