Author: hiranya
Date: Thu Aug 8 00:20:17 2013
New Revision: 1511547
URL: http://svn.apache.org/r1511547
Log:
Supporting a transport attribute on API configuration. Patch applied from
SYNAPSE-953 with some changes
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/rest/APIFactory.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/rest/APISerializer.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/rest/API.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/rest/RESTConstants.java
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/rest/APISerializationTest.java
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/rest/APIDispatcherTest.java
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/rest/APIFactory.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/rest/APIFactory.java?rev=1511547&r1=1511546&r2=1511547&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/rest/APIFactory.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/rest/APIFactory.java
Thu Aug 8 00:20:17 2013
@@ -21,12 +21,14 @@ package org.apache.synapse.config.xml.re
import org.apache.axiom.om.OMAttribute;
import org.apache.axiom.om.OMElement;
+import org.apache.axis2.Constants;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.synapse.SynapseException;
import org.apache.synapse.config.xml.XMLConfigConstants;
import org.apache.synapse.rest.API;
import org.apache.synapse.rest.Handler;
+import org.apache.synapse.rest.RESTConstants;
import org.apache.synapse.rest.version.VersionStrategy;
import javax.xml.namespace.QName;
@@ -40,11 +42,13 @@ public class APIFactory {
OMAttribute nameAtt = apiElt.getAttribute(new QName("name"));
if (nameAtt == null || "".equals(nameAtt.getAttributeValue())) {
handleException("Attribute 'name' is required for an API
definition");
+ return null;
}
OMAttribute contextAtt = apiElt.getAttribute(new QName("context"));
if (contextAtt == null || "".equals(contextAtt.getAttributeValue())) {
handleException("Attribute 'context' is required for an API
definition");
+ return null;
}
API api = new API(nameAtt.getAttributeValue(),
contextAtt.getAttributeValue());
@@ -87,6 +91,20 @@ public class APIFactory {
}
}
+ OMAttribute transport = apiElt.getAttribute(
+ new QName(XMLConfigConstants.NULL_NAMESPACE, "transport"));
+ if (transport != null) {
+ String transports = transport.getAttributeValue();
+ if (!"".equals(transports)) {
+ if (Constants.TRANSPORT_HTTP.equals(transports)) {
+ api.setProtocol(RESTConstants.PROTOCOL_HTTP_ONLY);
+ } else if (Constants.TRANSPORT_HTTPS.equals(transports)) {
+ api.setProtocol(RESTConstants.PROTOCOL_HTTPS_ONLY);
+ } else {
+ handleException("Invalid protocol name: " + transports);
+ }
+ }
+ }
return api;
}
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/rest/APISerializer.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/rest/APISerializer.java?rev=1511547&r1=1511546&r2=1511547&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/rest/APISerializer.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/rest/APISerializer.java
Thu Aug 8 00:20:17 2013
@@ -19,12 +19,12 @@
package org.apache.synapse.config.xml.rest;
-import org.apache.axiom.om.OMAbstractFactory;
-import org.apache.axiom.om.OMElement;
-import org.apache.axiom.om.OMFactory;
+import org.apache.axiom.om.*;
+import org.apache.axis2.Constants;
import org.apache.synapse.SynapseConstants;
import org.apache.synapse.rest.API;
import org.apache.synapse.rest.Handler;
+import org.apache.synapse.rest.RESTConstants;
import org.apache.synapse.rest.Resource;
public class APISerializer {
@@ -60,6 +60,13 @@ public class APISerializer {
}
apiElt.addChild(handlersElt);
}
+
+ if (api.getProtocol() == RESTConstants.PROTOCOL_HTTP_ONLY) {
+ apiElt.addAttribute("transport", Constants.TRANSPORT_HTTP, null);
+ } else if (api.getProtocol() == RESTConstants.PROTOCOL_HTTPS_ONLY) {
+ apiElt.addAttribute("transport", Constants.TRANSPORT_HTTPS, null);
+ }
+
return apiElt;
}
}
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/rest/API.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/rest/API.java?rev=1511547&r1=1511546&r2=1511547&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/rest/API.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/rest/API.java
Thu Aug 8 00:20:17 2013
@@ -44,6 +44,8 @@ public class API extends AbstractRESTPro
private Map<String,Resource> resources = new
LinkedHashMap<String,Resource>();
private List<Handler> handlers = new ArrayList<Handler>();
+ private int protocol = RESTConstants.PROTOCOL_HTTP_AND_HTTPS;
+
private VersionStrategy versionStrategy = new DefaultStrategy(this);
private String fileName;
@@ -68,6 +70,14 @@ public class API extends AbstractRESTPro
return name;
}
+ public int getProtocol() {
+ return protocol;
+ }
+
+ public void setProtocol(int protocol) {
+ this.protocol = protocol;
+ }
+
public String getAPIName() {
return name;
}
@@ -176,9 +186,10 @@ public class API extends AbstractRESTPro
return false;
}
+ org.apache.axis2.context.MessageContext msgCtx =
+ ((Axis2MessageContext) synCtx).getAxis2MessageContext();
+
if (host != null || port != -1) {
- org.apache.axis2.context.MessageContext msgCtx =
- ((Axis2MessageContext)
synCtx).getAxis2MessageContext();
String hostHeader = getHostHeader(msgCtx);
if (hostHeader != null) {
if (host != null &&
!host.equals(extractHostName(hostHeader))) {
@@ -204,6 +215,29 @@ public class API extends AbstractRESTPro
return false;
}
}
+ if (protocol == RESTConstants.PROTOCOL_HTTP_ONLY &&
+
!Constants.TRANSPORT_HTTP.equals(msgCtx.getIncomingTransportName())) {
+ if (log.isDebugEnabled()) {
+ log.debug("Protocol information does not match - Expected
HTTP");
+ }
+ synCtx.setProperty(RESTConstants.REST_API_TRANSPORT_DENIED,
true);
+ synCtx.setProperty(RESTConstants.REST_API_IN_TRANSPORT,
+ msgCtx.getIncomingTransportName());
+ log.warn("Trying to access API : " + name + " on restricted
transport chanel [" +
+ msgCtx.getIncomingTransportName() + "]");
+ return false;
+ } else if (protocol == RESTConstants.PROTOCOL_HTTPS_ONLY &&
+
!Constants.TRANSPORT_HTTPS.equals(msgCtx.getIncomingTransportName())) {
+ if (log.isDebugEnabled()) {
+ log.debug("Protocol information does not match - Expected
HTTPS");
+ }
+ synCtx.setProperty(RESTConstants.REST_API_TRANSPORT_DENIED,
true);
+ synCtx.setProperty(RESTConstants.REST_API_IN_TRANSPORT,
+ msgCtx.getIncomingTransportName());
+ log.warn("Trying to access API : " + name + " on restricted
transport chanel [" +
+ msgCtx.getIncomingTransportName() + "]");
+ return false;
+ }
}
return true;
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/rest/RESTConstants.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/rest/RESTConstants.java?rev=1511547&r1=1511546&r2=1511547&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/rest/RESTConstants.java
(original)
+++
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/rest/RESTConstants.java
Thu Aug 8 00:20:17 2013
@@ -48,4 +48,9 @@ public class RESTConstants {
public static final String NO_MATCHING_RESOURCE_HANDLER =
"_resource_mismatch_handler_";
+ /** The Synapse MC property that indicates the in-transport */
+ public static final String REST_API_IN_TRANSPORT = "REST_API_IN_TRANSPORT";
+ /** The Synapse MC property that marks if the message was denied on the
accessed transport */
+ public static final String REST_API_TRANSPORT_DENIED =
"REST_API_TRANSPORT_DENIED";
+
}
Modified:
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/rest/APISerializationTest.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/rest/APISerializationTest.java?rev=1511547&r1=1511546&r2=1511547&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/rest/APISerializationTest.java
(original)
+++
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/config/xml/rest/APISerializationTest.java
Thu Aug 8 00:20:17 2013
@@ -93,4 +93,28 @@ public class APISerializationTest extend
OMElement out = APISerializer.serializeAPI(api);
assertXMLEqual(xml, out.toString());
}
+
+ public void testAPISerialization7() throws Exception {
+ String xml = "<api name=\"test\" transport=\"http\"
context=\"/dictionary\" xmlns=\"http://ws.apache.org/ns/synapse\">" +
+ "<resource url-mapping=\"/admin/view\" inSequence=\"in\"
outSequence=\"out\"/></api>";
+ OMElement om = AXIOMUtil.stringToOM(xml);
+ API api = APIFactory.createAPI(om);
+ OMElement out = APISerializer.serializeAPI(api);
+ assertXMLEqual(xml, out.toString());
+ }
+
+ public void testAPISerialization8() throws Exception {
+ String xml = "<api name=\"test\" transport=\"https\"
context=\"/dictionary\" hostname=\"apache.org\" port=\"8243\"" +
+ " xmlns=\"http://ws.apache.org/ns/synapse\"><resource
url-mapping=\"/admin/view/*\" " +
+
"><inSequence><log/><send/></inSequence><outSequence><log/><send/></outSequence></resource>"
+
+ "<resource
url-mapping=\"/admin/*\"><inSequence><log/><send/></inSequence><outSequence>" +
+ "<log/><send/></outSequence></resource><resource
uri-template=\"/{char}/{word}\">" +
+ "<inSequence><send/></inSequence><faultSequence><log
level=\"full\"/></faultSequence>" +
+ "</resource><handlers><handler
class=\"org.apache.synapse.config.xml.rest.TestHandler\"/>" +
+ "</handlers></api>";
+ OMElement om = AXIOMUtil.stringToOM(xml);
+ API api = APIFactory.createAPI(om);
+ OMElement out = APISerializer.serializeAPI(api);
+ assertXMLEqual(xml, out.toString());
+ }
}
Modified:
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/rest/APIDispatcherTest.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/rest/APIDispatcherTest.java?rev=1511547&r1=1511546&r2=1511547&view=diff
==============================================================================
---
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/rest/APIDispatcherTest.java
(original)
+++
synapse/trunk/java/modules/core/src/test/java/org/apache/synapse/rest/APIDispatcherTest.java
Thu Aug 8 00:20:17 2013
@@ -80,6 +80,38 @@ public class APIDispatcherTest extends R
assertNull(synCtx.getProperty(RESTConstants.SYNAPSE_REST_API));
}
+ public void testTransportBasedAPIDispatch() throws Exception {
+ API api = new API(TEST_API, "/test");
+ api.setProtocol(RESTConstants.PROTOCOL_HTTP_ONLY);
+ SynapseConfiguration synapseConfig = new SynapseConfiguration();
+ synapseConfig.addAPI(TEST_API, api);
+
+ RESTRequestHandler handler = new RESTRequestHandler();
+
+ // Messages with '/test' context should be dispatched
+ MessageContext synCtx = getMessageContext(synapseConfig, false,
"/test", "GET");
+ handler.process(synCtx);
+ assertEquals(TEST_API,
synCtx.getProperty(RESTConstants.SYNAPSE_REST_API));
+ synCtx = getMessageContext(synapseConfig, false, "/test/", "GET");
+ handler.process(synCtx);
+ assertEquals(TEST_API,
synCtx.getProperty(RESTConstants.SYNAPSE_REST_API));
+ synCtx = getMessageContext(synapseConfig, false, "/test/foo/bar?a=5",
"GET");
+ handler.process(synCtx);
+ assertEquals(TEST_API,
synCtx.getProperty(RESTConstants.SYNAPSE_REST_API));
+ synCtx = getMessageContext(synapseConfig, false, "/test?a=5", "GET");
+ handler.process(synCtx);
+ assertEquals(TEST_API,
synCtx.getProperty(RESTConstants.SYNAPSE_REST_API));
+
+ // Messages sent via HTTPS should NOT be dispatched
+ synCtx = getMessageContext(synapseConfig, true, "/test", "GET");
+ handler.process(synCtx);
+ assertNull(synCtx.getProperty(RESTConstants.SYNAPSE_REST_API));
+
+ synCtx = getMessageContext(synapseConfig, true, "/test/foo/bar?a=5",
"GET");
+ handler.process(synCtx);
+ assertNull(synCtx.getProperty(RESTConstants.SYNAPSE_REST_API));
+ }
+
public void testResponseDispatch() throws Exception {
API api = new API(TEST_API, "/test");
SynapseConfiguration synapseConfig = new SynapseConfiguration();