From 47c08abcfd8532ef877b1a65c2baddbca6203299 Mon Sep 17 00:00:00 2001 From: Andrea Aime Date: Fri, 25 Nov 2016 10:50:16 +0100 Subject: [PATCH] [GEOS-7888] ClassCastException when posting WFS Transaction request on a URL containing a valid GetFeature request --- .../java/org/geoserver/ows/Dispatcher.java | 32 ++++++++++++------- .../org/geoserver/wfs/TransactionTest.java | 23 +++++++++++++ 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/src/ows/src/main/java/org/geoserver/ows/Dispatcher.java b/src/ows/src/main/java/org/geoserver/ows/Dispatcher.java index 58656d86a14..65f2def3306 100644 --- a/src/ows/src/main/java/org/geoserver/ows/Dispatcher.java +++ b/src/ows/src/main/java/org/geoserver/ows/Dispatcher.java @@ -500,19 +500,19 @@ Service service(Request req) throws Exception { //check the body if (req.getInput() != null) { Map xml = readOpPost(req.getInput()); - if (req.getService() == null) { + if (xml.get("service") != null) { req.setService(normalize((String) xml.get("service"))); } - if (req.getVersion() == null) { + if (xml.get("version") != null) { req.setVersion(normalizeVersion(normalize((String) xml.get("version")))); } - if (req.getRequest() == null) { + if (xml.get("request") != null) { req.setRequest(normalize((String) xml.get("request"))); } - if (req.getOutputFormat() == null) { + if (xml.get("outputFormat") != null) { req.setOutputFormat(normalize((String) xml.get("outputFormat"))); } - if (req.getNamespace() == null) { + if ((String)xml.get("namespace") != null) { req.setNamespace(normalize((String)xml.get("namespace"))); } } @@ -623,12 +623,11 @@ Operation dispatch(Request req, Service serviceDescriptor) } // ensure the requested operation exists - boolean exists = false; - for ( String op : serviceDescriptor.getOperations() ) { - if ( op.equalsIgnoreCase( req.getRequest() ) ) { - exists = true; - break; - } + boolean exists = operationExists(req, serviceDescriptor); + // did we have a mixed kvp + post request and trusted the body for the request? + if(!exists && req.getKvp().get("request") != null) { + req.setRequest(normalize(KvpUtils.getSingleValue(req.getKvp(), "request"))); + exists = operationExists(req, serviceDescriptor); } // lookup the operation, initial lookup based on (service,request) @@ -790,6 +789,17 @@ else if (parameterType.isAssignableFrom(InputStream.class)) { return fireOperationDispatchedCallback(req,op); } + private boolean operationExists(Request req, Service serviceDescriptor) { + boolean exists = false; + for ( String op : serviceDescriptor.getOperations() ) { + if ( op.equalsIgnoreCase( req.getRequest() ) ) { + exists = true; + break; + } + } + return exists; + } + Operation fireOperationDispatchedCallback(Request req, Operation op ) { for ( DispatcherCallback cb : callbacks ) { Operation o = cb.operationDispatched( req, op ); diff --git a/src/wfs/src/test/java/org/geoserver/wfs/TransactionTest.java b/src/wfs/src/test/java/org/geoserver/wfs/TransactionTest.java index c822ef14306..f4336e59687 100644 --- a/src/wfs/src/test/java/org/geoserver/wfs/TransactionTest.java +++ b/src/wfs/src/test/java/org/geoserver/wfs/TransactionTest.java @@ -159,6 +159,29 @@ public void testInsert() throws Exception { assertEquals(2, dom.getElementsByTagName("gml:featureMember") .getLength()); } + + @Test + public void testInsertWithGetFeatureInThePath() throws Exception { + // perform an insert + String insert = " " + + " " + + "" + + "" + + "" + + "" + + "494475.71056415,5433016.8189323 494982.70115662,5435041.95096618" + + "" + "" + + "" + "t0002" + + "" + "" + ""; + + Document dom = postAsDOM("wfs?service=WFS&version=1.0.0&request=GetFeature&typeName=cgf:Lines", insert); + assertTrue(dom.getElementsByTagName("wfs:SUCCESS").getLength() != 0); + assertTrue(dom.getElementsByTagName("wfs:InsertResult").getLength() != 0); + } @Test public void testUpdate() throws Exception {