Impl direct uplod

master
breel 2020-08-28 14:47:18 -06:00
parent c2cb535105
commit 25a43c8a0b
2 changed files with 62 additions and 2 deletions

View File

@ -2,6 +2,7 @@ package server
import ( import (
"io" "io"
"io/ioutil"
"local/dndex/config" "local/dndex/config"
"net/http" "net/http"
"os" "os"
@ -50,12 +51,34 @@ func (rest *REST) filesCreate(w http.ResponseWriter, r *http.Request) {
return return
} }
defer f.Close() defer f.Close()
if _, err := io.Copy(f, r.Body); err != nil { if err := rest.filesStream(r, f); err != nil {
rest.respError(w, err) rest.respError(w, err)
return
} }
w.Write([]byte(id)) w.Write([]byte(id))
} }
func (rest *REST) filesStream(r *http.Request, f io.Writer) error {
var reader io.Reader = r.Body
_, direct := r.URL.Query()["direct"]
if direct {
target, err := ioutil.ReadAll(r.Body)
if err != nil {
return err
}
resp, err := http.Get(string(target))
if err != nil {
return err
}
defer resp.Body.Close()
reader = resp.Body
}
if _, err := io.Copy(f, reader); err != nil {
return err
}
return nil
}
func (rest *REST) filesDelete(w http.ResponseWriter, r *http.Request) { func (rest *REST) filesDelete(w http.ResponseWriter, r *http.Request) {
localPath := rest.filesPath(r) localPath := rest.filesPath(r)
if stat, err := os.Stat(localPath); os.IsNotExist(err) { if stat, err := os.Stat(localPath); os.IsNotExist(err) {
@ -106,10 +129,12 @@ func (rest *REST) filesUpdate(w http.ResponseWriter, r *http.Request) {
return return
} }
defer f.Close() defer f.Close()
if _, err := io.Copy(f, r.Body); err != nil {
if err := rest.filesStream(r, f); err != nil {
rest.respError(w, err) rest.respError(w, err)
return return
} }
if err := os.Rename(localPath+".tmp", localPath); err != nil { if err := os.Rename(localPath+".tmp", localPath); err != nil {
rest.respError(w, err) rest.respError(w, err)
return return

View File

@ -1,6 +1,7 @@
package server package server
import ( import (
"bytes"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"strings" "strings"
@ -101,3 +102,37 @@ func testFilesReq(t *testing.T, rest *REST, id string, scope func(*http.Request)
rest.files(w, r) rest.files(w, r)
return w return w
} }
func TestFilesStream(t *testing.T) {
rest, _, clean := testREST(t)
defer clean()
t.Run("simple upload", func(t *testing.T) {
value := uuid.New().String()
r := httptest.NewRequest(http.MethodPost, "/", strings.NewReader(value))
buff := bytes.NewBuffer(nil)
if err := rest.filesStream(r, buff); err != nil {
t.Fatal(err)
}
if s := string(buff.Bytes()); s != value {
t.Fatal(s)
}
})
t.Run("direct upload", func(t *testing.T) {
s := httptest.NewServer(http.HandlerFunc(http.NotFound))
defer s.Close()
r := httptest.NewRequest(http.MethodPost, "/?direct", strings.NewReader(s.URL))
buff := bytes.NewBuffer(nil)
if err := rest.filesStream(r, buff); err != nil {
t.Fatal(err)
}
w := httptest.NewRecorder()
http.NotFound(w, nil)
want := string(w.Body.Bytes())
got := string(buff.Bytes())
if want != got {
t.Fatal(want, got)
}
})
}