Local file representation under MS Windows 2000

Hello!

  I've made a patch for URL to local file representation in HTWWWStr.c
  for MS Windows 2000.

  In current version libwww 5.3.1
  For URL "file://d:\1.htm" file name translates to //d:\1.htm\
  In patched version it translates to d:\1.htm
  
/*      Convert file URLs into a local representation
**      ---------------------------------------------
**      The URL has already been translated through the rules in get_physical
**      in HTAccess.c and all we need to do now is to map the path to a local
**      representation, for example if must translate '/' to the ones that
**      turn the wrong way ;-)
**      Returns:
**              OK:     local file (that must be freed by caller)
**              Error:  NULL
*/
PUBLIC char * HTWWWToLocal (const char * url, const char * base,
                            HTUserProfile * up)
{
    if (url) {
        char * access = HTParse(url, base, PARSE_ACCESS);
        char * host = HTParse(url, base, PARSE_HOST);
        char * path = HTParse(url, base, PARSE_PATH+PARSE_PUNCTUATION);
        const char * myhost = HTUserProfile_fqdn(up);

        /* Find out if this is a reference to the local file system */
        if ((*access && strcmp(access, "file") && strcmp(access, "cache")) ||
             (*host && strcasecomp(host, "localhost") &&
              myhost && strcmp(host, myhost))) {
            HTTRACE(CORE_TRACE, "LocalName... Not on local file system\n");
            HT_FREE(access);
            HT_FREE(host);
            HT_FREE(path);
            return NULL;
        } else {
            char *ptr;
            if ((ptr = strchr(path, ';')) || (ptr = strchr(path, '?')))
                *ptr = '\0';
        
            /*
            ** Do whatever translation is required here in order to fit your
            ** platform _before_ the path is unescaped.
            */
#ifdef VMS
            HTVMS_checkDecnet(path);
#endif
#ifdef WWW_MSWINDOWS
            /* An absolute pathname with logical drive */
            if (*path == '/' && path[2] == ':') {
                char *orig=path, *dest=path+1;
                while((*orig++ = *dest++));

            /* A network host */
            } else if (*host && strcasecomp(host, "localhost")) {
                char * newpath = NULL;
SB>                StrAllocMCopy(&newpath, /*"//",*/ host, path, NULL);
                HT_FREE(path);
                path = newpath;
            }

            /* Convert '/' to '\' */
            {
                char *p = path;
                while (*p) {
                    if (*p=='/') *p='\\';
                    p++;
                }
            }
SB>                /* delete the last '\' */
SB>                {
SB>                char *p1=&path[strlen(path)-1];
SB>                while (p1!=path && *p1=='\\')
SB>                        *p1--=0;
SB>                }
#endif
            
            HTUnEscape(path);             /* Take out the escaped characters */
            HTTRACE(CORE_TRACE, "Node........ `%s' means path `%s'\n" _ url _ path);
            HT_FREE(access);
            HT_FREE(host);
            return path;
        }
    }
    return NULL;
}

-- 
Best regards,
 Sergey                          mailto:barya@speakglobally.com

Received on Tuesday, 14 November 2000 08:41:37 UTC