diff --git a/src/pages/files/Upload.tsx b/src/pages/files/Upload.tsx
index a2e9ef3..3bb163c 100644
--- a/src/pages/files/Upload.tsx
+++ b/src/pages/files/Upload.tsx
@@ -77,7 +77,7 @@ export function Upload(): ReactElement {
let fls: FilePath[] = files.map(f => packageFile(f)) // Apart from packaging, this is needed to not modify the original files array as it can trigger effects
let indexDocument: string | undefined = undefined // This means we assume it's folder
- if (files.length === 1) indexDocument = files[0].name
+ if (files.length === 1) indexDocument = unescape(encodeURIComponent(files[0].name))
else if (files.length > 1) {
const idx = detectIndexHtml(files)
diff --git a/src/utils/file.ts b/src/utils/file.ts
index 7e8a742..9f6ea2f 100644
--- a/src/utils/file.ts
+++ b/src/utils/file.ts
@@ -18,15 +18,26 @@ export function detectIndexHtml(files: FilePath[]): DetectedIndex | false {
return { indexPath: exactMatch }
}
- const prefix = paths[0].split('/')[0] + '/'
+ const sortedPaths = paths.sort((a, b) => a.localeCompare(b))
+ const firstSegments = sortedPaths[0].split('/')
+ const lastSegments = sortedPaths[sortedPaths.length - 1].split('/')
+ let matchingSegments = 0
- const allStartWithSamePrefix = paths.every(x => x.startsWith(prefix))
+ for (; matchingSegments < firstSegments.length; matchingSegments++) {
+ if (firstSegments[matchingSegments] !== lastSegments[matchingSegments]) {
+ break
+ }
+ }
+
+ const commonPrefix = firstSegments.slice(0, matchingSegments).join('/') + '/'
+
+ const allStartWithSamePrefix = paths.every(x => x.startsWith(commonPrefix))
if (allStartWithSamePrefix) {
- const match = paths.find(x => indexHtmls.map(y => prefix + y).includes(x))
+ const match = paths.find(x => indexHtmls.map(y => commonPrefix + y).includes(x))
if (match) {
- return { indexPath: match, commonPrefix: prefix }
+ return { indexPath: match, commonPrefix }
}
}
diff --git "a/test-data/test-unicode-websiteβπππ\\ππ/index.html" "b/test-data/test-unicode-websiteβπππ\\ππ/index.html"
new file mode 100644
index 0000000..0b6b5bc
--- /dev/null
+++ "b/test-data/test-unicode-websiteβπππ\\ππ/index.html"
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+ Document
+
+
+
diff --git "a/test-data/test-unicode-websiteβπππ\\ππ/βπππ\\ππ.txt" "b/test-data/test-unicode-websiteβπππ\\ππ/βπππ\\ππ.txt"
new file mode 100644
index 0000000..31b0ef9
--- /dev/null
+++ "b/test-data/test-unicode-websiteβπππ\\ππ/βπππ\\ππ.txt"
@@ -0,0 +1,40 @@
+π
ππΎ\ι½ι½ππ
ππ\πβπ\πππζ±ι½ζ±π\ππΎππππβζ±ζ±δΊ¬ππππππ
π
+ι½ππ
\πΎππζ±π\ι½ζ±ππζ±ι½\πΎπΎζ±ζ±ι½πΎπΎ\π\ππππζ±ι½ι½\ι½πΎπππ
+πΎ\π
ζ±ζ±δΊ¬ζ±ι½π
βπδΊ¬δΊ¬ππβπΎπππι½πΎζ±πδΊ¬πΎδΊ¬πΎπι½\πβζ±ζ±βδΊ¬πΎδΊ¬ζ±
+βπ
ι½βππβ\\πι½ππππππ
βι½\πππππ\ππππΎδΊ¬πι½ι½π
βππι½π
+πι½\πι½πΎπππδΊ¬πΎδΊ¬βπππ
δΊ¬π\πβδΊ¬π
ππβι½\δΊ¬ι½ζ±ζ±ππππ
\πΎδΊ¬π
+ζ±π
\ι½πβπΎππι½π
ζ±βππππππ
δΊ¬ζ±πππ
ι½πζ±πΎζ±ππππΎπππΎβζ±βζ±
+πδΊ¬ι½ζ±π
ι½ππι½\ζ±π
π
πΎπππΎππΎπΎπΎδΊ¬\βπβπ
\ππδΊ¬πππ
δΊ¬ζ±ππβπ
+ι½ζ±ζ±πι½πΎπππππΎζ±ι½πδΊ¬βπι½ζ±ππβππι½\\ζ±δΊ¬π
πβππζ±ππζ±δΊ¬πΎ
+βπβππΎι½πΎπβπζ±δΊ¬π\ι½π\\πΎι½π
πβπδΊ¬πι½πΎπΎππι½π
πζ±δΊ¬πΎι½ζ±ζ±
+πΎβζ±πζ±πζ±πππζ±δΊ¬β\δΊ¬πζ±ββπδΊ¬δΊ¬π
πππζ±π
ππζ±π
ζ±πππΎζ±\\π
+ι½π
πβπ
ππππΎπππΎπ\ζ±πππππι½πι½δΊ¬ππ
βι½πΎπΎππππ
\\π
ππ
πΎ
+β\δΊ¬ζ±πζ±δΊ¬ππ\δΊ¬ζ±πΎπ
ππζ±πι½πβζ±ι½ππβπππΎ\πβπ
π\πδΊ¬ππ
π
+\πππι½πδΊ¬\πππ
ι½βπππππππ
π
ππΎ\ζ±βπ
ππδΊ¬πζ±ζ±\πππι½ππΎ
+ζ±π\πΎππΎπι½π\ππΎππΎπΎζ±πδΊ¬πΎζ±ι½πππβββδΊ¬ι½δΊ¬ζ±δΊ¬ππΎπδΊ¬πππ
π
+π\ππΎζ±πΎπβδΊ¬ζ±δΊ¬πΎδΊ¬πζ±δΊ¬π
ι½δΊ¬πΎπ
πδΊ¬βζ±πζ±π
ι½ππδΊ¬ι½πβ\πι½π
π
+ππΎβι½ζ±πΎ\βπ
π\βπΎπ
ππΎβππΎζ±ι½π
βπββδΊ¬πβπππ
πΎππι½ππ
\π
+πβζ±\ππππι½πΎπδΊ¬ι½ππ\π
β\ππΎπζ±βπΎπ
ππβζ±πππι½ι½ζ±π
\π\
+π
ι½δΊ¬δΊ¬πΎβπΎπ
ππΎπι½ζ±ππ
ζ±π
πΎπππζ±ππππΎβδΊ¬πζ±ππ
δΊ¬π\π
ππβ\
+δΊ¬πβ\\ππδΊ¬βππΎπππΎππππδΊ¬ππππππ
πππι½ππππβπι½πδΊ¬ι½π
+π\πβπζ±δΊ¬ι½π\\βδΊ¬πππππΎζ±π
π
βπβδΊ¬πζ±\ι½ππ
πβππι½βπ
ζ±πΎ
+\ππ
πζ±\πΎδΊ¬βζ±πΎπππππππβ\\ι½ζ±ππζ±ππι½ι½ππππζ±ι½π
βι½π
+\ππ
ππ
π
ππΎβι½\ππΎπ
δΊ¬π
πππι½π\ππ
δΊ¬ι½π\βππππ
π
ππ
ι½π\ζ±
+ππππ\πι½πι½\πδΊ¬πππππππΎπ
πΎι½πΎ\πππ\\ζ±πΎι½ππππΎδΊ¬πδΊ¬π
+πζ±ι½π
πββ\πΎππζ±\βπππππΎβι½π
πβπππ
πζ±πΎπππι½πζ±ππδΊ¬π
+δΊ¬πππΎπ
πΎπππι½\\πππι½πΎι½πΎζ±πππβππΎββπππ
δΊ¬βπΎι½ππππ\
+πι½πΎπζ±δΊ¬ππππδΊ¬π
ι½πΎπΎπΎπππβππ\ππβππ
ι½πππβπππζ±π
\\
+\ζ±ππππππππΎβζ±πβ\π\\\ζ±\πππ
πι½βππΎβπβπ\πι½δΊ¬πζ±π
+πδΊ¬\ββπππ
βζ±πππππππζ±ππδΊ¬πππβι½ι½πππ
\π
πζ±πΎδΊ¬δΊ¬πζ±\
+πΎζ±ππζ±βζ±ι½πι½π\ζ±πδΊ¬πΎι½π
\ππβι½πΎι½π\ζ±πππβπ
ι½πππζ±\β
+δΊ¬πδΊ¬δΊ¬δΊ¬ζ±βπ\πππδΊ¬ππι½ι½πΎ\δΊ¬ππ
δΊ¬δΊ¬δΊ¬πΎπ
πΎπΎδΊ¬ββπΎδΊ¬πππ
πππΎ
+π\ζ±π\ππππππ\πππΎδΊ¬ππππ
ππ
ι½π
δΊ¬πζ±πΎπππππδΊ¬δΊ¬πβπΎι½πΎ
+πδΊ¬πι½δΊ¬πΎβππζ±π\ππδΊ¬πΎ\ι½πι½ππ
ζ±ππδΊ¬δΊ¬πι½π
ππβββππΎπ
π
π
+πππππππΎι½ι½δΊ¬βπππβ\δΊ¬ι½πππ\ζ±ζ±\ππΎβπππ
δΊ¬ζ±ππππππ
π
+πΎππβπΎπ
π
π\πβπ
\πππ
πζ±ππΎπΎππΎπ\δΊ¬ζ±\\δΊ¬ππ
π
ππδΊ¬ππ\ι½
+ζ±ππ\π
βπζ±π\πππππβζ±δΊ¬\\π
\ππΎπΎδΊ¬δΊ¬\πΎ\ζ±ππππΎβπππζ±
+π
ζ±π\πΎππππββι½\ι½β\ππππΎπδΊ¬δΊ¬πι½πππΎπδΊ¬ππ
βι½π\πι½πΎδΊ¬
+πππππππ
πΎι½πΎ\πΎππππβπΎββπ\ππι½δΊ¬ζ±πδΊ¬πβπδΊ¬\πΎππππδΊ¬
+βπ
ι½ζ±δΊ¬βζ±π
βπ\δΊ¬ππππππππΎπππππΎππππι½πΎπζ±πζ±πι½πδΊ¬π
+πζ±πζ±βππβδΊ¬ι½πππππζ±π
δΊ¬ι½ι½πΎπΎπ\ι½π
\π\πβππβπδΊ¬δΊ¬πδΊ¬ι½
+ζ±πζ±ππππππ
πΎππζ±πππ
πππππδΊ¬πππζ±ι½πι½π
πβπππζ±δΊ¬π\π
\ No newline at end of file
diff --git "a/test-data/βπππ\\ππ.txt" "b/test-data/βπππ\\ππ.txt"
new file mode 100644
index 0000000..31b0ef9
--- /dev/null
+++ "b/test-data/βπππ\\ππ.txt"
@@ -0,0 +1,40 @@
+π
ππΎ\ι½ι½ππ
ππ\πβπ\πππζ±ι½ζ±π\ππΎππππβζ±ζ±δΊ¬ππππππ
π
+ι½ππ
\πΎππζ±π\ι½ζ±ππζ±ι½\πΎπΎζ±ζ±ι½πΎπΎ\π\ππππζ±ι½ι½\ι½πΎπππ
+πΎ\π
ζ±ζ±δΊ¬ζ±ι½π
βπδΊ¬δΊ¬ππβπΎπππι½πΎζ±πδΊ¬πΎδΊ¬πΎπι½\πβζ±ζ±βδΊ¬πΎδΊ¬ζ±
+βπ
ι½βππβ\\πι½ππππππ
βι½\πππππ\ππππΎδΊ¬πι½ι½π
βππι½π
+πι½\πι½πΎπππδΊ¬πΎδΊ¬βπππ
δΊ¬π\πβδΊ¬π
ππβι½\δΊ¬ι½ζ±ζ±ππππ
\πΎδΊ¬π
+ζ±π
\ι½πβπΎππι½π
ζ±βππππππ
δΊ¬ζ±πππ
ι½πζ±πΎζ±ππππΎπππΎβζ±βζ±
+πδΊ¬ι½ζ±π
ι½ππι½\ζ±π
π
πΎπππΎππΎπΎπΎδΊ¬\βπβπ
\ππδΊ¬πππ
δΊ¬ζ±ππβπ
+ι½ζ±ζ±πι½πΎπππππΎζ±ι½πδΊ¬βπι½ζ±ππβππι½\\ζ±δΊ¬π
πβππζ±ππζ±δΊ¬πΎ
+βπβππΎι½πΎπβπζ±δΊ¬π\ι½π\\πΎι½π
πβπδΊ¬πι½πΎπΎππι½π
πζ±δΊ¬πΎι½ζ±ζ±
+πΎβζ±πζ±πζ±πππζ±δΊ¬β\δΊ¬πζ±ββπδΊ¬δΊ¬π
πππζ±π
ππζ±π
ζ±πππΎζ±\\π
+ι½π
πβπ
ππππΎπππΎπ\ζ±πππππι½πι½δΊ¬ππ
βι½πΎπΎππππ
\\π
ππ
πΎ
+β\δΊ¬ζ±πζ±δΊ¬ππ\δΊ¬ζ±πΎπ
ππζ±πι½πβζ±ι½ππβπππΎ\πβπ
π\πδΊ¬ππ
π
+\πππι½πδΊ¬\πππ
ι½βπππππππ
π
ππΎ\ζ±βπ
ππδΊ¬πζ±ζ±\πππι½ππΎ
+ζ±π\πΎππΎπι½π\ππΎππΎπΎζ±πδΊ¬πΎζ±ι½πππβββδΊ¬ι½δΊ¬ζ±δΊ¬ππΎπδΊ¬πππ
π
+π\ππΎζ±πΎπβδΊ¬ζ±δΊ¬πΎδΊ¬πζ±δΊ¬π
ι½δΊ¬πΎπ
πδΊ¬βζ±πζ±π
ι½ππδΊ¬ι½πβ\πι½π
π
+ππΎβι½ζ±πΎ\βπ
π\βπΎπ
ππΎβππΎζ±ι½π
βπββδΊ¬πβπππ
πΎππι½ππ
\π
+πβζ±\ππππι½πΎπδΊ¬ι½ππ\π
β\ππΎπζ±βπΎπ
ππβζ±πππι½ι½ζ±π
\π\
+π
ι½δΊ¬δΊ¬πΎβπΎπ
ππΎπι½ζ±ππ
ζ±π
πΎπππζ±ππππΎβδΊ¬πζ±ππ
δΊ¬π\π
ππβ\
+δΊ¬πβ\\ππδΊ¬βππΎπππΎππππδΊ¬ππππππ
πππι½ππππβπι½πδΊ¬ι½π
+π\πβπζ±δΊ¬ι½π\\βδΊ¬πππππΎζ±π
π
βπβδΊ¬πζ±\ι½ππ
πβππι½βπ
ζ±πΎ
+\ππ
πζ±\πΎδΊ¬βζ±πΎπππππππβ\\ι½ζ±ππζ±ππι½ι½ππππζ±ι½π
βι½π
+\ππ
ππ
π
ππΎβι½\ππΎπ
δΊ¬π
πππι½π\ππ
δΊ¬ι½π\βππππ
π
ππ
ι½π\ζ±
+ππππ\πι½πι½\πδΊ¬πππππππΎπ
πΎι½πΎ\πππ\\ζ±πΎι½ππππΎδΊ¬πδΊ¬π
+πζ±ι½π
πββ\πΎππζ±\βπππππΎβι½π
πβπππ
πζ±πΎπππι½πζ±ππδΊ¬π
+δΊ¬πππΎπ
πΎπππι½\\πππι½πΎι½πΎζ±πππβππΎββπππ
δΊ¬βπΎι½ππππ\
+πι½πΎπζ±δΊ¬ππππδΊ¬π
ι½πΎπΎπΎπππβππ\ππβππ
ι½πππβπππζ±π
\\
+\ζ±ππππππππΎβζ±πβ\π\\\ζ±\πππ
πι½βππΎβπβπ\πι½δΊ¬πζ±π
+πδΊ¬\ββπππ
βζ±πππππππζ±ππδΊ¬πππβι½ι½πππ
\π
πζ±πΎδΊ¬δΊ¬πζ±\
+πΎζ±ππζ±βζ±ι½πι½π\ζ±πδΊ¬πΎι½π
\ππβι½πΎι½π\ζ±πππβπ
ι½πππζ±\β
+δΊ¬πδΊ¬δΊ¬δΊ¬ζ±βπ\πππδΊ¬ππι½ι½πΎ\δΊ¬ππ
δΊ¬δΊ¬δΊ¬πΎπ
πΎπΎδΊ¬ββπΎδΊ¬πππ
πππΎ
+π\ζ±π\ππππππ\πππΎδΊ¬ππππ
ππ
ι½π
δΊ¬πζ±πΎπππππδΊ¬δΊ¬πβπΎι½πΎ
+πδΊ¬πι½δΊ¬πΎβππζ±π\ππδΊ¬πΎ\ι½πι½ππ
ζ±ππδΊ¬δΊ¬πι½π
ππβββππΎπ
π
π
+πππππππΎι½ι½δΊ¬βπππβ\δΊ¬ι½πππ\ζ±ζ±\ππΎβπππ
δΊ¬ζ±ππππππ
π
+πΎππβπΎπ
π
π\πβπ
\πππ
πζ±ππΎπΎππΎπ\δΊ¬ζ±\\δΊ¬ππ
π
ππδΊ¬ππ\ι½
+ζ±ππ\π
βπζ±π\πππππβζ±δΊ¬\\π
\ππΎπΎδΊ¬δΊ¬\πΎ\ζ±ππππΎβπππζ±
+π
ζ±π\πΎππππββι½\ι½β\ππππΎπδΊ¬δΊ¬πι½πππΎπδΊ¬ππ
βι½π\πι½πΎδΊ¬
+πππππππ
πΎι½πΎ\πΎππππβπΎββπ\ππι½δΊ¬ζ±πδΊ¬πβπδΊ¬\πΎππππδΊ¬
+βπ
ι½ζ±δΊ¬βζ±π
βπ\δΊ¬ππππππππΎπππππΎππππι½πΎπζ±πζ±πι½πδΊ¬π
+πζ±πζ±βππβδΊ¬ι½πππππζ±π
δΊ¬ι½ι½πΎπΎπ\ι½π
\π\πβππβπδΊ¬δΊ¬πδΊ¬ι½
+ζ±πζ±ππππππ
πΎππζ±πππ
πππππδΊ¬πππζ±ι½πι½π
πβπππζ±δΊ¬π\π
\ No newline at end of file
diff --git a/ui-test/helpers.js b/ui-test/helpers.js
index 1f1cd24..9f788b3 100644
--- a/ui-test/helpers.js
+++ b/ui-test/helpers.js
@@ -25,7 +25,7 @@ async function selectStampAndUpload(page) {
}
async function assertUploadedContentAtPath(swarmHash, path, contentType) {
- const response = await axios.get(`http://localhost:1633/bzz/${swarmHash}/${path}`)
+ const response = await axios.get(`http://localhost:1633/bzz/${swarmHash}/${encodeURI(path)}`)
if (response.status !== 200) {
throw new Error(`Expected 200 OK, got ${response.status}`)
diff --git a/ui-test/index.js b/ui-test/index.js
index 49d3d40..c1c6ca5 100644
--- a/ui-test/index.js
+++ b/ui-test/index.js
@@ -7,10 +7,20 @@ const { testImageFileUpload } = require('./test-case/ImageFileUpload')
const { testTextFileUpload } = require('./test-case/TextFileUpload')
const { testWebsiteUpload } = require('./test-case/WebsiteUpload')
const { testReactWebsiteUpload } = require('./test-case/ReactWebsiteUpload')
+const { testUnicodeFileUpload } = require('./test-case/UnicodeFileUpload')
+const { testUnicodeWebsiteUpload } = require('./test-case/UnicodeWebsiteUpload')
const VIEWPORT = { width: 1366, height: 768 }
-const testCases = [testTextFileUpload, testImageFileUpload, testFolderUpload, testWebsiteUpload, testReactWebsiteUpload]
+const testCases = [
+ testUnicodeFileUpload,
+ testUnicodeWebsiteUpload,
+ testTextFileUpload,
+ testImageFileUpload,
+ testFolderUpload,
+ testWebsiteUpload,
+ testReactWebsiteUpload,
+]
async function main() {
const server = prepareServer()
diff --git a/ui-test/test-case/UnicodeFileUpload.js b/ui-test/test-case/UnicodeFileUpload.js
new file mode 100644
index 0000000..805314c
--- /dev/null
+++ b/ui-test/test-case/UnicodeFileUpload.js
@@ -0,0 +1,33 @@
+const puppeteer = require('puppeteer')
+const { selectStampAndUpload } = require('../helpers')
+const { Assert, Click } = require('../library')
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function testUnicodeFileUpload(page) {
+ await Click.elementWithText(page, 'a', 'Files')
+ await Click.elementWithTextAndUpload(page, 'button', 'Add File', 'test-data/βπππ\\ππ.txt')
+ await assertUploadPreview(page)
+ await selectStampAndUpload(page)
+ await assertDownloadPreview(page)
+}
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function assertUploadPreview(page) {
+ await Assert.elementWithTextExists(page, 'p', 'Filename: βπππ\\ππ.txt')
+ await Assert.elementWithTextExists(page, 'p', 'Kind: text/plain')
+ await Assert.elementWithTextExists(page, 'p', 'Size: 5.51 kB')
+}
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function assertDownloadPreview(page) {
+ assertUploadPreview(page)
+ await Assert.elementWithTextExists(page, 'p', 'Swarm Hash: 30fbf1d2[β¦]ba400e86')
+}
+
+module.exports = { testUnicodeFileUpload }
diff --git a/ui-test/test-case/UnicodeWebsiteUpload.js b/ui-test/test-case/UnicodeWebsiteUpload.js
new file mode 100644
index 0000000..7130476
--- /dev/null
+++ b/ui-test/test-case/UnicodeWebsiteUpload.js
@@ -0,0 +1,16 @@
+const puppeteer = require('puppeteer')
+const { selectStampAndUpload, assertUploadedContentAtPath } = require('../helpers')
+const { Click } = require('../library')
+
+/**
+ * @param {puppeteer.Page} page Puppeteer Page object returned by `browser.newPage()`
+ */
+async function testUnicodeWebsiteUpload(page) {
+ await Click.elementWithText(page, 'a', 'Files')
+ await Click.elementWithTextAndUpload(page, 'button', 'Add Website', 'test-data/test-unicode-websiteβπππ\\ππ')
+ const swarmHash = await selectStampAndUpload(page)
+ await assertUploadedContentAtPath(swarmHash, 'index.html', 'text/html; charset=utf-8')
+ await assertUploadedContentAtPath(swarmHash, 'βπππ/ππ.txt', 'text/plain; charset=utf-8')
+}
+
+module.exports = { testUnicodeWebsiteUpload }