@@ -15,7 +15,7 @@
|
|||||||
packages = rec {
|
packages = rec {
|
||||||
slenpaste = pkgs.buildGoModule {
|
slenpaste = pkgs.buildGoModule {
|
||||||
pname = "slenpaste";
|
pname = "slenpaste";
|
||||||
version = "0.1.1";
|
version = "0.1.2";
|
||||||
src = ./.;
|
src = ./.;
|
||||||
goPackagePath = "github.com/slendidev/slenpaste";
|
goPackagePath = "github.com/slendidev/slenpaste";
|
||||||
vendorHash = null;
|
vendorHash = null;
|
||||||
|
|||||||
20
main.go
20
main.go
@@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
|
"mime"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@@ -75,7 +76,6 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
var reader io.Reader
|
var reader io.Reader
|
||||||
var ext string
|
var ext string
|
||||||
|
|
||||||
// handle multipart file upload
|
|
||||||
contentType := r.Header.Get("Content-Type")
|
contentType := r.Header.Get("Content-Type")
|
||||||
if strings.HasPrefix(contentType, "multipart/form-data") {
|
if strings.HasPrefix(contentType, "multipart/form-data") {
|
||||||
if err := r.ParseMultipartForm(10 << 20); err == nil {
|
if err := r.ParseMultipartForm(10 << 20); err == nil {
|
||||||
@@ -87,29 +87,24 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// fallback to body upload
|
|
||||||
if reader == nil {
|
if reader == nil {
|
||||||
reader = r.Body
|
reader = r.Body
|
||||||
defer r.Body.Close()
|
defer r.Body.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
// default extension
|
|
||||||
if ext == "" {
|
if ext == "" {
|
||||||
ext = ".txt"
|
ext = ".txt"
|
||||||
}
|
}
|
||||||
|
|
||||||
// generate ID and filename
|
|
||||||
id := randomID(6)
|
id := randomID(6)
|
||||||
filename := id + ext
|
filename := id + ext
|
||||||
|
|
||||||
// ensure storage dir
|
|
||||||
if err := os.MkdirAll(staticDir, 0755); err != nil {
|
if err := os.MkdirAll(staticDir, 0755); err != nil {
|
||||||
http.Error(w, "Server error", http.StatusInternalServerError)
|
http.Error(w, "Server error", http.StatusInternalServerError)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
path := filepath.Join(staticDir, filename)
|
path := filepath.Join(staticDir, filename)
|
||||||
|
|
||||||
// save file
|
|
||||||
out, err := os.Create(path)
|
out, err := os.Create(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
http.Error(w, "Save error", http.StatusInternalServerError)
|
http.Error(w, "Save error", http.StatusInternalServerError)
|
||||||
@@ -128,7 +123,6 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// write metadata if needed
|
|
||||||
expVal := r.URL.Query().Get("expiry")
|
expVal := r.URL.Query().Get("expiry")
|
||||||
var m meta
|
var m meta
|
||||||
switch expVal {
|
switch expVal {
|
||||||
@@ -146,7 +140,6 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
_ = os.WriteFile(path+".json", metaBytes, 0644)
|
_ = os.WriteFile(path+".json", metaBytes, 0644)
|
||||||
}
|
}
|
||||||
|
|
||||||
// respond with URL including extension
|
|
||||||
fmt.Fprintf(w, "http://%s/%s\n", domain, filename)
|
fmt.Fprintf(w, "http://%s/%s\n", domain, filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,7 +152,6 @@ func viewHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
path := filepath.Join(staticDir, id)
|
path := filepath.Join(staticDir, id)
|
||||||
metaPath := path + ".json"
|
metaPath := path + ".json"
|
||||||
|
|
||||||
// load and enforce metadata
|
|
||||||
if data, err := os.ReadFile(metaPath); err == nil {
|
if data, err := os.ReadFile(metaPath); err == nil {
|
||||||
var m meta
|
var m meta
|
||||||
if err := json.Unmarshal(data, &m); err == nil {
|
if err := json.Unmarshal(data, &m); err == nil {
|
||||||
@@ -182,7 +174,15 @@ func viewHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
w.Header().Set("Content-Type", "text/plain")
|
|
||||||
|
// set correct content type based on extension
|
||||||
|
ext := filepath.Ext(id)
|
||||||
|
mimeType := mime.TypeByExtension(ext)
|
||||||
|
if mimeType == "" {
|
||||||
|
mimeType = "application/octet-stream"
|
||||||
|
}
|
||||||
|
w.Header().Set("Content-Type", mimeType)
|
||||||
|
|
||||||
io.Copy(w, f)
|
io.Copy(w, f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user