Hi Ede,

I've had a strange problem since a few days which is not related to your fix but to WMS and encoding.

java.io.IOException: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 49263; Invalid byte 3 of 3-byte UTF-8 sequence.
    at com.vividsolutions.wms.AbstractParser.parseCapabilities(AbstractParser.java:95)
    at com.vividsolutions.wms.WMService.initialize(WMService.java:152)
    at com.vividsolutions.jump.workbench.ui.plugin.wms.URLWizardPanel.exitingToRight(URLWizardPanel.java:172)

A version of OpenJUMP which used to work (1.4.1) suddenly stopped working with this error.
I get the same error with the last NB (r6216) and I could localize the faulty string : "ortho‐images"
The character in the middle is an hyphen (U+2010 = 3 hexa bytes : e2 80 90 ).

What is curious is :
- e2 80 90 seems to be a valid UTF-8 sequence
- GetCapability response String containing this sequence is right (declared in UTF-8 parsed correctly by any browser or xml editor)
- if I test the last OpenJUMP in dev mode (running OpenJUMP from my IDE), I do not get the error message ! (and I get the layers from the GetCapability)

Any idea ?

Oh, analyzing the starting process in dev mode vs in production mode, I noticed that in dev mode, java is started with -Dfile.encoding=UTF-8

Now, adding -Dfile.encoding=UTF-8 in my bat file seems to solve the problem.

Anyway, I don't fully understand the problem. Isn't GetCapabilities parsing supposed to use the xml encoding declaration ?

Any hint  on this ?

I the meantime, I will try to add -Dfile.encoding=UTF-8 on different distribution to check it solves the problem (but I think it may have drawbacks with plugins using the default platform encoding like csv reader).

Michaël

envoyé : 4 janvier 2020 à 20:00
de : edgar.sol...@web.de
à : OpenJump develop and use <jump-pilot-devel@lists.sourceforge.net>
objet : [JPP-Devel] Fwd: SVN: [6214] core/trunk


Mike,

could you please check the fix and close the ticket if it works as expected?.. thanks ede


-------- Forwarded Message --------
Subject: [JPP-Devel] SVN: [6214] core/trunk
Date: Sat, 04 Jan 2020 18:58:23 +0000
From: jump-pilot-svn--- via Jump-pilot-devel <jump-pilot-devel@lists.sourceforge.net>
Reply-To: OpenJump develop and use <jump-pilot-devel@lists.sourceforge.net>
To: jump-pilot-devel@lists.sourceforge.net
CC: jump-pilot-...@lists.sourceforge.net

Revision: 6214
http://sourceforge.net/p/jump-pilot/code/6214
Author: edso
Date: 2020-01-04 18:58:23 +0000 (Sat, 04 Jan 2020)
Log Message:
-----------
bugfix #489 "Veneto Region (Italy) WMS service does not work on OpenJump"
wms now follows http redirections by default
also
some better error handling/reporting
Edit WMS resets connection now on manual url editing

Modified Paths:
--------------
core/trunk/ChangeLog
core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/EditWMSQueryPanel.java
core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/MapLayerPanel.java
core/trunk/src/com/vividsolutions/wms/AbstractWMSRequest.java
core/trunk/src/com/vividsolutions/wms/BasicRequest.java
core/trunk/src/com/vividsolutions/wms/FeatureInfoRequest.java
core/trunk/src/com/vividsolutions/wms/MapRequest.java
core/trunk/src/com/vividsolutions/wms/WMService.java
core/trunk/src/org/openjump/util/URLConnectionProvider.java

Modified: core/trunk/ChangeLog
===================================================================
--- core/trunk/ChangeLog 2020-01-01 09:21:44 UTC (rev 6213)
+++ core/trunk/ChangeLog 2020-01-04 18:58:23 UTC (rev 6214)
@@ -3,6 +3,10 @@
# 2. make sure that lines break at 80 chars for constricted display situations
#<-------------------------------- 80 chars ---------------------------------->#

+2020-01-04 ede
+ * bugfix #489 "Veneto Region (Italy) WMS service does not work on OpenJump"
+ wms now follows http redirections by default
+
2020-01-01 mmichaud <m.michael.mich...@orange.fr>
* Clean and improve ExtractLayersByAttribute
* Implements FR #262 : copy info to clipboard (patch from Rashad)

Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/EditWMSQueryPanel.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/EditWMSQueryPanel.java 2020-01-01 09:21:44 UTC (rev 6213)
+++ core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/EditWMSQueryPanel.java 2020-01-04 18:58:23 UTC (rev 6214)
@@ -57,6 +57,7 @@
import javax.swing.border.Border;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
+import javax.swing.text.JTextComponent;

import org.apache.commons.lang3.ArrayUtils;
import org.openjump.core.ui.plugin.wms.AddWmsLayerWizard;
@@ -63,6 +64,7 @@
import org.openjump.util.UriUtil;

import com.vividsolutions.jump.I18N;
+import com.vividsolutions.jump.workbench.JUMPWorkbench;
import com.vividsolutions.jump.workbench.model.WMSLayer;
import com.vividsolutions.jump.workbench.plugin.EnableCheck;
import com.vividsolutions.jump.workbench.ui.InputChangedListener;
@@ -303,7 +305,6 @@
private void reset(DocumentEvent e) {
System.out.println(e);
resetConnection();
- ;
}
};

@@ -329,13 +330,19 @@
SwingUtilities.invokeLater(new Runnable() {
public void run() {
for (final Component c : cs) {
- // System.out.println(c);
+ //System.out.println(c);
if (c instanceof AbstractButton)
((AbstractButton) c).addActionListener(ali);
else if (c instanceof JTextField)
((JTextField) c).getDocument().addDocumentListener(doli);
- else if (c instanceof JComboBox)
+ else if (c instanceof JComboBox) {
((JComboBox) c).addActionListener(ali);
+ // also reset if url is edited manually
+ Component editor = ((JComboBox) c).getEditor().getEditorComponent();
+ if ( editor instanceof JTextComponent) {
+ ((JTextComponent)editor).getDocument().addDocumentListener(doli);
+ }
+ }
}
}
});
@@ -357,9 +364,10 @@
protected void reinitializeService() {
String url = ""> url = "">- .urlAddCredentials(url, urlPanel.getUser(), urlPanel.getPass());
+ .urlAddCredentials(url, urlPanel.getUser(), urlPanel.getPass()).trim();

- url = "">+// [ed] url is now legalized b4 every request
+// url = ""> // [UT] 20.04.2005
WMService service = new WMService(url, URLWizardPanel.wmsVersion);

@@ -369,8 +377,8 @@
mapLayerPanel.init(service, layer.getLayerNames());
connectButton.setEnabled(false);
} catch (Exception e) {
- e.printStackTrace();
mapLayerPanel.reset();
+ JUMPWorkbench.getInstance().getFrame().handleThrowable(e);
} finally {
refreshParamCombos();
}

Modified: core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/MapLayerPanel.java
===================================================================
--- core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/MapLayerPanel.java 2020-01-01 09:21:44 UTC (rev 6213)
+++ core/trunk/src/com/vividsolutions/jump/workbench/ui/plugin/wms/MapLayerPanel.java 2020-01-04 18:58:23 UTC (rev 6214)
@@ -339,7 +339,7 @@
}

public void reset() {
- this.service = null;
+ //this.service = null;
((TreeAddRemoveList) addRemovePanel.getLeftList()).setModel(new TreeAddRemoveListModel(new DefaultTreeModel(null)));
addRemovePanel.getRightList().getModel().setItems(new ArrayList());
addRemovePanel.updateEnabled();

Modified: core/trunk/src/com/vividsolutions/wms/AbstractWMSRequest.java
===================================================================
--- core/trunk/src/com/vividsolutions/wms/AbstractWMSRequest.java 2020-01-01 09:21:44 UTC (rev 6213)
+++ core/trunk/src/com/vividsolutions/wms/AbstractWMSRequest.java 2020-01-04 18:58:23 UTC (rev 6214)
@@ -70,14 +70,9 @@
*/
protected HttpURLConnection prepareConnection() throws IOException {
URL requestUrl = getURL();
- con = (HttpURLConnection) URLConnectionProvider.getJUMP_URLConnectionProvider().getConnection(requestUrl);
- con = (HttpURLConnection) requestUrl.openConnection();
+ // by default we follow redirections
+ con = (HttpURLConnection) URLConnectionProvider.getJUMP_URLConnectionProvider().getHttpConnection(requestUrl, true);

- con.setConnectTimeout(Integer.parseInt(
- ProxySettingsOptionsPanel.getInstance().getSetting(ProxySettingsOptionsPanel.OPEN_TIMEOUT_KEY).toString()));
- con.setReadTimeout(Integer.parseInt(
- ProxySettingsOptionsPanel.getInstance().getSetting(ProxySettingsOptionsPanel.OPEN_TIMEOUT_KEY).toString()));
-
// add this service's auth info
String userInfo = requestUrl.getUserInfo();
if (userInfo != null) {
@@ -102,6 +97,7 @@
public HttpURLConnection getConnection() throws IOException {
if (con == null)
con = prepareConnection();
+
return con;
}

@@ -148,27 +144,32 @@
*/
public String getText() throws IOException {
HttpURLConnection con = getConnection();
- return readConnection(con, 0, false);
+ boolean httpOk = con.getResponseCode() == HttpURLConnection.HTTP_OK;
+ if (!httpOk)
+ readToError(con);
+
+ return readConnection(con, 0);
}

protected String readToError(HttpURLConnection con) throws IOException {
- return readConnection(con, 1024, true);
+ String url = "">+ String headers = con.getHeaderFields().toString();
+ String result = readConnection(con, 1024);
+ throw new WMSException( "Request url: " + url +
+ "\nResponse code: " + con.getResponseCode() + "\nHeaders:\n" + headers + "\nResponse body:\n" + result);
}

- protected String readConnection(HttpURLConnection con, long limit,
- boolean throwError) throws IOException {
+ protected String readConnection(HttpURLConnection con, long limit) throws IOException {
boolean httpOk = con.getResponseCode() == HttpURLConnection.HTTP_OK;
// get correct stream
InputStream in = httpOk ? con.getInputStream() : con.getErrorStream();
- // limit max chars
- BoundedInputStream bin = new BoundedInputStream(in, limit > 0 ? limit : -1);

- String result = IOUtils.toString(bin);
- FileUtil.close(bin);
-
- if (throwError) {
- throw new WMSException("Response code: " + con.getResponseCode()
- + "\nResponse body:\n" + result);
+ String result = "";
+ if (in!=null) {
+ // limit max chars
+ BoundedInputStream bin = new BoundedInputStream(in, limit > 0 ? limit : -1);
+ result = IOUtils.toString(bin);
+ FileUtil.close(bin);
}

return result;

Modified: core/trunk/src/com/vividsolutions/wms/BasicRequest.java
===================================================================
--- core/trunk/src/com/vividsolutions/wms/BasicRequest.java 2020-01-01 09:21:44 UTC (rev 6213)
+++ core/trunk/src/com/vividsolutions/wms/BasicRequest.java 2020-01-04 18:58:23 UTC (rev 6214)
@@ -22,4 +22,5 @@
public URL getURL() throws MalformedURLException {
return url;
}
+
}

Modified: core/trunk/src/com/vividsolutions/wms/FeatureInfoRequest.java
===================================================================
--- core/trunk/src/com/vividsolutions/wms/FeatureInfoRequest.java 2020-01-01 09:21:44 UTC (rev 6213)
+++ core/trunk/src/com/vividsolutions/wms/FeatureInfoRequest.java 2020-01-04 18:58:23 UTC (rev 6214)
@@ -46,14 +46,14 @@

@Override
public URL getURL() throws MalformedURLException {
- String featInfoUrl = service.getCapabilities().getFeatureInfoURL();
+ String featInfoUrl = WMService.legalize(service.getCapabilities().getFeatureInfoURL());

- if (featInfoUrl.contains("?")) {
- if (!featInfoUrl.endsWith("?"))
- featInfoUrl += "&";
- } else {
- featInfoUrl += "?";
- }
+// if (featInfoUrl.contains("?")) {
+// if (!featInfoUrl.endsWith("?"))
+// featInfoUrl += "&";
+// } else {
+// featInfoUrl += "?";
+// }

if (WMService.WMS_1_0_0.equals(version)) {
featInfoUrl += "REQUEST=feature_info&WMTVER=1.0.0";

Modified: core/trunk/src/com/vividsolutions/wms/MapRequest.java
===================================================================
--- core/trunk/src/com/vividsolutions/wms/MapRequest.java 2020-01-01 09:21:44 UTC (rev 6213)
+++ core/trunk/src/com/vividsolutions/wms/MapRequest.java 2020-01-04 18:58:23 UTC (rev 6214)
@@ -244,7 +244,8 @@
} else if ( WMService.WMS_1_3_0.equals( version ) ){
ver = "REQUEST=GetMap&SERVICE=WMS&VERSION=1.3.0";
}
- urlBuf.append( service.getCapabilities().getGetMapURL() + ver + "&WIDTH=" + imgWidth + "&HEIGHT=" + imgHeight );
+ urlBuf.append(WMService.legalize(service.getCapabilities().getGetMapURL()) + ver + "&WIDTH=" + imgWidth + "&HEIGHT="
+ + imgHeight);
try {
urlBuf.append( "&LAYERS=" + encode(listToString( layerNames ), "UTF-8") );
} catch (UnsupportedEncodingException e1) {

Modified: core/trunk/src/com/vividsolutions/wms/WMService.java
===================================================================
--- core/trunk/src/com/vividsolutions/wms/WMService.java 2020-01-01 09:21:44 UTC (rev 6213)
+++ core/trunk/src/com/vividsolutions/wms/WMService.java 2020-01-04 18:58:23 UTC (rev 6214)
@@ -50,10 +50,10 @@
import javax.net.ssl.*;
import javax.swing.JOptionPane;

+import org.apache.commons.io.IOUtils;
import org.openjump.util.UriUtil;

import com.vividsolutions.jump.I18N;
-import com.vividsolutions.jump.workbench.ui.ErrorDialog;

/**
* Represents a remote WMS Service.
@@ -143,13 +143,13 @@
}

try {
- String requestUrlString = this.serverUrl + req;
+ String requestUrlString = WMService.legalize(this.serverUrl.toString()) + req;
URL requestUrl = new URL(requestUrlString);

URLConnection con = new BasicRequest(this, requestUrl).getConnection();

- // Parser p = new Parser();
- cap = parser.parseCapabilities(this, con.getInputStream());
+ String out = new BasicRequest(this, requestUrl).getText();
+ cap = parser.parseCapabilities(this, IOUtils.toInputStream(out) );
String url1 = cap.getService().getServerUrl();
String url2 = cap.getGetMapURL();


Modified: core/trunk/src/org/openjump/util/URLConnectionProvider.java
===================================================================
--- core/trunk/src/org/openjump/util/URLConnectionProvider.java 2020-01-01 09:21:44 UTC (rev 6213)
+++ core/trunk/src/org/openjump/util/URLConnectionProvider.java 2020-01-04 18:58:23 UTC (rev 6214)
@@ -3,7 +3,9 @@
import com.vividsolutions.jump.I18N;
import com.vividsolutions.jump.util.Blackboard;
import com.vividsolutions.jump.workbench.JUMPWorkbench;
+import com.vividsolutions.jump.workbench.Logger;
import com.vividsolutions.jump.workbench.plugin.PlugInContext;
+import com.vividsolutions.jump.workbench.ui.network.ProxySettingsOptionsPanel;
import com.vividsolutions.jump.workbench.ui.plugin.PersistentBlackboardPlugIn;

import javax.net.ssl.HttpsURLConnection;
@@ -12,8 +14,10 @@
import javax.net.ssl.X509TrustManager;
import javax.swing.*;
import java.io.IOException;
+import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
+import java.net.URLDecoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
@@ -49,13 +53,63 @@
this.authorizedURL = (Set<String>)this.blackboard.get(KEY, new HashSet<String>());
}

+ public HttpURLConnection getHttpConnection(URL url, boolean followRedirects) throws IOException {
+ HttpURLConnection connection = (HttpURLConnection) getHttpConnection(url);
+
+ // we handle redirects ourselfs
+ connection.setInstanceFollowRedirects(false);
+
+ URL prev = null, next = connection.getURL();
+ while (followRedirects && !next.equals(prev) ) {
+ connection = getHttpConnection(next);
+ // we handle redirects ourselfs
+ connection.setInstanceFollowRedirects(false);
+
+ switch (connection.getResponseCode())
+ {
+ case HttpURLConnection.HTTP_MOVED_PERM:
+ case HttpURLConnection.HTTP_MOVED_TEMP:
+ String location = connection.getHeaderField("Location");
+ location = URLDecoder.decode(location, "UTF-8");
+ prev = connection.getURL();
+ next = new URL(prev, location); // compute relative URLs
+ Logger.warn("Follow http redirect to: "+next);
+ continue;
+ }
+ break;
+ }
+
+ return connection;
+ }
+
+ /**
+ * @deprecated use getHttpConnection(url,followRedirects) instead
+ * @param url
+ * @return
+ * @throws IOException
+ */
+ @Deprecated
public URLConnection getConnection(URL url) throws IOException {
+ return getHttpConnection(url, true);
+ }
+
+ public HttpURLConnection getHttpConnection(URL url) throws IOException {
String protocol = url.getProtocol();
- if (!protocol.equals("https")) return url.openConnection();
- URLConnection connection;
+// if (!protocol.equals("https")) return url.openConnection();
+
+ if (!protocol.matches("^(?i:https?)$"))
+ throw new IOException("Please provide an http(s):// url.");
+
+ HttpURLConnection connection = (HttpURLConnection)url.openConnection();
+
+ // apply timeouts from settings
+ connection.setConnectTimeout(Integer.parseInt(
+ ProxySettingsOptionsPanel.getInstance().getSetting(ProxySettingsOptionsPanel.OPEN_TIMEOUT_KEY).toString()));
+ connection.setReadTimeout(Integer.parseInt(
+ ProxySettingsOptionsPanel.getInstance().getSetting(ProxySettingsOptionsPanel.READ_TIMEOUT_KEY).toString()));
+
try {
- setTrustOption(false, null);
- connection = url.openConnection();
+ setTrustOption(false, url);
connection.connect(); // try to connect
return connection; // can connect
} catch(IOException|KeyManagementException|NoSuchAlgorithmException e) {
@@ -63,7 +117,7 @@
if (authorizedURL.contains(baseURL) || acceptConnection(url)) {
try {
setTrustOption(true, url);
- connection = url.openConnection();
+ connection = (HttpURLConnection) url.openConnection();
authorizedURL.add(baseURL);
//setTrustOption(false, null);
return connection;
@@ -96,15 +150,22 @@
};
private Set<URL> trustedURLs = new HashSet<>();

- private void setTrustOption(boolean trust, URL url)
- throws KeyManagementException, NoSuchAlgorithmException {
+ /**
+ *
+ * @param trust
+ * @param url
+ * @throws KeyManagementException
+ * @throws NoSuchAlgorithmException
+ */
+ private void setTrustOption(boolean trust, URL url) throws KeyManagementException, NoSuchAlgorithmException {
SSLContext sc = SSLContext.getInstance("SSL");
+ String host = url != null ? url.getHost() : "";
if (trust || (url != null && trustedURLs.contains(url))) {
- System.out.println("Set the trust manager to not check certificates");
- sc.init(null, new TrustManager[]{trm}, null);
+ Logger.info("Certificate verification for trusted host '" + host + "' is disabled'");
+ sc.init(null, new TrustManager[] { trm }, null);
trustedURLs.add(url);
} else {
- System.out.println("Set the trust manager to check certificates");
+ Logger.info("Using the system trust manager to verify certificate for host '"+host+"'.");
sc.init(null, null, null);
}
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());



_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel


_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to