classpath
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: Enhancement to URLStreamHandler


From: Wu, Gansha
Subject: RE: Enhancement to URLStreamHandler
Date: Mon, 27 Aug 2001 15:50:50 +0800

Hi, John, 
Does the following patch make sense to you? I've counted in your 
comments.

protected void
parseURL(URL url, String url_string, int start, int end)
{
  // This method does not throw an exception or return a value.  Thus our
  // strategy when we encounter an error in parsing is to return without
  // doing anything.

  // Bunches of things should be true.  Make sure.
  if (end < start)
    return;
  if ((end - start) < 2)
    return;
  if (start > url_string.length())
    return;
  if (end > url_string.length())
    end = url_string.length(); // This should be safe

  // Turn end into an offset from the end of the string instead of 
  // the beginning
  end = url_string.length() - end;

    // Skip remains of protocol
    url_string = url_string.substring(start);
-         if (!url_string.startsWith("//"))
-             return;
-         url_string = url_string.substring(2);

+    boolean nohost = false; //whether no host part presents
+    String prefix = "/";  //root path prefix of a file: could be "/", and for 
some windows file: "drive:/"

+    if( ! url.getProtocol().equals("file") ){
+         if (!url_string.startsWith("//"))
+            return;
+        url_string = url_string.substring(2);
+    } else { 
+       // The following special work is for file protocol...
+
+       //normalize the file separator
+       url_string = 
url_string.replace(System.getProperty("file.separator").charAt(0), '/');
+
+       //deal with the case: file:///d|/dir/dir/file and 
file:///d%7C/dir/dir/file
+       url_string = url_string.replace('|', ':');
+       int i;
+       if((i = url_string.toUpperCase().indexOf("%7C")) >= 0)
+           url_string = url_string.substring(0, i) + ":" + 
url_string.substring(i+3);
+
+       if (url_string.startsWith("//"))
+           url_string = url_string.substring(2);  //filter the leading "//"
+
+       // if another "/" encounters, it's end of a null host part or beginning 
of root path 
+       if (url_string.startsWith("/")){ 
+              nohost = true;
+              url_string = url_string.substring(1);
+        }
+
+       // Check whether it's a windows platform file: drive:/dir/dir/file
+       if(url_string.charAt(1) == ':' && url_string.charAt(2) == '/'){
+             nohost = true;
+             prefix = url_string.substring(0, 3); //assign "drive:/" to prefix
+             url_string = url_string.substring(3);
+        }
+   } // url.getProtocol().equals("file")

  // Declare some variables
  String host = null;
  int port = -1;
  String file = null;
  String anchor = null;

+ if( ! nohost ){
  // Process host and port
  int slash_index = url_string.indexOf("/");
  int colon_index = url_string.indexOf(":");

  if (slash_index > (url_string.length() - end))
    return;
  else if (slash_index == -1)
    slash_index = url_string.length() - end;

  if ((colon_index == -1) || (colon_index > slash_index))
    {
      host = url_string.substring(0, slash_index);
    }
  else
    {
      host = url_string.substring(0, colon_index);
      
      String port_str = url_string.substring(colon_index + 1, slash_index);
      try
        {
          port = Integer.parseInt(port_str);
        }
      catch (NumberFormatException e)
        {
          return;
        }
    }
  if (slash_index < (url_string.length() - 1))
    url_string = url_string.substring(slash_index + 1);
  else
    url_string = "";
+  } // if( ! nohost )

  // Process file and anchor 
  if (end == 0)
    {
-              file = "/" + url_string;
+             file = prefix + url_string;
      anchor = null;
    }
  else
    {
-             file = "/" + url_string.substring(0, url_string.length() - end);
+            file = prefix + url_string.substring(0, url_string.length() - end);

      // Only set anchor if end char is a '#'.  Otherwise assume we're
      // just supposed to stop scanning for some reason
      if (url_string.charAt(url_string.length() - end) == '#')
        anchor = url_string.substring((url_string.length() - end) + 1,
                                      url_string.length());
      else
        anchor = null;
    }
-           if ((file == null) || (file == ""))             <--- file couldn't 
be null or ""
-               file = "/";

  // Now set the values
  setURL(url, url.getProtocol(), host, port, file, anchor); 
}

Regards...
Gansha

-----Original Message-----
From: John Keiser [mailto:address@hidden
Sent: 2001?8?19? 2:11
To: Wu, Gansha
Cc: 'address@hidden'
Subject: Re: Enhancement to URLStreamHandler


I can see the sense in using the system file separator, too, but *only*
in file: URLs and nothing else.  I don't think http: URLs need or want
it, and there may even be URL types that want to use backslashes for
something else.  This patch does not appear to take these differences
into account.  If this makes sense to you, could you update this patch?



reply via email to

[Prev in Thread] Current Thread [Next in Thread]