Precis: In theory, this patch fixes handling of file: URIs. It behaves correctly with the RISC OS, GTK, and framebuffer frontends. It needs testing with Amiga, BeOS, and Windows frontends.
Added files Changed files amiga/misc.c | 29 ++++++++++++++++------------- beos/beos_gui.cpp | 8 +++++--- content/fetchers/fetch_curl.c | 12 +++++------- framebuffer/findfile.c | 6 ++++-- framebuffer/misc.c | 3 ++- gtk/gtk_gui.c | 8 +++++--- gtk/gtk_scaffolding.c | 5 +++-- riscos/gui.c | 13 +++++++------ utils/url.h | 4 ---- windows/findfile.c | 9 +++++---- windows/misc.c | 3 ++- 11 files changed, 54 insertions(+), 46 deletions(-) Index: framebuffer/findfile.c =================================================================== --- framebuffer/findfile.c (revision 10385) +++ framebuffer/findfile.c (working copy) @@ -25,14 +25,16 @@ #include "utils/log.h" #include "utils/url.h" +#include "utils/utils.h" #include "framebuffer/findfile.h" char *path_to_url(const char *path) { - char *r = malloc(strlen(path) + FILE_SCHEME_PREFIX_LEN + 1); + /* Assumption: we're on a platform that uses unix paths */ + char *r = malloc(strlen(path) + SLEN("file://") + 1); - strcpy(r, FILE_SCHEME_PREFIX); + strcpy(r, "file://"); strcat(r, path); return r; Index: framebuffer/misc.c =================================================================== --- framebuffer/misc.c (revision 10385) +++ framebuffer/misc.c (working copy) @@ -42,7 +42,8 @@ char *url_to_path(const char *url) { - return strdup(url + 5); + /* Assumption: we're on a platform that uses unix paths */ + return strdup(url + SLEN("file://")); } /** Index: gtk/gtk_scaffolding.c =================================================================== --- gtk/gtk_scaffolding.c (revision 10385) +++ gtk/gtk_scaffolding.c (working copy) @@ -388,9 +388,10 @@ { struct browser_window *bw = gui_window_get_browser_window( current_model->top_level); - char url[strlen(filename) + FILE_SCHEME_PREFIX_LEN + 1]; + /* Assumption: we're on a platform that uses unix paths */ + char url[strlen(filename) + SLEN("file://") + 1]; - sprintf(url, FILE_SCHEME_PREFIX"%s", filename); + sprintf(url, "file://%s", filename); browser_window_go(bw, url, 0, true); Index: gtk/gtk_gui.c =================================================================== --- gtk/gtk_gui.c (revision 10385) +++ gtk/gtk_gui.c (working copy) @@ -738,9 +738,10 @@ char *path_to_url(const char *path) { - char *r = malloc(strlen(path) + FILE_SCHEME_PREFIX_LEN + 1); + /* Assumption: we're on a platform that uses unix paths */ + char *r = malloc(strlen(path) + SLEN("file://") + 1); - strcpy(r, FILE_SCHEME_PREFIX); + strcpy(r, "file://"); strcat(r, path); return r; @@ -749,7 +750,8 @@ char *url_to_path(const char *url) { - return strdup(url + FILE_SCHEME_PREFIX_LEN); + /* Assumption: we're on a platform that uses unix paths */ + return strdup(url + SLEN("file://")); } Index: beos/beos_gui.cpp =================================================================== --- beos/beos_gui.cpp (revision 10385) +++ beos/beos_gui.cpp (working copy) @@ -1151,9 +1151,10 @@ char *path_to_url(const char *path) { - char *r = (char *)malloc(strlen(path) + FILE_SCHEME_PREFIX_LEN + 1); + /* Assumption: BeOS/Haiku use unix-style paths */ + char *r = (char *)malloc(strlen(path) + SLEN("file://") + 1); - strcpy(r, FILE_SCHEME_PREFIX); + strcpy(r, "file://"); strcat(r, path); return r; @@ -1161,7 +1162,8 @@ char *url_to_path(const char *url) { - return strdup(url + FILE_SCHEME_PREFIX_LEN); + /* Assumption: BeOS/Haiku use unix-style paths */ + return strdup(url + SLEN("file://")); } bool cookies_update(const char *domain, const struct cookie_data *data) Index: windows/findfile.c =================================================================== --- windows/findfile.c (revision 10385) +++ windows/findfile.c (working copy) @@ -24,8 +24,8 @@ #include <stdlib.h> #include <string.h> +#include "utils/log.h" #include "utils/url.h" -#include "utils/log.h" #include "utils/utils.h" #include "windows/findfile.h" @@ -38,16 +38,17 @@ char *path_to_url(const char *path) { - char *url = malloc(strlen(path) + FILE_SCHEME_PREFIX_LEN + 1); + /* Assumption: Windows path does not have leading '/' */ + char *url = malloc(strlen(path) + SLEN("file:///") + 1); char *sidx; - strcpy(url, FILE_SCHEME_PREFIX); + strcpy(url, "file:///"); strcat(url, path); sidx = strrchr(url, '\\'); while (sidx != NULL) { *sidx = '/'; - sidx = strrchr(url, '\\'); + sidx = strrchr(sidx, '\\'); } return url; Index: windows/misc.c =================================================================== --- windows/misc.c (revision 10385) +++ windows/misc.c (working copy) @@ -48,7 +48,8 @@ char *url_to_path(const char *url) { - return strdup(url + 5); + /* Assumption: Win32 path does not have leading '/' */ + return strdup(url + SLEN("file:///")); } /** Index: utils/url.h =================================================================== --- utils/url.h (revision 10385) +++ utils/url.h (working copy) @@ -24,10 +24,6 @@ #ifndef _NETSURF_UTILS_URL_H_ #define _NETSURF_UTILS_URL_H_ -/* file url prefix */ -#define FILE_SCHEME_PREFIX "file:///" -#define FILE_SCHEME_PREFIX_LEN 8 - typedef enum { URL_FUNC_OK, /**< No error */ URL_FUNC_NOMEM, /**< Insufficient memory */ Index: riscos/gui.c =================================================================== --- riscos/gui.c (revision 10385) +++ riscos/gui.c (working copy) @@ -2070,10 +2070,10 @@ return NULL; } - memcpy(url, FILE_SCHEME_PREFIX, FILE_SCHEME_PREFIX_LEN); + memcpy(url, "file://", SLEN("file://")); if (__unixify(buffer, __RISCOSIFY_NO_REVERSE_SUFFIX, - url + FILE_SCHEME_PREFIX_LEN, - 1 - spare + 10 - FILE_SCHEME_PREFIX_LEN, + url + SLEN("file://"), + 1 - spare + 10 - SLEN("file://"), 0) == NULL) { LOG(("__unixify failed: %s", buffer)); free(buffer); @@ -2083,7 +2083,7 @@ free(buffer); buffer = NULL; /* We don't want '/' to be escaped. */ - url_err = url_escape(url, FILE_SCHEME_PREFIX_LEN, false, "/", &escurl); + url_err = url_escape(url, SLEN("file://"), false, "/", &escurl); free(url); url = NULL; if (url_err != URL_FUNC_OK) { LOG(("url_escape failed: %s", url)); @@ -2106,10 +2106,11 @@ char *temp_name, *r; char *filename; - if (strncmp(url, FILE_SCHEME_PREFIX, FILE_SCHEME_PREFIX_LEN)) + if (strncmp(url, "file:///", SLEN("file:///"))) return NULL; - temp_name = curl_unescape(url + 7, strlen(url) - 7); + temp_name = curl_unescape(url + SLEN("file://"), + strlen(url) - SLEN("file://")); if (!temp_name) { warn_user("NoMemory", 0); Index: content/fetchers/fetch_curl.c =================================================================== --- content/fetchers/fetch_curl.c (revision 10385) +++ content/fetchers/fetch_curl.c (working copy) @@ -1098,6 +1098,7 @@ #undef SKIP_ST } + /** * Find the status code and content type and inform the caller. * @@ -1153,13 +1154,10 @@ } /* find MIME type from filetype for local files */ - if (strncmp(f->url, FILE_SCHEME_PREFIX, FILE_SCHEME_PREFIX_LEN) == 0) { + if (strncmp(f->url, "file:///", 8) == 0) { struct stat s; - char *url_path = curl_unescape(f->url + FILE_SCHEME_PREFIX_LEN, - (int) strlen(f->url + FILE_SCHEME_PREFIX_LEN)); + char *url_path = url_to_path(f->url); - LOG(("Obtaining mime type for file %s", url_path)); - if (url_path != NULL && stat(url_path, &s) == 0) { /* file: URL and file exists */ char header[64]; @@ -1203,13 +1201,13 @@ fetch_send_callback(FETCH_NOTMODIFIED, f->fetch_handle, 0, 0, FETCH_ERROR_NO_ERROR); - curl_free(url_path); + free(url_path); return true; } } if (url_path != NULL) - curl_free(url_path); + free(url_path); } if (f->abort) Index: amiga/misc.c =================================================================== --- amiga/misc.c (revision 10385) +++ amiga/misc.c (working copy) @@ -59,23 +59,25 @@ char *url_to_path(const char *url) { + /* Assumption: Amiga path does not start with '/' */ char *tmps, *unesc; CURL *curl; - tmps = strstr(url, "///localhost/") + 13; + if (strncmp(url, "file:///", SLEN("file:///")) != 0) + return NULL; - if(tmps < url) tmps = strstr(url,"///") + 3; + url += SLEN("file:///"); - if(tmps >= url) + if (strncmp(url, "localhost/", SLEN("localhost/")) == 0) + url += SLEN("localhost/"); + + if(curl = curl_easy_init()) { - if(curl = curl_easy_init()) - { - unesc = curl_easy_unescape(curl,tmps,0,NULL); - tmps = strdup(unesc); - curl_free(unesc); - curl_easy_cleanup(curl); - return tmps; - } + unesc = curl_easy_unescape(curl,url,0,NULL); + tmps = strdup(unesc); + curl_free(unesc); + curl_easy_cleanup(curl); + return tmps; } return strdup((char *)url); @@ -83,9 +85,10 @@ char *path_to_url(const char *path) { - char *r = malloc(strlen(path) + FILE_SCHEME_PREFIX_LEN + 1); + /* Assumption: Amiga path does not start with '/' */ + char *r = malloc(strlen(path) + SLEN("file:///") + 1); - strcpy(r, FILE_SCHEME_PREFIX); + strcpy(r, "file:///"); strcat(r, path); return r; Conflicted files Removed files