WFS-T xmlhttp string length limits?

After a long search and search, I ask now for help:

My situation:

  • I have a jquery / openlayers application that allows the user to create simple geometry with attributes over WFS-T ...
  • I am running debian6 with tomcat6 (: 80-iptables) and geoservice 2.1.3 (berth: 8181). All cross-domain issues between tomcat and geoserver are resolved with a simple jsp-proxy
  • Users can view all my wf layers without any problems and can create simple geometries

My problem:

  • Users who create more complex geometries cannot save it to WFS-T. More complex is that the resulting XML-POST content length is greater than approx. 2100 characters. POST using, for example, 2000 characters successfully inserted.
  • I went over to the tomcat server settings and disabled all restrictions (maxHTTPHeaderSize, maxSavePostSize, ...) as well as maxpostsize in the geoserver-jetty web server β†’ NO EFFECT
  • After the error response message when the user creates more complex geometries:

org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0x0) was found in the contents of the document element. An invalid XML character (Unicode: 0x0) was found in the content of the document element.


  • I don’t know why my XML POST request causes a Unicode error every time I add another vertex to the geometry that I successfully inserted before.
  • my request and response code:

successful post request

successful answer

successful POST request headers

failed POST request

failed to reply

failed POST request headers

my jsp proxy

I am very happy for any hint on how to solve my problem!

Thanks in advance,

Cheers hubert

+4
source share
1 answer

Better late than never :) The code below works for large geometries (at least for me)

Oh YEAH is the code for a simple jsp proxy

<%@page session="false"%> <%@page import="java.net.*,java.io.*" %> <%@page trimDirectiveWhitespaces="true"%> <% /** * This is a white list proxy that could be used the prevent an error due to * JavaScript Same Origin Policy. * * CAUTION: It might break some sites and it a security risk because * people can use this proxy to browse the web and possibly do bad and/or illegal stuff * with it. * It can load any content type. * This proxy implementation was inspired by the proxy.cgi script of OpenLayers * {@link http://openlayers.org} * To use this in OpenLayers you have to set OpenLayers.ProxyHost = "Url/To/This/Proxyfile/proxy.jsp?"; * within your JavaScript code <br> * The base code of the proxy has been provided by SNIPPLR * {@link http://snipplr.com/view/17987/jsp-proxy-for-javascript-applications/} * * @author terrestris GmbH & Co. KG * @author Christian Mayer * @author Marc Jansen * * @license BSD see license.txt * */ String[] allowedHosts = { "www.openlayers.org", "openlayers.org", "labs.metacarta.com", "world.freemap.in", "prototype.openmnnd.org", "geo.openplans.org", "sigma.openplans.org", "demo.opengeo.org", "www.openstreetmap.org", "sample.azavea.com", "v-swe.uni-muenster.de:8080", "vmap0.tiles.osgeo.org", "192.168.197.95:8080" }; HttpURLConnection con = null; try { String reqUrl = request.getQueryString(); String decodedUrl = ""; if (reqUrl != null) { reqUrl = URLDecoder.decode(reqUrl, "UTF-8"); } else { response.setStatus(400); out.println("ERROR 400: No target specified for proxy."); } // extract the host String host = ""; host = reqUrl.split("\\/")[2]; boolean allowed = false; // check if host (with port) is in white list for (String surl : allowedHosts) { if (host.equalsIgnoreCase(surl)) { allowed = true; break; } } // do the proxy action (load requested ressource and transport it to client) // if host is in white list if(allowed) { // replace the white spaces with plus in URL reqUrl = reqUrl.replaceAll(" ", "+"); // call the requested ressource URL url = new URL(reqUrl); con = (HttpURLConnection)url.openConnection(); con.setDoOutput(true); con.setRequestMethod(request.getMethod()); String reqContenType = request.getContentType(); if(reqContenType != null) { con.setRequestProperty("Content-Type", reqContenType); } else { con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); } int clength = request.getContentLength(); if(clength > 0) { /* NOT WORKING FOR LARGE POST BODY con.setDoInput(true); byte[] idata = new byte[clength]; request.getInputStream().read(idata, 0, clength); con.getOutputStream().write(idata, 0, clength); */ con.setDoInput(true); InputStream istream = request.getInputStream(); OutputStream os = con.getOutputStream(); final int length = 5000; byte[] bytes = new byte[length]; int bytesRead = 0; while ((bytesRead = istream.read(bytes, 0, length)) > 0) { os.write(bytes, 0, bytesRead); } } // respond to client response.setContentType(con.getContentType()); BufferedReader rd = new BufferedReader(new InputStreamReader(con.getInputStream())); String line; int i = 0; while ((line = rd.readLine()) != null) { out.println(line); } rd.close(); } else { // deny access via HTTP status code 502 response.setStatus(502); out.println("ERROR 502: This proxy does not allow you to access that location."); } } catch(Exception e) { // resond an internal server error with the stacktrace // on exception response.setStatus(500); byte[] idata = new byte[5000]; if(con.getErrorStream() != null) { con.getErrorStream().read(idata, 0, 5000); } out.println("ERROR 500: An internal server error occured. " + e.getMessage() + " " + new String(idata)); } %> 
+1
source

Source: https://habr.com/ru/post/1400010/


All Articles