Support remote uploads
This commit is contained in:
parent
9cd20c81fc
commit
8f7b47f572
|
@ -22,6 +22,7 @@ Command-line options
|
||||||
- ```-siteurl "http://mylinx.example.org/"``` -- the site url (for generating links)
|
- ```-siteurl "http://mylinx.example.org/"``` -- the site url (for generating links)
|
||||||
- ```-filespath files/"``` -- Path to store uploads (default is files/)
|
- ```-filespath files/"``` -- Path to store uploads (default is files/)
|
||||||
- ```-metapath meta/``` -- Path to store information about uploads (default is meta/)
|
- ```-metapath meta/``` -- Path to store information about uploads (default is meta/)
|
||||||
|
- ```-remoteuploads``` -- (optionally) enable remote uploads (/upload?url=https://...)
|
||||||
- ```-fastcgi``` -- (optionally) serve through fastcgi
|
- ```-fastcgi``` -- (optionally) serve through fastcgi
|
||||||
- ```-nologs``` -- (optionally) disable request logs in stdout
|
- ```-nologs``` -- (optionally) disable request logs in stdout
|
||||||
|
|
||||||
|
|
24
server.go
24
server.go
|
@ -19,14 +19,15 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var Config struct {
|
var Config struct {
|
||||||
bind string
|
bind string
|
||||||
filesDir string
|
filesDir string
|
||||||
metaDir string
|
metaDir string
|
||||||
noLogs bool
|
noLogs bool
|
||||||
allowHotlink bool
|
allowHotlink bool
|
||||||
siteName string
|
siteName string
|
||||||
siteURL string
|
siteURL string
|
||||||
fastcgi bool
|
fastcgi bool
|
||||||
|
remoteUploads bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var Templates = make(map[string]*pongo2.Template)
|
var Templates = make(map[string]*pongo2.Template)
|
||||||
|
@ -86,6 +87,11 @@ func setup() {
|
||||||
goji.Get("/paste/", pasteHandler)
|
goji.Get("/paste/", pasteHandler)
|
||||||
goji.Get("/paste", http.RedirectHandler("/paste/", 301))
|
goji.Get("/paste", http.RedirectHandler("/paste/", 301))
|
||||||
|
|
||||||
|
if Config.remoteUploads {
|
||||||
|
goji.Get("/upload", uploadRemote)
|
||||||
|
goji.Get("/upload/", uploadRemote)
|
||||||
|
}
|
||||||
|
|
||||||
goji.Post("/upload", uploadPostHandler)
|
goji.Post("/upload", uploadPostHandler)
|
||||||
goji.Post("/upload/", uploadPostHandler)
|
goji.Post("/upload/", uploadPostHandler)
|
||||||
goji.Put("/upload", uploadPutHandler)
|
goji.Put("/upload", uploadPutHandler)
|
||||||
|
@ -117,6 +123,8 @@ func main() {
|
||||||
"site base url (including trailing slash)")
|
"site base url (including trailing slash)")
|
||||||
flag.BoolVar(&Config.fastcgi, "fastcgi", false,
|
flag.BoolVar(&Config.fastcgi, "fastcgi", false,
|
||||||
"serve through fastcgi")
|
"serve through fastcgi")
|
||||||
|
flag.BoolVar(&Config.remoteUploads, "remoteuploads", false,
|
||||||
|
"enable remote uploads")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
setup()
|
setup()
|
||||||
|
|
35
upload.go
35
upload.go
|
@ -7,8 +7,10 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
@ -109,6 +111,39 @@ func uploadPutHandler(c web.C, w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func uploadRemote(c web.C, w http.ResponseWriter, r *http.Request) {
|
||||||
|
if r.FormValue("url") == "" {
|
||||||
|
http.Redirect(w, r, "/", 301)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
upReq := UploadRequest{}
|
||||||
|
grabUrl, _ := url.Parse(r.FormValue("url"))
|
||||||
|
|
||||||
|
resp, err := http.Get(grabUrl.String())
|
||||||
|
if err != nil {
|
||||||
|
oopsHandler(c, w, r)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
upReq.filename = filepath.Base(grabUrl.Path)
|
||||||
|
upReq.src = resp.Body
|
||||||
|
|
||||||
|
upload, err := processUpload(upReq)
|
||||||
|
if err != nil {
|
||||||
|
oopsHandler(c, w, r)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if strings.EqualFold("application/json", r.Header.Get("Accept")) {
|
||||||
|
js := generateJSONresponse(upload)
|
||||||
|
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
|
||||||
|
w.Write(js)
|
||||||
|
} else {
|
||||||
|
http.Redirect(w, r, "/"+upload.Filename, 301)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func uploadHeaderProcess(r *http.Request, upReq *UploadRequest) {
|
func uploadHeaderProcess(r *http.Request, upReq *UploadRequest) {
|
||||||
// For legacy reasons
|
// For legacy reasons
|
||||||
if r.Header.Get("X-Randomized-Filename") == "yes" {
|
if r.Header.Get("X-Randomized-Filename") == "yes" {
|
||||||
|
|
Loading…
Reference in New Issue