Browse Source

implementing preview

tags/v1.0.0
Remco 9 years ago
parent
commit
84663bf73a
5 changed files with 94 additions and 40 deletions
  1. +49
    -26
      transfersh-server/handlers.go
  2. +18
    -14
      transfersh-server/main.go
  3. +7
    -0
      transfersh-server/static/download.image.html
  4. +13
    -0
      transfersh-server/utils.go
  5. +7
    -0
      transfersh-web/download.image.html

+ 49
- 26
transfersh-server/handlers.go View File

@@ -35,7 +35,6 @@ import (
"errors"
"fmt"
"github.com/dutchcoders/go-clamd"
"github.com/golang/gddo/httputil/header"
"github.com/gorilla/mux"
"github.com/kennygrant/sanitize"
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.")
}

// this handler will output html or text, depending on the
// support of the client (Accept header).
/* 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")

func viewHandler(w http.ResponseWriter, r *http.Request) {
// vars := mux.Vars(r)
vars := mux.Vars(r)

actual := header.ParseAccept(r.Header, "Accept")
token := vars["token"]
filename := vars["filename"]

html := false
reader, contentType, contentLength, err := storage.Get(token, filename)
if err != nil {
}

for _, s := range actual {
if s.Value == "text/html" {
html = true
}
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 html {
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
// support of the client (Accept header).

func viewHandler(w http.ResponseWriter, r *http.Request) {
// vars := mux.Vars(r)

if acceptsHtml(r.Header) {
tmpl, err := html_template.ParseFiles("static/index.html")

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-Length", strconv.FormatUint(contentLength, 10))

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("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename))
w.Header().Set("Connection", "close")

if _, err = io.Copy(w, reader); err != nil {


+ 18
- 14
transfersh-server/main.go View File

@@ -34,6 +34,7 @@ import (
"log"
"math/rand"
"net/http"
"net/url"
"os"
"time"
)
@@ -86,23 +87,26 @@ func main() {
r.HandleFunc("/({files:.*}).tar.gz", tarGzHandler).Methods("GET")
r.HandleFunc("/download/{token}/{filename}", getHandler).Methods("GET")

/*r.HandleFunc("/{token}/{filename}", viewHandler).MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
u, err := url.Parse(r.Referer())
if err != nil {
log.Fatal(err)
return true
}
r.HandleFunc("/{token}/{filename}", previewHandler).MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
if !acceptsHtml(r.Header) {
return false
}

match := (r.Referer() == "")

u, err := url.Parse(r.Referer())
if err != nil {
log.Fatal(err)
return false
}

if u.Host == "transfer.sh" {
return false
}
match = match || (u.Host == "transfer.sh")

if u.Host == "" {
return false
}
match = match || (u.Host == "127.0.0.1")

return true
}).Methods("GET")*/
log.Printf("%s %s match %s", r.Referer(), u.Host, match)
return match
}).Methods("GET")

r.HandleFunc("/{token}/{filename}", getHandler).Methods("GET")
r.HandleFunc("/get/{token}/{filename}", getHandler).Methods("GET")


+ 7
- 0
transfersh-server/static/download.image.html View File

@@ -0,0 +1,7 @@
<html>

{{.ContentType}}
{{.ContentLength}}
{{.Filename}}
<a href="{{.Url}}">Download</a>
</html>

+ 13
- 0
transfersh-server/utils.go View File

@@ -27,6 +27,7 @@ package main
import (
"github.com/goamz/goamz/aws"
"github.com/goamz/goamz/s3"
"github.com/golang/gddo/httputil/header"
"net/http"
"net/mail"
"strings"
@@ -78,3 +79,15 @@ func encodeRFC2047(String string) string {
addr := mail.Address{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)
}

+ 7
- 0
transfersh-web/download.image.html View File

@@ -0,0 +1,7 @@
<html>

{{.ContentType}}
{{.ContentLength}}
{{.Filename}}
<a href="{{.Url}}">Download</a>
</html>

Loading…
Cancel
Save