From 32ab41edd231c7d3872369c4ec6efa0feda6e77a Mon Sep 17 00:00:00 2001 From: Guilhem Lavaux Date: Sat, 20 Dec 2003 12:28:25 +0000 Subject: [PATCH] URLParseError.java: New file. 2003-12-20 Guilhem Lavaux * gnu/java/net/URLParseError.java: New file. * gnu/java/net/protocol/jar/Handler.java (parseURL): Throw URLParseError if needed, fix '/' handling. * java/net/URL.java (URL): Catch URLParseError and transform it into a MalformedURLException. From-SVN: r74877 --- libjava/ChangeLog | 8 +++ libjava/gnu/java/net/URLParseError.java | 57 +++++++++++++++++++ .../gnu/java/net/protocol/jar/Handler.java | 28 +++++++-- libjava/java/net/URL.java | 14 ++++- 4 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 libjava/gnu/java/net/URLParseError.java diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 4e9299caaa8..869b50f3561 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,11 @@ +2003-12-20 Guilhem Lavaux + + * gnu/java/net/URLParseError.java: New file. + * gnu/java/net/protocol/jar/Handler.java + (parseURL): Throw URLParseError if needed, fix '/' handling. + * java/net/URL.java (URL): Catch URLParseError and + transform it into a MalformedURLException. + 2003-12-19 Michael Koch * gnu/java/nio/ChannelOutputStream.java: New file. diff --git a/libjava/gnu/java/net/URLParseError.java b/libjava/gnu/java/net/URLParseError.java new file mode 100644 index 00000000000..95eed65ddcd --- /dev/null +++ b/libjava/gnu/java/net/URLParseError.java @@ -0,0 +1,57 @@ +/* URLParseError.java -- Helps bypassing the exception limitation for + URLStreamHandler.parseURL(). + Copyright (C) 2003 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + +package gnu.java.net; + +/** + * This class helps the people writing protocols to report URL parse + * errors in parseUrl as this method cannot report other exceptions + * than Errors. + * + * The main drawback is that it uses the Error mechanism which should not + * be used for that type of error reporting. + * + * @author Guilhem Lavaux + */ +public class URLParseError extends Error +{ + public URLParseError(String msg) + { + super(msg); + } +} diff --git a/libjava/gnu/java/net/protocol/jar/Handler.java b/libjava/gnu/java/net/protocol/jar/Handler.java index 76ba6fddf3b..d1235032c38 100644 --- a/libjava/gnu/java/net/protocol/jar/Handler.java +++ b/libjava/gnu/java/net/protocol/jar/Handler.java @@ -38,7 +38,9 @@ exception statement from your version. */ package gnu.java.net.protocol.jar; +import gnu.java.net.URLParseError; import java.io.IOException; +import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; @@ -91,10 +93,11 @@ public class Handler extends URLStreamHandler if (url_string.startsWith("/")) { //url string is an absolute path int idx = file.lastIndexOf ("!/"); - if (idx == -1) //context path is weird - file = file + "!" + url_string; - else - file = file.substring (0, idx + 1) + url_string; + + if (idx < 0) + throw new URLParseError("no !/ in spec"); + + file = file.substring (0, idx + 1) + url_string; } else { @@ -108,7 +111,7 @@ public class Handler extends URLStreamHandler // according to Java API Documentation, here is a little different // with URLStreamHandler.parseURL // but JDK seems doesn't handle it well - file = file + "/" + url_string; + file = file.substring(0, idx + 1) + url_string; } setURL (url, "jar", url.getHost(), url.getPort(), file, null); @@ -125,9 +128,22 @@ public class Handler extends URLStreamHandler // Skip remains of protocol url_string = url_string.substring (start, end); + + int jar_stop; + if ((jar_stop = url_string.indexOf("!/")) < 0) + throw new URLParseError("no !/ in spec"); + + try + { + new URL(url_string.substring (0, jar_stop)); + } + catch (MalformedURLException e) + { + throw new URLParseError("invalid inner URL: " + e.getMessage()); + } if (!url.getProtocol().equals ("jar") ) - return; + throw new URLParseError("unexpected protocol " + url.getProtocol()); setURL (url, "jar", url.getHost(), url.getPort(), url_string, null); } diff --git a/libjava/java/net/URL.java b/libjava/java/net/URL.java index 35b3c797c7f..79771d916de 100644 --- a/libjava/java/net/URL.java +++ b/libjava/java/net/URL.java @@ -38,6 +38,7 @@ exception statement from your version. */ package java.net; +import gnu.java.net.URLParseError; import java.io.InputStream; import java.io.IOException; import java.io.Serializable; @@ -432,8 +433,17 @@ public final class URL implements Serializable // is to be excluded by passing the 'limit' as the indexOf the '#' // if one exists, otherwise pass the end of the string. int hashAt = spec.indexOf('#', colon + 1); - this.ph.parseURL(this, spec, colon + 1, - hashAt < 0 ? spec.length() : hashAt); + + try + { + this.ph.parseURL(this, spec, colon + 1, + hashAt < 0 ? spec.length() : hashAt); + } + catch (URLParseError e) + { + throw new MalformedURLException(e.getMessage()); + } + if (hashAt >= 0) ref = spec.substring(hashAt + 1); -- 2.30.2