Bug 350932 - expose NS_EscapeURL through nsINetUtil
authorasqueella@gmail.com
Thu, 21 Jun 2007 13:18:25 -0700
changeset 2659 dc57817f108e1dc9e5efa6e4e6c7aae770c68904
parent 2658 8c17875bf37cb15bedd553c7979623608e6618c8
child 2660 7f1ccf415d2026eff08b67433a1472cac7916543
push idunknown
push userunknown
push dateunknown
bugs350932
milestone1.9a6pre
Bug 350932 - expose NS_EscapeURL through nsINetUtil p=Prasad Sunkari <prasad@medhas.org> r+sr=biesi
netwerk/base/public/nsINetUtil.idl
netwerk/base/src/nsIOService.cpp
xpcom/io/nsEscape.h
--- a/netwerk/base/public/nsINetUtil.idl
+++ b/netwerk/base/public/nsINetUtil.idl
@@ -17,16 +17,17 @@
  * The Initial Developer of the Original Code is
  * the Mozilla Foundation.
  * Portions created by the Initial Developer are Copyright (C) 2005
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
  *   Boris Zbarsky <bzbarsky@mit.edu> (original author)
  *   Benjamin Smedberg <benjamin@smedbergs.us>
+ *   Prasad Sunkari <prasad@medhas.org>
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
  * use your version of this file under the terms of the MPL, indicate your
@@ -39,57 +40,33 @@
 
 #include "nsISupports.idl"
 
 interface nsIURI;
 
 /**
  * nsINetUtil provides various network-related utility methods.
  */
-[scriptable, uuid(7701f947-e4aa-431c-aec6-6bb304193460)]
+[scriptable, uuid(fbbd8771-8059-4269-8352-a6f2ca6b3c7b)]
 interface nsINetUtil : nsISupports
 {
   /**
    * Parse a content-type header and return the content type and
    * charset (if any).
    *
    * @param aTypeHeader the header string to parse
    * @param [out] aCharset the charset parameter specified in the
    *              header, if any.
    * @param [out] aHadCharset whether a charset was explicitly specified.
    * @return the MIME type specified in the header, in lower-case.
    */
   AUTF8String parseContentType(in AUTF8String aTypeHeader,
                                out AUTF8String aCharset,
                                out boolean aHadCharset);
 
-  /** Escape every character with its %XX-escaped equivalent */
-  const unsigned long ESCAPE_ALL = 0;
-
-  /** Leave alphanumeric characters intact and %XX-escape all others */
-  const unsigned long ESCAPE_XALPHAS = 1;
-
-  /** Leave alphanumeric characters intact, convert spaces to '+',
-      %XX-escape all others */
-  const unsigned long ESCAPE_XPALPHAS = 2;
-
-  /** Leave alphanumeric characters and forward slashes intact,
-      %XX-escape all others */
-  const unsigned long ESCAPE_URL_PATH = 4;
-
-  /**
-   * escape a string with %00-style escaping
-   */
-  ACString escapeString(in ACString aString, in unsigned long aEscapeType);
-
-  /**
-   * unescape a %00-style escaped string
-   */
-  ACString unescapeString(in ACString aString);
-
   /**
    * Test whether the given URI's handler has the given protocol flags.
    *
    * @param aURI the URI in question
    * @param aFlags the flags we're testing for.
    *
    * @return whether the protocol handler for aURI has all the flags
    *         in aFlags.
@@ -111,9 +88,109 @@ interface nsINetUtil : nsISupports
 
   /**
    * Take aURI and produce an immutable version of it for the caller.  If aURI
    * is immutable this will be aURI itself; otherwise this will be a clone,
    * marked immutable if possible.  Passing null to this method is allowed; in
    * that case it will return null.
    */
   nsIURI toImmutableURI(in nsIURI aURI);
+
+  /** Escape every character with its %XX-escaped equivalent */
+  const unsigned long ESCAPE_ALL = 0;
+
+  /** Leave alphanumeric characters intact and %XX-escape all others */
+  const unsigned long ESCAPE_XALPHAS = 1;
+
+  /** Leave alphanumeric characters intact, convert spaces to '+',
+      %XX-escape all others */
+  const unsigned long ESCAPE_XPALPHAS = 2;
+
+  /** Leave alphanumeric characters and forward slashes intact,
+      %XX-escape all others */
+  const unsigned long ESCAPE_URL_PATH = 4;
+
+  /**
+   * escape a string with %00-style escaping
+   */
+  ACString escapeString(in ACString aString, in unsigned long aEscapeType);
+
+  /** %XX-escape URL scheme */
+  const unsigned long ESCAPE_URL_SCHEME = 1;
+
+  /** %XX-escape username in the URL */
+  const unsigned long ESCAPE_URL_USERNAME = 1 << 1;
+
+  /** %XX-escape password in the URL */
+  const unsigned long ESCAPE_URL_PASSWORD = 1 << 2;
+
+  /** %XX-escape URL host */
+  const unsigned long ESCAPE_URL_HOST = 1 << 3;
+
+  /** %XX-escape URL directory */
+  const unsigned long ESCAPE_URL_DIRECTORY = 1 << 4;
+
+  /** %XX-escape file basename in the URL */
+  const unsigned long ESCAPE_URL_FILE_BASENAME = 1 << 5;
+
+  /** %XX-escape file extension in the URL */
+  const unsigned long ESCAPE_URL_FILE_EXTENSION = 1 << 6;
+
+  /** %XX-escape URL parameters */
+  const unsigned long ESCAPE_URL_PARAM = 1 << 7;
+
+  /** %XX-escape URL query */
+  const unsigned long ESCAPE_URL_QUERY = 1 << 8;
+
+  /** %XX-escape URL ref */
+  const unsigned long ESCAPE_URL_REF = 1 << 9;
+
+  /** %XX-escape URL path - same as escaping directory, basename and extension */
+  const unsigned long ESCAPE_URL_FILEPATH = 
+    ESCAPE_URL_DIRECTORY | ESCAPE_URL_FILE_BASENAME | ESCAPE_URL_FILE_EXTENSION;
+
+  /** %XX-escape scheme, username, password, host, path, params, query and ref */
+  const unsigned long ESCAPE_URL_MINIMAL = 
+    ESCAPE_URL_SCHEME | ESCAPE_URL_USERNAME | ESCAPE_URL_PASSWORD |
+    ESCAPE_URL_HOST   | ESCAPE_URL_FILEPATH | ESCAPE_URL_PARAM    |
+    ESCAPE_URL_QUERY  | ESCAPE_URL_REF;
+
+  /** Force %XX-escaping of already escaped sequences */
+  const unsigned long ESCAPE_URL_FORCED = 1 << 10;
+
+  /** Skip non-ascii octets, %XX-escape all others */
+  const unsigned long ESCAPE_URL_ONLY_ASCII = 1 << 11;     
+
+  /** 
+   * Skip graphic octets (0x20-0x7E) when escaping
+   * Skips all ascii octets when unescaping 
+   */
+  const unsigned long ESCAPE_URL_ONLY_NONASCII = 1 << 12;
+
+  /** Force %XX-escape of colon */
+  const unsigned long ESCAPE_URL_COLON = 1 << 14;
+
+  /** Skip C0 and DEL from unescaping */
+  const unsigned long ESCAPE_URL_SKIP_CONTROL = 1 << 15;
+
+  /**
+   * %XX-Escape invalid chars in a URL segment. 
+   *
+   * @param aStr the URL to be escaped
+   * @param aFlags the URL segment type flags
+   *
+   * @return the escaped string (the string itself if escaping did not happen)
+   *
+   */
+  ACString escapeURL(in ACString aStr, in unsigned long aFlags);
+
+  /**
+   * Expands URL escape sequences
+   *
+   * @param aStr the URL to be unescaped
+   * @param aFlags only ESCAPE_URL_ONLY_NONASCII, ESCAPE_URL_SKIP_CONTROL and 
+   *               are recognized.  If |aFlags| is 0 all escape sequences are 
+   *               unescaped
+   * @return unescaped string
+   */
+  ACString unescapeString(in ACString aStr, in unsigned long aFlags);
+
 };
--- a/netwerk/base/src/nsIOService.cpp
+++ b/netwerk/base/src/nsIOService.cpp
@@ -16,16 +16,17 @@
  * The Original Code is mozilla.org code.
  *
  * The Initial Developer of the Original Code is
  * Netscape Communications Corporation.
  * Portions created by the Initial Developer are Copyright (C) 1998
  * the Initial Developer. All Rights Reserved.
  *
  * Contributor(s):
+ *      Prasad Sunkari <prasad@medhas.org>
  *
  * Alternatively, the contents of this file may be used under the terms of
  * either the GNU General Public License Version 2 or later (the "GPL"), or
  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  * in which case the provisions of the GPL or the LGPL are applicable instead
  * of those above. If you wish to allow use of your version of this file only
  * under the terms of either the GPL or the LGPL, and not to allow others to
  * use your version of this file under the terms of the MPL, indicate your
@@ -957,22 +958,28 @@ nsIOService::EscapeString(const nsACStri
   if (!NS_Escape(stringCopy, result, (nsEscapeMask) aEscapeType))
     return NS_ERROR_OUT_OF_MEMORY;
 
   aResult.Assign(result);
 
   return NS_OK;
 }
 
-NS_IMETHODIMP
-nsIOService::UnescapeString(const nsACString& aString, nsACString& aResult)
+NS_IMETHODIMP 
+nsIOService::EscapeURL(const nsACString &aStr, 
+                       PRUint32 aFlags, nsACString &aResult)
 {
-  char *str = ToNewCString(aString);
-  
-  if (!str)
-    return NS_ERROR_OUT_OF_MEMORY;
-
-  str = nsUnescape(str);
-  aResult.Assign(str);
-
-  NS_Free(str);
+  aResult.Truncate();
+  PRBool escaped = NS_EscapeURL(aStr.BeginReading(), aStr.Length(), 
+                                aFlags | esc_AlwaysCopy, aResult);
   return NS_OK;
 }
+
+NS_IMETHODIMP 
+nsIOService::UnescapeString(const nsACString &aStr, 
+                            PRUint32 aFlags, nsACString &aResult)
+{
+  aResult.Truncate();
+  PRBool unescaped = NS_UnescapeURL(aStr.BeginReading(), aStr.Length(), 
+                                    aFlags | esc_AlwaysCopy, aResult);
+  return NS_OK;
+}
+
--- a/xpcom/io/nsEscape.h
+++ b/xpcom/io/nsEscape.h
@@ -94,16 +94,19 @@ nsEscapeHTML2(const PRUnichar *aSourceBu
 
 #ifdef __cplusplus
 }
 #endif
 
 
 /**
  * NS_EscapeURL/NS_UnescapeURL constants for |flags| parameter:
+ *
+ * Note: These values are copied to nsINetUtil.idl
+ *       Any changes should be kept in sync
  */
 enum EscapeMask {
   /** url components **/
   esc_Scheme         = PR_BIT(0),
   esc_Username       = PR_BIT(1),
   esc_Password       = PR_BIT(2),
   esc_Host           = PR_BIT(3),
   esc_Directory      = PR_BIT(4),