You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@synapse.apache.org by as...@apache.org on 2007/02/03 18:42:19 UTC
svn commit: r503267 - in
/webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp:
HttpCoreNIOListener.java ServerWorker.java
Author: asankha
Date: Sat Feb 3 09:42:17 2007
New Revision: 503267
URL: http://svn.apache.org/viewvc?view=rev&rev=503267
Log:
commit GET support for the NIO transport
Modified:
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/HttpCoreNIOListener.java
webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/ServerWorker.java
Modified: webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/HttpCoreNIOListener.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/HttpCoreNIOListener.java?view=diff&rev=503267&r1=503266&r2=503267
==============================================================================
--- webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/HttpCoreNIOListener.java (original)
+++ webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/HttpCoreNIOListener.java Sat Feb 3 09:42:17 2007
@@ -124,7 +124,7 @@
}
serviceEPRPrefix = "http://" + host + (port == 80 ? "" : ":" + port) +
- cfgCtx.getServiceContextPath() + "/";
+ "/" + cfgCtx.getServiceContextPath() + "/";
}
/**
Modified: webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/ServerWorker.java
URL: http://svn.apache.org/viewvc/webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/ServerWorker.java?view=diff&rev=503267&r1=503266&r2=503267
==============================================================================
--- webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/ServerWorker.java (original)
+++ webservices/synapse/trunk/java/modules/nhttp/src/org/apache/axis2/transport/nhttp/ServerWorker.java Sat Feb 3 09:42:17 2007
@@ -20,24 +20,29 @@
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
+import org.apache.axis2.engine.AxisEngine;
+import org.apache.axis2.description.AxisService;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.http.HTTPTransportUtils;
+import org.apache.axis2.transport.http.HTTPTransportReceiver;
import org.apache.axis2.util.UUIDGenerator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.http.Header;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
+import org.apache.http.*;
import org.apache.http.nio.NHttpServerConnection;
import org.apache.http.protocol.HTTP;
+import org.apache.ws.commons.schema.XmlSchema;
import javax.xml.namespace.QName;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
+import java.io.OutputStreamWriter;
+import java.util.*;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.InetAddress;
/**
* Processes an incoming request through Axis2. An instance of this class would be created to
@@ -63,7 +68,11 @@
private InputStream is = null;
/** the output stream to write the response message body */
private OutputStream os = null;
- private static final String SOAPACTION = "SOAPAction";
+ private static final String SOAPACTION = "SOAPAction";
+ private static final String LOCATION = "Location";
+ private static final String CONTENT_TYPE = "Content-Type";
+ private static final String TEXT_HTML = "text/html";
+ private static final String TEXT_XML = "text/xml";
/**
* Create a new server side worker to process an incoming message and optionally begin creating
@@ -138,7 +147,7 @@
String method = request.getRequestLine().getMethod().toUpperCase();
if ("GET".equals(method)) {
- //processGet(response);
+ processGet();
} else if ("POST".equals(method)) {
processPost();
} else {
@@ -165,35 +174,233 @@
}
}
- private void handleException(String msg, Exception e) {
+ /**
+ *
+ */
+ private void processGet() {
+
+ String uri = request.getRequestLine().getUri();
+
+ String contextPath = cfgCtx.getContextRoot();
+ if (!contextPath.startsWith("/")) {
+ contextPath = "/" + contextPath;
+ }
+ if (!contextPath.endsWith("/")) {
+ contextPath = contextPath + "/";
+ }
+
+ String servicePath = cfgCtx.getServiceContextPath();
+ if (!servicePath.startsWith("/")) {
+ servicePath = "/" + servicePath;
+ }
+
+ String serviceName = null;
+ if (uri.startsWith(servicePath)) {
+ serviceName = uri.substring(servicePath.length());
+ if (serviceName.startsWith("/")) {
+ serviceName = serviceName.substring(1);
+ }
+ if (serviceName.indexOf("?") != -1) {
+ serviceName = serviceName.substring(0, serviceName.indexOf("?"));
+ }
+ }
+
+ Map parameters = new HashMap();
+ int pos = uri.indexOf("?");
+ if (pos != -1) {
+ StringTokenizer st = new StringTokenizer(uri.substring(pos+1), "&");
+ while (st.hasMoreTokens()) {
+ String param = st.nextToken();
+ pos = param.indexOf("=");
+ if (pos != -1) {
+ parameters.put(param.substring(0, pos), param.substring(pos+1));
+ } else {
+ parameters.put(param, null);
+ }
+ }
+ }
+
+ if (uri.equals("/favicon.ico")) {
+ response.setStatusCode(HttpStatus.SC_MOVED_PERMANENTLY);
+ response.addHeader(LOCATION, "http://ws.apache.org/favicon.ico");
+ serverHandler.commitResponse(conn, response);
+
+ } else if (!uri.startsWith(servicePath)) {
+ response.setStatusCode(HttpStatus.SC_MOVED_PERMANENTLY);
+ response.addHeader(LOCATION, servicePath + "/");
+ serverHandler.commitResponse(conn, response);
+
+ } else if (serviceName != null && parameters.containsKey("wsdl")) {
+ AxisService service = (AxisService) cfgCtx.getAxisConfiguration().
+ getServices().get(serviceName);
+ if (service != null) {
+ try {
+ response.addHeader(CONTENT_TYPE, TEXT_XML);
+ serverHandler.commitResponse(conn, response);
+ service.printWSDL(os, getIpAddress(), contextPath);
+
+ } catch (AxisFault e) {
+ handleException("Axis2 fault writing ?wsdl output", e);
+ return;
+ } catch (SocketException e) {
+ handleException("Error getting ip address for ?wsdl output", e);
+ return;
+ }
+ }
+
+ } else if (serviceName != null && parameters.containsKey("wsdl2")) {
+ AxisService service = (AxisService) cfgCtx.getAxisConfiguration().
+ getServices().get(serviceName);
+ if (service != null) {
+ try {
+ response.addHeader(CONTENT_TYPE, TEXT_XML);
+ serverHandler.commitResponse(conn, response);
+ service.printWSDL2(os, getIpAddress(), contextPath);
+
+ } catch (AxisFault e) {
+ handleException("Axis2 fault writing ?wsdl2 output", e);
+ return;
+ } catch (SocketException e) {
+ handleException("Error getting ip address for ?wsdl2 output", e);
+ return;
+ }
+ }
+
+ } else if (serviceName != null && parameters.containsKey("xsd")) {
+ if (parameters.get("xsd") == null || "".equals(parameters.get("xsd"))) {
+ AxisService service = (AxisService) cfgCtx.getAxisConfiguration()
+ .getServices().get(serviceName);
+ if (service != null) {
+ try {
+ response.addHeader(CONTENT_TYPE, TEXT_XML);
+ serverHandler.commitResponse(conn, response);
+ service.printSchema(os);
+
+ } catch (AxisFault axisFault) {
+ handleException("Error writing ?xsd output to client", axisFault);
+ return;
+ } catch (IOException e) {
+ handleException("Error writing ?xsd output to client", e);
+ return;
+ }
+ }
+
+ } else {
+ //cater for named xsds - check for the xsd name
+ String schemaName = (String) parameters.get("xsd");
+ AxisService service = (AxisService) cfgCtx.getAxisConfiguration()
+ .getServices().get(serviceName);
+
+ if (service != null) {
+ //run the population logic just to be sure
+ service.populateSchemaMappings();
+ //write out the correct schema
+ Map schemaTable = service.getSchemaMappingTable();
+ final XmlSchema schema = (XmlSchema)schemaTable.get(schemaName);
+ //schema found - write it to the stream
+ if (schema != null) {
+ response.addHeader(CONTENT_TYPE, TEXT_XML);
+ serverHandler.commitResponse(conn, response);
+ schema.write(os);
+
+ } else {
+ // no schema available by that name - send 404
+ response.setStatusCode(HttpStatus.SC_NOT_FOUND);
+ }
+ }
+ }
+
+ } else if (serviceName == null || serviceName.length() == 0) {
- log.error(msg, e);
- if (conn != null) {
try {
- conn.shutdown();
- } catch (IOException ignore) {}
+ response.addHeader(CONTENT_TYPE, TEXT_HTML);
+ serverHandler.commitResponse(conn, response);
+ os.write(HTTPTransportReceiver.getServicesHTML(cfgCtx).getBytes());
+
+ } catch (IOException e) {
+ handleException("Error writing ? output to client", e);
+ }
+
+ } else {
+ if (parameters.isEmpty()) {
+ AxisService service = (AxisService) cfgCtx.getAxisConfiguration().
+ getServices().get(serviceName);
+ if (service != null) {
+ try {
+ response.addHeader(CONTENT_TYPE, TEXT_HTML);
+ serverHandler.commitResponse(conn, response);
+ os.write(HTTPTransportReceiver.printServiceHTML(serviceName, cfgCtx).getBytes());
+
+ } catch (IOException e) {
+ handleException("Error writing service HTML to client", e);
+ return;
+ }
+ } else {
+ handleException("Invalid service : " + serviceName, null);
+ return;
+ }
+
+ } else {
+ try {
+ serverHandler.commitResponse(conn, response);
+ HTTPTransportUtils.processHTTPGetRequest(
+ msgContext, os,
+ (request.getFirstHeader(SOAPACTION) != null ?
+ request.getFirstHeader(SOAPACTION).getValue() : null),
+ request.getRequestLine().getUri(),
+ cfgCtx,
+ parameters);
+
+ } catch (AxisFault axisFault) {
+ handleException("Error processing GET request for: " +
+ request.getRequestLine().getUri(), axisFault);
+ }
+ }
+ }
+
+ // make sure that the output stream is flushed and closed properly
+ try {
+ os.flush();
+ os.close();
+ } catch (IOException ignore) {}
+ }
+
+
+ private void handleException(String msg, Exception e) {
+
+ if (e == null) {
+ log.error(msg);
+ } else {
+ log.error(msg, e);
}
- /*try {
+
+ if (e == null) {
+ e = new Exception(msg);
+ }
+
+ try {
AxisEngine engine = new AxisEngine(cfgCtx);
- msgContext.setProperty(MessageContext.TRANSPORT_OUT, response.getOutputStream());
- msgContext.setProperty(org.apache.axis2.Constants.OUT_TRANSPORT_INFO, response.getOutputStream());
MessageContext faultContext = engine.createFaultMessageContext(msgContext, e);
engine.sendFault(faultContext);
} catch (Exception ex) {
- response.addHeader(Constants.CONTENT_TYPE, Constants.TEXT_PLAIN);
- OutputStreamWriter out = new OutputStreamWriter(
- response.getOutputStream());
+ response.setStatusCode(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+ response.addHeader(CONTENT_TYPE, TEXT_XML);
+ serverHandler.commitResponse(conn, response);
+
try {
- out.write(ex.getMessage());
- out.close();
- } catch (IOException ee) {
- }
+ os.write(msg.getBytes());
+ if (ex != null) {
+ os.write(ex.getMessage().getBytes());
+ }
+ } catch (IOException ignore) {}
- } finally {
- response.setStatus(ResponseStatus.INTERNAL_SERVER_ERROR);
- response.commit();
- }*/
+ if (conn != null) {
+ try {
+ conn.shutdown();
+ } catch (IOException ignore) {}
+ }
+ }
}
@@ -215,5 +422,44 @@
public NHttpServerConnection getConn() {
return conn;
+ }
+
+ /**
+ * Copied from transport.http of Axis2
+ *
+ * Returns the ip address to be used for the replyto epr
+ * CAUTION:
+ * This will go through all the available network interfaces and will try to return an ip address.
+ * First this will try to get the first IP which is not loopback address (127.0.0.1). If none is found
+ * then this will return this will return 127.0.0.1.
+ * This will <b>not<b> consider IPv6 addresses.
+ * <p/>
+ * TODO:
+ * - Improve this logic to genaralize it a bit more
+ * - Obtain the ip to be used here from the Call API
+ *
+ * @return Returns String.
+ * @throws java.net.SocketException
+ */
+ private static String getIpAddress() throws SocketException {
+ Enumeration e = NetworkInterface.getNetworkInterfaces();
+ String address = "127.0.0.1";
+
+ while (e.hasMoreElements()) {
+ NetworkInterface netface = (NetworkInterface) e.nextElement();
+ Enumeration addresses = netface.getInetAddresses();
+
+ while (addresses.hasMoreElements()) {
+ InetAddress ip = (InetAddress) addresses.nextElement();
+ if (!ip.isLoopbackAddress() && isIP(ip.getHostAddress())) {
+ return ip.getHostAddress();
+ }
+ }
+ }
+ return address;
+ }
+
+ private static boolean isIP(String hostAddress) {
+ return hostAddress.split("[.]").length == 4;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: synapse-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: synapse-dev-help@ws.apache.org