Compare commits

...

Author SHA1 Message Date
  JustAnotherArchivist 21004eb345 On-the-fly .zst decompression, take 2 3 years ago
  kiska f5c3674906 Update 'main.go' 3 years ago
  kiska 1ada262b6b Update 'main.go' 3 years ago
  kiska 4071d130d7 Update 'cmd/cmd.go' 3 years ago
  kiska 46a543b286 Update 'main.go' 3 years ago
  root dfc497ff99 kiska test 3 years ago
5 changed files with 62 additions and 22 deletions
Split View
  1. +1
    -1
      cmd/cmd.go
  2. +1
    -1
      main.go
  3. +1
    -1
      manifest.json
  4. +57
    -18
      server/handlers.go
  5. +2
    -1
      server/server.go

+ 1
- 1
cmd/cmd.go View File

@@ -6,7 +6,7 @@ import (
"os"
"strings"

"github.com/dutchcoders/transfer.sh/server"
"git.kiska.pw/kiska/transfer.sh/server"
"github.com/fatih/color"
"github.com/minio/cli"
"google.golang.org/api/googleapi"


+ 1
- 1
main.go View File

@@ -1,6 +1,6 @@
package main

import "github.com/dutchcoders/transfer.sh/cmd"
import "git.kiska.pw/kiska/transfer.sh/cmd"

func main() {
app := cmd.New()


+ 1
- 1
manifest.json View File

@@ -1,6 +1,6 @@
{
"dependencies": {
"github.com/dutchcoders/transfer.sh-web": {
"github.com/kiska3/transfer.sh-web": {
"branch": "master"
}
}


+ 57
- 18
server/handlers.go View File

@@ -61,6 +61,8 @@ import (

"encoding/base64"
qrcode "github.com/skip2/go-qrcode"

"github.com/klauspost/compress/zstd"
)

var (
@@ -321,7 +323,7 @@ func (s *Server) postHandler(w http.ResponseWriter, r *http.Request) {

}

filename = url.QueryEscape(filename)
filename = url.PathEscape(filename)
relativeURL, _ := url.Parse(path.Join(token, filename))
fmt.Fprintln(w, getURL(r).ResolveReference(relativeURL).String())

@@ -480,7 +482,7 @@ func (s *Server) putHandler(w http.ResponseWriter, r *http.Request) {

w.Header().Set("Content-Type", "text/plain")

filename = url.QueryEscape(filename)
filename = url.PathEscape(filename)
relativeURL, _ := url.Parse(path.Join(token, filename))
deleteUrl, _ := url.Parse(path.Join(token, filename, metadata.DeletionToken))

@@ -556,9 +558,10 @@ func (s *Server) CheckMetadata(token, filename string) error {
var metadata Metadata

r, _, _, err := s.storage.Get(token, fmt.Sprintf("%s.metadata", filename))
if s.storage.IsNotExist(err) {
return nil
} else if err != nil {
//if s.storage.IsNotExist(err) {
// return nil
//} else if err != nil {
if err != nil {
return err
}

@@ -837,23 +840,34 @@ func (s *Server) headHandler(w http.ResponseWriter, r *http.Request) {
filename := vars["filename"]

if err := s.CheckMetadata(token, filename); err != nil {
log.Printf("Error metadata: %s", err.Error())
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
if err2 := s.CheckMetadata(token, filename + ".zst"); err2 != nil {
log.Printf("Error metadata: %s", err.Error())
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
}

contentType, contentLength, err := s.storage.Head(token, filename)
if s.storage.IsNotExist(err) {
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
_, _, err := s.storage.Head(token, filename + ".zst")
if s.storage.IsNotExist(err) {
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
} else if err != nil {
log.Printf("%s", err.Error())
http.Error(w, "Could not retrieve file.", 500)
return
}
contentType = mime.TypeByExtension(filepath.Ext(filename))
} else if err != nil {
log.Printf("%s", err.Error())
http.Error(w, "Could not retrieve file.", 500)
return
} else {
w.Header().Set("Content-Length", strconv.FormatUint(contentLength, 10))
}

w.Header().Set("Content-Type", contentType)
w.Header().Set("Content-Length", strconv.FormatUint(contentLength, 10))
w.Header().Set("Connection", "close")
}

@@ -865,19 +879,45 @@ func (s *Server) getHandler(w http.ResponseWriter, r *http.Request) {
filename := vars["filename"]

if err := s.CheckMetadata(token, filename); err != nil {
log.Printf("Error metadata: %s", err.Error())
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
if err2 := s.CheckMetadata(token, filename + ".zst"); err2 != nil {
log.Printf("Error metadata: %s and %s", err.Error(), err2.Error())
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
}
}

reader, contentType, contentLength, err := s.storage.Get(token, filename)
if s.storage.IsNotExist(err) {
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
reader, _, _, err = s.storage.Get(token, filename + ".zst")
if s.storage.IsNotExist(err) {
http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
return
} else if err != nil {
log.Printf("Failed to get .zst from storage: %s", err.Error())
http.Error(w, "Could not retrieve file.", 500)
return
}
defer reader.Close()
if w.Header().Get("Range") != "" {
log.Printf("Range request with decompression")
http.Error(w, "Range requests with decompression are not supported", 400)
return
}
d, err := zstd.NewReader(reader)
if err != nil {
log.Printf("Failed to create zstd reader: %s", err.Error())
http.Error(w, "Could not retrieve file.", 500)
return
}
reader = d.IOReadCloser()
contentType = mime.TypeByExtension(filepath.Ext(filename))
w.Header().Set("Transfer-Encoding", "chunked")
} else if err != nil {
log.Printf("%s", err.Error())
log.Printf("Failed to get from storage: %s", err.Error())
http.Error(w, "Could not retrieve file.", 500)
return
} else {
w.Header().Set("Content-Length", strconv.FormatUint(contentLength, 10))
}

defer reader.Close()
@@ -891,7 +931,6 @@ func (s *Server) getHandler(w http.ResponseWriter, r *http.Request) {
}

w.Header().Set("Content-Type", contentType)
w.Header().Set("Content-Length", strconv.FormatUint(contentLength, 10))
w.Header().Set("Content-Disposition", fmt.Sprintf("%s; filename=\"%s\"", disposition, filename))
w.Header().Set("Connection", "keep-alive")



+ 2
- 1
server/server.go View File

@@ -341,7 +341,8 @@ func (s *Server) Run() {
r.HandleFunc("/{action:(?:download|get|inline)}/{token}/{filename}", s.headHandler).Methods("HEAD")

r.HandleFunc("/{token}/{filename}", s.previewHandler).MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) (match bool) {
match = false
return false
match = false

// The file will show a preview page when opening the link in browser directly or
// from external link. If the referer url path and current path are the same it will be


Loading…
Cancel
Save