implementing preview

This commit is contained in:
Remco 2014-10-26 21:30:02 +01:00
parent 3f01f58b1e
commit d2b9546f59
5 changed files with 94 additions and 40 deletions

View file

@ -35,7 +35,6 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/dutchcoders/go-clamd" "github.com/dutchcoders/go-clamd"
"github.com/golang/gddo/httputil/header"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/kennygrant/sanitize" "github.com/kennygrant/sanitize"
html_template "html/template" html_template "html/template"
@ -57,23 +56,60 @@ func healthHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Approaching Neutral Zone, all systems normal and functioning.") fmt.Fprintf(w, "Approaching Neutral Zone, all systems normal and functioning.")
} }
/* The preview handler will show a preview of the content for browsers (accept type text/html), and referer is not transfer.sh */
func previewHandler(w http.ResponseWriter, r *http.Request) {
log.Printf("preview")
vars := mux.Vars(r)
token := vars["token"]
filename := vars["filename"]
reader, contentType, contentLength, err := storage.Get(token, filename)
if err != nil {
}
reader.Close()
templatePath := "static/download.html"
if strings.HasPrefix(contentType, "image") {
templatePath = "static/download.image.html"
}
tmpl, err := html_template.ParseFiles(templatePath)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
data := struct {
ContentType string
Filename string
Url string
ContentLength uint64
}{
contentType,
filename,
r.URL.String(),
contentLength,
}
if err := tmpl.Execute(w, data); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
// this handler will output html or text, depending on the // this handler will output html or text, depending on the
// support of the client (Accept header). // support of the client (Accept header).
func viewHandler(w http.ResponseWriter, r *http.Request) { func viewHandler(w http.ResponseWriter, r *http.Request) {
// vars := mux.Vars(r) // vars := mux.Vars(r)
actual := header.ParseAccept(r.Header, "Accept") if acceptsHtml(r.Header) {
html := false
for _, s := range actual {
if s.Value == "text/html" {
html = true
}
}
if html {
tmpl, err := html_template.ParseFiles("static/index.html") tmpl, err := html_template.ParseFiles("static/index.html")
if err != nil { if err != nil {
@ -482,20 +518,7 @@ func getHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", contentType) w.Header().Set("Content-Type", contentType)
w.Header().Set("Content-Length", strconv.FormatUint(contentLength, 10)) w.Header().Set("Content-Length", strconv.FormatUint(contentLength, 10))
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename))
mediaType, _, _ := mime.ParseMediaType(contentType)
switch {
case mediaType == "text/html":
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename))
break
case strings.HasPrefix(mediaType, "text"):
case mediaType == "":
break
default:
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename))
}
w.Header().Set("Connection", "close") w.Header().Set("Connection", "close")
if _, err = io.Copy(w, reader); err != nil { if _, err = io.Copy(w, reader); err != nil {

View file

@ -34,6 +34,7 @@ import (
"log" "log"
"math/rand" "math/rand"
"net/http" "net/http"
"net/url"
"os" "os"
"time" "time"
) )
@ -79,23 +80,26 @@ func main() {
r.HandleFunc("/({files:.*}).tar.gz", tarGzHandler).Methods("GET") r.HandleFunc("/({files:.*}).tar.gz", tarGzHandler).Methods("GET")
r.HandleFunc("/download/{token}/{filename}", getHandler).Methods("GET") r.HandleFunc("/download/{token}/{filename}", getHandler).Methods("GET")
/*r.HandleFunc("/{token}/{filename}", viewHandler).MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool { r.HandleFunc("/{token}/{filename}", previewHandler).MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
u, err := url.Parse(r.Referer()) if !acceptsHtml(r.Header) {
if err != nil { return false
log.Fatal(err) }
return true
}
if u.Host == "transfer.sh" { match := (r.Referer() == "")
return false
}
if u.Host == "" { u, err := url.Parse(r.Referer())
return false if err != nil {
} log.Fatal(err)
return false
}
return true match = match || (u.Host == "transfer.sh")
}).Methods("GET")*/
match = match || (u.Host == "127.0.0.1")
log.Printf("%s %s match %s", r.Referer(), u.Host, match)
return match
}).Methods("GET")
r.HandleFunc("/{token}/{filename}", getHandler).Methods("GET") r.HandleFunc("/{token}/{filename}", getHandler).Methods("GET")
r.HandleFunc("/get/{token}/{filename}", getHandler).Methods("GET") r.HandleFunc("/get/{token}/{filename}", getHandler).Methods("GET")

View file

@ -0,0 +1,7 @@
<html>
{{.ContentType}}
{{.ContentLength}}
{{.Filename}}
<a href="{{.Url}}">Download</a>
</html>

View file

@ -27,6 +27,7 @@ package main
import ( import (
"github.com/goamz/goamz/aws" "github.com/goamz/goamz/aws"
"github.com/goamz/goamz/s3" "github.com/goamz/goamz/s3"
"github.com/golang/gddo/httputil/header"
"net/http" "net/http"
"net/mail" "net/mail"
"strings" "strings"
@ -78,3 +79,15 @@ func encodeRFC2047(String string) string {
addr := mail.Address{String, ""} addr := mail.Address{String, ""}
return strings.Trim(addr.String(), " <>") return strings.Trim(addr.String(), " <>")
} }
func acceptsHtml(hdr http.Header) bool {
actual := header.ParseAccept(hdr, "Accept")
for _, s := range actual {
if s.Value == "text/html" {
return (true)
}
}
return (false)
}

View file

@ -0,0 +1,7 @@
<html>
{{.ContentType}}
{{.ContentLength}}
{{.Filename}}
<a href="{{.Url}}">Download</a>
</html>