summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-05-07 16:13:05 +0300
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-05-07 16:13:05 +0300
commit04cec8bb69f5afc2883235aa8fd0a329671279be (patch)
tree460592f238722c609f9bdafe14fbd7fe6d890149 /src
parent3042883598c9db1436a63788f40604ce41a0b801 (diff)
Windows: Fixed use of native path separators
`GmRequest` should use the correct path separators on Windows in native paths.
Diffstat (limited to 'src')
-rw-r--r--src/gmrequest.c15
-rw-r--r--src/gmutil.c1
2 files changed, 11 insertions, 5 deletions
diff --git a/src/gmrequest.c b/src/gmrequest.c
index 1a7c37df..3dd92eec 100644
--- a/src/gmrequest.c
+++ b/src/gmrequest.c
@@ -597,16 +597,18 @@ void submit_GmRequest(iGmRequest *d) {
597 else if (equalCase_Rangecc(url.scheme, "file")) { 597 else if (equalCase_Rangecc(url.scheme, "file")) {
598 /* TODO: Move handling of "file://" URLs elsewhere, it's getting complex. */ 598 /* TODO: Move handling of "file://" URLs elsewhere, it's getting complex. */
599 iString *path = collect_String(localFilePathFromUrl_String(&d->url)); 599 iString *path = collect_String(localFilePathFromUrl_String(&d->url));
600 /* Note: As a local file path, `path` uses the OS directory separators
601 (i.e., \ on Windows). `Archive` accepts both. */
600 iFile *f = new_File(path); 602 iFile *f = new_File(path);
601 if (isDirectory_(path)) { 603 if (isDirectory_(path)) {
602 if (endsWith_String(path, "/")) { 604 if (endsWith_String(path, iPathSeparator)) {
603 removeEnd_String(path, 1); 605 removeEnd_String(path, 1);
604 } 606 }
605 resp->statusCode = success_GmStatusCode; 607 resp->statusCode = success_GmStatusCode;
606 setCStr_String(&resp->meta, "text/gemini"); 608 setCStr_String(&resp->meta, "text/gemini");
607 iString *page = collectNew_String(); 609 iString *page = collectNew_String();
608 iString *parentDir = collectNewRange_String(dirName_Path(path)); 610 iString *parentDir = collectNewRange_String(dirName_Path(path));
609 appendFormat_String(page, "=> %s " upArrow_Icon " %s/\n\n", 611 appendFormat_String(page, "=> %s " upArrow_Icon " %s" iPathSeparator "\n\n",
610 cstrCollect_String(makeFileUrl_String(parentDir)), 612 cstrCollect_String(makeFileUrl_String(parentDir)),
611 cstr_String(parentDir)); 613 cstr_String(parentDir));
612 appendFormat_String(page, "# %s\n", cstr_Rangecc(baseName_Path(path))); 614 appendFormat_String(page, "# %s\n", cstr_Rangecc(baseName_Path(path)));
@@ -630,7 +632,7 @@ void submit_GmRequest(iGmRequest *d) {
630 appendFormat_String(page, "=> %s %s%s\n", 632 appendFormat_String(page, "=> %s %s%s\n",
631 cstrCollect_String(makeFileUrl_String(path_FileInfo(entry))), 633 cstrCollect_String(makeFileUrl_String(path_FileInfo(entry))),
632 cstr_Rangecc(baseName_Path(path_FileInfo(entry))), 634 cstr_Rangecc(baseName_Path(path_FileInfo(entry))),
633 isDirectory_FileInfo(entry) ? "/" : ""); 635 isDirectory_FileInfo(entry) ? iPathSeparator : "");
634 iRelease(entry); 636 iRelease(entry);
635 } 637 }
636 set_Block(&resp->body, utf8_String(page)); 638 set_Block(&resp->body, utf8_String(page));
@@ -652,7 +654,8 @@ void submit_GmRequest(iGmRequest *d) {
652 iString *entryPath = collect_String(copy_String(path)); 654 iString *entryPath = collect_String(copy_String(path));
653 remove_Block(&entryPath->chars, 0, size_String(container) + 1); /* last slash, too */ 655 remove_Block(&entryPath->chars, 0, size_String(container) + 1); /* last slash, too */
654 iBool isDir = isDirectory_Archive(arch, entryPath); 656 iBool isDir = isDirectory_Archive(arch, entryPath);
655 if (isDir && !isEmpty_String(entryPath) && !endsWith_String(entryPath, "/")) { 657 if (isDir && !isEmpty_String(entryPath) &&
658 !endsWith_String(entryPath, iPathSeparator)) {
656 /* Must have a slash for directories, otherwise relative navigation 659 /* Must have a slash for directories, otherwise relative navigation
657 will not work. */ 660 will not work. */
658 resp->statusCode = redirectPermanent_GmStatusCode; 661 resp->statusCode = redirectPermanent_GmStatusCode;
@@ -683,7 +686,9 @@ void submit_GmRequest(iGmRequest *d) {
683 const iRangecc parentDir = dirName_Path(collectNewRange_String(curDir)); 686 const iRangecc parentDir = dirName_Path(collectNewRange_String(curDir));
684 if (!equal_Rangecc(parentDir, ".")) { 687 if (!equal_Rangecc(parentDir, ".")) {
685 /* A subdirectory. */ 688 /* A subdirectory. */
686 appendFormat_String(page, "=> ../ " upArrow_Icon " %s/\n", 689 appendFormat_String(page,
690 "=> ../ " upArrow_Icon " %s" iPathSeparator
691 "\n",
687 cstr_Rangecc(parentDir)); 692 cstr_Rangecc(parentDir));
688 } 693 }
689 else { 694 else {
diff --git a/src/gmutil.c b/src/gmutil.c
index 2a4f4728..718a0a9a 100644
--- a/src/gmutil.c
+++ b/src/gmutil.c
@@ -439,6 +439,7 @@ iString *localFilePathFromUrl_String(const iString *d) {
439 if (startsWith_String(path, "/")) { 439 if (startsWith_String(path, "/")) {
440 remove_Block(&path->chars, 0, 1); 440 remove_Block(&path->chars, 0, 1);
441 } 441 }
442 replace_Block(&path->chars, '/', '\\');
442#endif 443#endif
443 return path; 444 return path;
444} 445}