Index: trunk/example/partage.conf
===================================================================
--- trunk/example/partage.conf	(revision 50)
+++ trunk/example/partage.conf	(revision 50)
@@ -0,0 +1,36 @@
+# TCP or unix Socket to listen on.
+# When unix sockets are used, the content will be served over FastCGI.
+#listen = /var/run/partage-fcgi.sock
+listen = 127.0.0.1:9000
+
+# Base to use when constructing URI to files uploaded.
+# The full URI must be specified, in the form SCHEME://HOST[:PORT]
+baseuri = http://127.0.0.1:9000
+
+# Drop privilege to the user and group specified.
+# When only the user is specified, the default group of the user will
+# be used.
+#user = www
+#group = daemon
+
+# Change the root directory to the following directory.
+# When a chroot is set, all path must be given according to the chroot.
+# Note: the configuration file is read before chrooting.
+#chroot = /var/www
+
+# Path to the different path used by the server. Must take into account
+# the chroot if set.
+rootdir = example/static
+tmplpath = example/templates
+filepath = example/files
+metapath = example/meta
+
+# URI context that files will be served on
+filectx = /f/
+
+# Maximum per-file upload size (in bytes)
+maxsize = 536870912 # 512Mib
+
+# Default expiration time (in seconds). An expiration time of 0 seconds
+# means no expiration.
+expiry = 86400 # 24 hours
Index: trunk/example/static/dz.js
===================================================================
--- trunk/example/static/dz.js	(revision 50)
+++ trunk/example/static/dz.js	(revision 50)
@@ -0,0 +1,88 @@
+// Handle drag and drop into a dropzone_element div:
+// send the files as a POST request to the server
+"use strict";
+
+// Only start once the DOM tree is ready
+if(document.readyState === "complete") {
+    setupzone();
+} else {
+    document.addEventListener("DOMContentLoaded", setupzone);
+}
+
+function setupzone() {
+    let dropzone = document.getElementById("dropzone");
+    let fileinput = document.getElementById("filebox");
+    let fallbackform = document.getElementById("fallbackform");
+
+    fallbackform.style.display = "none";
+
+    dropzone.className = "dropzone";
+    dropzone.innerHTML = "Click or drop file(s)";
+
+    dropzone.onclick = function() {
+        fileinput.click()
+	return false;
+    }
+
+    dropzone.ondragover = function() {
+        this.className = "dropzone dragover";
+        return false;
+    }
+    
+    dropzone.ondragleave = function() {
+        this.className = "dropzone";
+        return false;
+    }
+
+    dropzone.ondrop = function(e) {
+        // Stop browser from simply opening that was just dropped
+        e.preventDefault();  
+        // Restore original dropzone appearance
+        this.className = "dropzone";
+        sendfiles(e.dataTransfer.files)
+    }
+
+    fileinput.onchange = function(e) {
+        sendfiles(this.files)
+    }
+}
+
+function sendfiles(files) {
+    let uploads = document.getElementById("uploads");
+    let progressbar = document.createElement("progress");
+    let uploadlist = document.createElement("ul");
+    let formData = new FormData(), xhr = new XMLHttpRequest();
+
+    uploads.appendChild(progressbar);
+    uploads.appendChild(uploadlist);
+
+    formData.append("expiry", 10);
+    for(let i=0; i < files.length; i++) {
+        formData.append("file", files[i]);
+    }
+
+    // triggers periodically
+    xhr.upload.onprogress = function(e) {
+        // e.loaded - how many bytes downloaded
+        // e.lengthComputable = true if the server sent Content-Length header
+        // e.total - total number of bytes (if lengthComputable)
+	if (e.lengthComputable) {
+		progressbar.max = e.total
+	}
+	progressbar.value = e.loaded
+    }
+
+    xhr.onreadystatechange = function() {
+        if(xhr.readyState === XMLHttpRequest.DONE) {
+		progressbar.remove();
+		this.response.split(/\r?\n/).forEach(function(link) {
+			let li = document.createElement("li");
+			li.innerHTML = `<a href="${link}">${link}</a>`;
+			uploadlist.appendChild(li);
+		});
+        }
+    }
+
+    xhr.open('POST', window.location.href, true); // async = true
+    xhr.send(formData); 
+}
Index: trunk/example/static/partage.css
===================================================================
--- trunk/example/static/partage.css	(revision 50)
+++ trunk/example/static/partage.css	(revision 50)
@@ -0,0 +1,94 @@
+body {
+	padding: 5%;
+	margin: auto;
+	max-width: 540px;
+	font-family: serif;
+	font-size: 1.5rem;
+	text-align: center;
+	background-color: #eeeeee;
+	color: #222222;
+}
+
+header {
+	display: flex;
+	flex-direction: column;
+	flex-wrap: wrap-reverse;
+	align-items: center;
+	align-content: center;
+}
+
+section {
+	display: flex;
+	justify-content: flex-end;
+	font-size: initial;
+}
+
+section#formsettings > * {
+	margin-top: 20px;
+	margin-left: 20px;
+}
+
+img#logo {
+	height: 100%;
+	max-height: 30vh;
+}
+
+h1 {
+	font-size: 4.0rem;
+}
+
+ul {
+	list-style: none;
+	text-align: left;
+	display: inline-block;
+}
+
+.dropzone {
+	padding-top: 60px;
+	padding-bottom: 60px;
+	border: 2px dashed #888888;
+	border-radius: 8px;
+	text-align: center;
+	margin: auto;
+	color: #888888;
+}
+
+.dropzone.dragover {
+	color: #222222;
+	border-color: #222222;
+}
+
+/* font attributes are not inherited by default */
+input, input::file-selector-button {
+	text-align: inherit;
+	font-family: inherit;
+	font-size: inherit;
+}
+
+@media (min-aspect-ratio: 18/9) {
+	header {
+		flex-direction: row;
+	}
+	h1 { font-size: 3rem; margin-right: 10px; }
+	img#logo {
+		height: 50%;
+		max-height: 20vh;
+		order: 2;
+	}
+}
+
+@media (prefers-color-scheme: light) {
+	a { color: black; }
+	body {
+		color: #222222;
+		background-color: #eeeeee;
+	}
+}
+
+@media (prefers-color-scheme: dark) {
+	a { color: white; }
+	body {
+		color: #eeeeee;
+		background-color: #222222;
+	}
+}
Index: trunk/example/static/robots.txt
===================================================================
--- trunk/example/static/robots.txt	(revision 50)
+++ trunk/example/static/robots.txt	(revision 50)
@@ -0,0 +1,2 @@
+User-Agent: *
+Disallow: /
Index: trunk/example/templates/index.html
===================================================================
--- trunk/example/templates/index.html	(revision 50)
+++ trunk/example/templates/index.html	(revision 50)
@@ -0,0 +1,39 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+	<meta charset="utf-8">
+	<meta name="author" content="z3bra">
+	<meta name="robots" content="noindex,nofollow" />
+	<meta name="viewport" content="width=device-width">
+	<link rel="stylesheet" type="text/css" href="/partage.css" />
+	<link rel="icon" type="image/ico" href="/favicon.ico" />
+	<title>Partage</title>
+</head>
+<body>
+	<header>
+		<img id="logo" src="/partage.png" />
+		<h1>partage</h1>
+	</header>
+	<form enctype="multipart/form-data" method="post">
+		<div id="dropzone"></div>
+		<div id="fallbackform" class="dropzone">
+			<input id="filebox" name="file" type="file" multiple/>
+			<input id="output" name="output" type="hidden" value='html' />
+			<input type="submit" value="Upload"/>
+		</div>
+		<section id="formsettings">
+			<label for="expiry"> Destroy after </label>
+			<select id="expiry" name="expiry">
+		                <option value="900"> 15 minutes </option>
+		                <option value="3600"> 1 hour </option>
+		                <option value="28800"> 8 hours </option>
+		                <option value="86400" selected> 1 day </option>
+		                <option value="604800"> 1 week </option>
+			</select>
+		</section>
+	</form>
+	<p>File size limited to {{.Maxsize}}.</p>
+	<div id="uploads"></div>
+	<script src="/dz.js"></script>
+</body>
+</html>
Index: trunk/example/templates/upload.html
===================================================================
--- trunk/example/templates/upload.html	(revision 50)
+++ trunk/example/templates/upload.html	(revision 50)
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+	<meta charset="utf-8">
+	<meta name="author" content="z3bra">
+	<meta name="viewport" content="width=device-width">
+	<link rel="stylesheet" type="text/css" href="/partage.css" />
+	<link rel="icon" type="image/ico" href="/favicon.ico" />
+	<title>Partage</title>
+</head>
+<body>
+	<header>
+		<img id="logo" src="/partage.png" />
+		<h1>partage</h1>
+	</header>
+	<ul>
+	{{range .Links}}
+	  <li><a href="{{.}}">{{.}}</a></li>
+	{{end}}
+	</ul>
+</body>
+</html>
Index: trunk/static/dz.js
===================================================================
--- trunk/static/dz.js	(revision 49)
+++ 	(revision )
@@ -1,85 +1,0 @@
-// Handle drag and drop into a dropzone_element div:
-// send the files as a POST request to the server
-"use strict";
-
-// Only start once the DOM tree is ready
-if(document.readyState === "complete") {
-    setupzone();
-} else {
-    document.addEventListener("DOMContentLoaded", setupzone);
-}
-
-function setupzone() {
-    let dropzone = document.getElementById("dropzone");
-    let fileinput = document.getElementById("filebox");
-    let fallbackform = document.getElementById("fallbackform");
-
-    fallbackform.style.display = "none";
-
-    dropzone.className = "dropzone";
-    dropzone.innerHTML = "Click or drop file(s)";
-
-    dropzone.onclick = function() {
-        fileinput.click()
-	return false;
-    }
-
-    dropzone.ondragover = function() {
-        this.className = "dropzone dragover";
-        return false;
-    }
-    
-    dropzone.ondragleave = function() {
-        this.className = "dropzone";
-        return false;
-    }
-
-    dropzone.ondrop = function(e) {
-        // Stop browser from simply opening that was just dropped
-        e.preventDefault();  
-        // Restore original dropzone appearance
-        this.className = "dropzone";
-        sendfiles(e.dataTransfer.files)
-    }
-
-    fileinput.onchange = function(e) {
-        sendfiles(this.files)
-    }
-}
-
-function sendfiles(files) {
-    let uploads = document.getElementById("uploads");
-    let progressbar = document.createElement("progress");
-    let uploadlist = document.createElement("ul");
-    let formData = new FormData(), xhr = new XMLHttpRequest();
-
-    uploads.appendChild(progressbar);
-    uploads.appendChild(uploadlist);
-
-    formData.append("expiry", 10);
-    for(let i=0; i < files.length; i++) {
-        formData.append("file", files[i]);
-    }
-
-    // triggers periodically
-    xhr.upload.onprogress = function(e) {
-        // e.loaded - how many bytes downloaded
-        // e.lengthComputable = true if the server sent Content-Length header
-        // e.total - total number of bytes (if lengthComputable)
-
-    }
-
-    xhr.onreadystatechange = function() {
-        if(xhr.readyState === XMLHttpRequest.DONE) {
-		progressbar.remove();
-		this.response.split(/\r?\n/).forEach(function(link) {
-			let li = document.createElement("li");
-			li.innerHTML = `<a href="${link}">${link}</a>`;
-			uploadlist.appendChild(li);
-		});
-        }
-    }
-
-    xhr.open('POST', window.location.href, true); // async = true
-    xhr.send(formData); 
-}
Index: trunk/static/partage.css
===================================================================
--- trunk/static/partage.css	(revision 49)
+++ 	(revision )
@@ -1,94 +1,0 @@
-body {
-	padding: 5%;
-	margin: auto;
-	max-width: 540px;
-	font-family: serif;
-	font-size: 1.5rem;
-	text-align: center;
-	background-color: #eeeeee;
-	color: #222222;
-}
-
-header {
-	display: flex;
-	flex-direction: column;
-	flex-wrap: wrap-reverse;
-	align-items: center;
-	align-content: center;
-}
-
-section {
-	display: flex;
-	justify-content: flex-end;
-	font-size: initial;
-}
-
-section#formsettings > * {
-	margin-top: 20px;
-	margin-left: 20px;
-}
-
-img#logo {
-	height: 100%;
-	max-height: 30vh;
-}
-
-h1 {
-	font-size: 4.0rem;
-}
-
-ul {
-	list-style: none;
-	text-align: left;
-	display: inline-block;
-}
-
-.dropzone {
-	padding-top: 60px;
-	padding-bottom: 60px;
-	border: 2px dashed #888888;
-	border-radius: 8px;
-	text-align: center;
-	margin: auto;
-	color: #888888;
-}
-
-.dropzone.dragover {
-	color: #222222;
-	border-color: #222222;
-}
-
-/* font attributes are not inherited by default */
-input, input::file-selector-button {
-	text-align: inherit;
-	font-family: inherit;
-	font-size: inherit;
-}
-
-@media (min-aspect-ratio: 18/9) {
-	header {
-		flex-direction: row;
-	}
-	h1 { font-size: 3rem; margin-right: 10px; }
-	img#logo {
-		height: 50%;
-		max-height: 20vh;
-		order: 2;
-	}
-}
-
-@media (prefers-color-scheme: light) {
-	a { color: black; }
-	body {
-		color: #222222;
-		background-color: #eeeeee;
-	}
-}
-
-@media (prefers-color-scheme: dark) {
-	a { color: white; }
-	body {
-		color: #eeeeee;
-		background-color: #222222;
-	}
-}
Index: trunk/static/robots.txt
===================================================================
--- trunk/static/robots.txt	(revision 49)
+++ 	(revision )
@@ -1,2 +1,0 @@
-User-Agent: *
-Disallow: /
Index: trunk/templates/index.html
===================================================================
--- trunk/templates/index.html	(revision 49)
+++ 	(revision )
@@ -1,39 +1,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-	<meta charset="utf-8">
-	<meta name="author" content="z3bra">
-	<meta name="robots" content="noindex,nofollow" />
-	<meta name="viewport" content="width=device-width">
-	<link rel="stylesheet" type="text/css" href="/partage.css" />
-	<link rel="icon" type="image/png" href="/favicon.ico" />
-	<title>Partage</title>
-</head>
-<body>
-	<header>
-		<img id="logo" src="/partage.png" />
-		<h1>partage</h1>
-	</header>
-	<form enctype="multipart/form-data" method="post">
-		<div id="dropzone"></div>
-		<div id="fallbackform" class="dropzone">
-			<input id="filebox" name="file" type="file" multiple/>
-			<input id="output" name="output" type="hidden" value='html' />
-			<input type="submit" value="Upload"/>
-		</div>
-		<section id="formsettings">
-			<label for="expiry"> Destroy after </label>
-			<select id="expiry" name="expiry">
-		                <option value="900"> 15 minutes </option>
-		                <option value="3600"> 1 hour </option>
-		                <option value="28800"> 8 hours </option>
-		                <option value="86400" selected> 1 day </option>
-		                <option value="604800"> 1 week </option>
-			</select>
-		</section>
-	</form>
-	<p>File size limited to {{.Maxsize}}.</p>
-	<div id="uploads"></div>
-	<script src="/dz.js"></script>
-</body>
-</html>
Index: trunk/templates/upload.html
===================================================================
--- trunk/templates/upload.html	(revision 49)
+++ 	(revision )
@@ -1,22 +1,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-	<meta charset="utf-8">
-	<meta name="author" content="z3bra">
-	<meta name="viewport" content="width=device-width">
-	<link rel="stylesheet" type="text/css" href="/partage.css" />
-	<link rel="icon" type="image/png" href="/favicon.ico" />
-	<title>Partage</title>
-</head>
-<body>
-	<header>
-		<h1>partage</h1>
-		<img id="logo" src="/partage.png" />
-	</header>
-	<ul>
-	{{range .Links}}
-	  <li><a href="{{.}}">{{.}}</a></li>
-	{{end}}
-	</ul>
-</body>
-</html>
