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.