Support remote uploads

This commit is contained in:
andreimarcu 2015-10-01 20:58:08 -04:00
parent 9cd20c81fc
commit 8f7b47f572
3 changed files with 52 additions and 8 deletions

View File

@ -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

View File

@ -27,6 +27,7 @@ var Config struct {
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()

View File

@ -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" {