Change 17854: Fix URL encoding for MacPerl Help/Shuck

[email protected] (Chris Nandor) Sun, 8 Sep 2002 18:38:33 -0400
Newsgroups perl.perl5.changes.mac
Message-ID <p05111b09b9a18180ab2d@[10.0.1.177]>
Change 17854 by pudge@pudge-mobile on 2002/09/08 04:35:08

	Fix URL encoding for MacPerl Help/Shuck
	Bug exposed in Mac OS X 10.2; MacPerl Bug #598449

Affected files ...

.... //depot/maint-5.6/macperl/macos/macperl/MPHelp.c#4 edit

Differences ...

==== //depot/maint-5.6/macperl/macos/macperl/MPHelp.c#4 (text) ====
Index: macperl/macos/macperl/MPHelp.c
--- macperl/macos/macperl/MPHelp.c#3~14399~	Wed Jan 23 13:00:29 2002
+++ macperl/macos/macperl/MPHelp.c	Sat Sep  7 21:35:08 2002
@@ -5,6 +5,9 @@
 Language	:	MPW C
 
 $Log: MPHelp.c,v $
+Revision 1.4  2002/09/05 23:21:59  pudge
+Fix URL encoding (bug exposed in Mac OS X 10.2; MacPerl Bug #598449)
+
 Revision 1.3  2002/01/23 21:56:53  pudge
 Don't crash if very long word selected for help (bug #506672)
 
@@ -354,6 +357,8 @@
 	}
 }	
 
+char * gHex = "0123456789ABCDEF";
+
 void LaunchHelpURL(char * urlPtr, int urlLen)
 {
 	int		len;
@@ -382,36 +387,32 @@
 		urlPtr += strlen(urlPtr)+1;
 		urlPtr[-1] = ':';
 		urlPath	= url+strlen(url);
-		for (path = GUSIFSp2FullPath(&here); *path; path++)
-			switch (*path) {
-			case ':':	/* Translate directory separators */
+		for (path = GUSIFSp2FullPath(&here); *path; path++) {
+			if (*path == ':') {
 				*urlPath++ = '/';
-				break;
-			case '<':	/* Encode dangerous characters */
-			case '>':	
-			case '+':
-			case '\"':
-			case '*':
-			case '%':
-			case '&':
-			case '/':
-			case '(':
-			case ')':
-			case '=':
-			case '?':
-			case '\'':
-			case '`':
-			case '^':
-			case '$':
-			case '#':
-			case ' ':
-				sprintf(urlPath, "%%%02X", *path);
-				urlPath += 3;
-				break;
-			default:
+			}
+			// encode everything *except* unreserved chars,
+			// see RFC 2396
+			else if (isalnum(*path) || // A-Z a-z 0-9
+				*path == '-' ||
+				*path == '_' ||
+				*path == '.' ||
+				*path == '!' ||
+				*path == '~' ||
+				*path == '*' ||
+				*path == '\'' ||
+				*path == '(' ||
+				*path == ')' ||
+				*path == '/') { // '/' is because this is a Mac!
 				*urlPath++ = *path;
-				break;
 			}
+			else {
+				*urlPath++ = '%';
+				*urlPath++ = gHex[(*path >> 4) & 15];
+				*urlPath++ = gHex[*path & 15];
+			}
+		}
+
 		if (urlPath[-1] != '/')
 			*urlPath++ = '/';
 		memcpy(urlPath, urlPtr, urlLen);
End of Patch.