diff --git a/layouts.go b/layouts.go index be3321e..6ba54e6 100644 --- a/layouts.go +++ b/layouts.go @@ -64,10 +64,36 @@ var tailTemplateHTML = ` ` +var formGetUrlTemplate = template.Must(template.New("formGetUrl").Parse(formGetUrlTemplateHTML)) +var formGetUrlTemplateHTML = ` +
+
+

Get file from URL

+
+ + + + + + + + +
+
+ (comma seperatated, no spaces) +
+
+
+
+
{{/* hero-unit */}} +
{{/* span9 */}} +` + var formFileUploadTemplate = template.Must(template.New("formFileUpload").Parse(formFileUploadTemplateHTML)) var formFileUploadTemplateHTML = `
+

Upload a File

@@ -101,6 +127,29 @@ var listTemplateHTML = ` {{end}} ` +func UrliePage(w io.Writer) (err error) { + err = headTemplate.Execute(w, map[string]string{"title" : "FileSrv :: URLie"}) + if (err != nil) { + return err + } + err = navbarTemplate.Execute(w, nil) + if (err != nil) { + return err + } + err = containerBeginTemplate.Execute(w, nil) + if (err != nil) { + return err + } + err = formGetUrlTemplate.Execute(w, &emptyInterface) + if (err != nil) { + return err + } + err = tailTemplate.Execute(w, map[string]string{"footer" : ""}) + if (err != nil) { + return err + } + return +} func UploadPage(w io.Writer) (err error) { err = headTemplate.Execute(w, map[string]string{"title" : "FileSrv :: Upload"}) if (err != nil) { diff --git a/server.go b/server.go index aed9e71..34215d1 100644 --- a/server.go +++ b/server.go @@ -8,6 +8,7 @@ import ( "log" "mime" "net/http" + "os" "path/filepath" "strings" "time" @@ -424,6 +425,85 @@ func routeIPs(w http.ResponseWriter, r *http.Request) { LogRequest(r,200) } +/* + GET /urlie + POST /urlie +*/ +func routeGetFromUrl(w http.ResponseWriter, r *http.Request) { + if (r.Method == "POST") { + info := Info{ + Ip: r.RemoteAddr, + Random: Rand64(), + TimeStamp: time.Now(), + } + log.Println(info) + + err := r.ParseMultipartForm(1024*5) + if (err != nil) { + serverErr(w,r,err) + return + } + log.Printf("%q", r.MultipartForm.Value) + var local_filename string + for k, v := range r.MultipartForm.Value { + if (k == "keywords") { + info.Keywords = append(info.Keywords, strings.Split(v[0],",")...) + } else if (k == "url") { + local_filename, err = FetchFileFromURL(v[0]) + if (err != nil) { + serverErr(w,r,err) + return + } else if (len(local_filename) == 0) { + LogRequest(r,404) + http.NotFound(w,r) + return + } + // Yay, hopefully we got an image! + } else { + log.Printf("WARN: not sure what to do with param [%s = %s]", k,v) + } + } + exists, err := HasFileByFilename(local_filename) + if (err == nil && !exists) { + file, err := gfs.Create(filepath.Base(local_filename)) + defer file.Close() + if (err != nil) { + serverErr(w,r,err) + return + } + + local_fh, err := os.Open(local_filename) + defer local_fh.Close() + if (err != nil) { + serverErr(w,r,err) + return + } + + file.SetMeta(&info) + + // copy the request body into the gfs file + n, err := io.Copy(file, local_fh) + if (err != nil) { + serverErr(w,r,err) + return + } + log.Printf("Wrote [%d] bytes from %s", n, local_filename) + + http.Redirect(w,r,fmt.Sprintf("/f/%s", filepath.Base(local_filename)), 302) + } else { + serverErr(w,r,err) + return + } + } else if (r.Method == "GET") { + UrliePage(w) + } else { + LogRequest(r,404) + http.NotFound(w,r) + return + } + LogRequest(r,200) +} + /* GET /upload POST /upload @@ -482,8 +562,7 @@ func routeUpload(w http.ResponseWriter, r *http.Request) { n) } - io.WriteString(w, - fmt.Sprintf("/f/%s\n", filehdr.Filename, filehdr.Filename)) + http.Redirect(w,r,fmt.Sprintf("/f/%s", filehdr.Filename), 302) } else if (exists) { // print some message about the file already existing } else { @@ -540,6 +619,7 @@ func runServer(ip, port string) { http.HandleFunc("/", routeRoot) http.HandleFunc("/assets/", routeAssets) http.HandleFunc("/upload", routeUpload) + http.HandleFunc("/urlie", routeGetFromUrl) http.HandleFunc("/all", routeAll) http.HandleFunc("/f/", routeFiles) http.HandleFunc("/k/", routeKeywords)