mirror of
https://github.com/Luzifer/share.git
synced 2024-10-18 13:24:23 +00:00
Add stdin sharing and allow content-type being specified
Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
parent
d6171192a7
commit
ff91ea2882
3 changed files with 37 additions and 10 deletions
2
http.go
2
http.go
|
@ -19,7 +19,7 @@ func simpleFilePost(res http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
url, err := executeUpload(fh.Filename, f, true)
|
url, err := executeUpload(fh.Filename, f, true, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.WithError(err).Error("Uploading file from HTTP request failed")
|
log.WithError(err).Error("Uploading file from HTTP request failed")
|
||||||
http.Error(res, "Failed to upload file. For details see the log.", http.StatusInternalServerError)
|
http.Error(res, "Failed to upload file. For details see the log.", http.StatusInternalServerError)
|
||||||
|
|
27
main.go
27
main.go
|
@ -6,6 +6,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/Luzifer/rconfig"
|
"github.com/Luzifer/rconfig"
|
||||||
|
@ -18,6 +19,7 @@ var (
|
||||||
BasePath string `flag:"base-path" env:"BASE_PATH" default:"file/{{ printf \"%.2s\" .Hash }}/{{.Hash}}" description:"Path to upload the file to"`
|
BasePath string `flag:"base-path" env:"BASE_PATH" default:"file/{{ printf \"%.2s\" .Hash }}/{{.Hash}}" description:"Path to upload the file to"`
|
||||||
Bootstrap bool `flag:"bootstrap" default:"false" description:"Upload frontend files into bucket"`
|
Bootstrap bool `flag:"bootstrap" default:"false" description:"Upload frontend files into bucket"`
|
||||||
Bucket string `flag:"bucket" env:"BUCKET" default:"" description:"S3 bucket to upload files to" validate:"nonzero"`
|
Bucket string `flag:"bucket" env:"BUCKET" default:"" description:"S3 bucket to upload files to" validate:"nonzero"`
|
||||||
|
ContentType string `flag:"content-type,c" default:"" description:"Force content-type to be set to this value"`
|
||||||
Listen string `flag:"listen" env:"LISTEN" default:"" description:"Enable HTTP server if set to IP/Port (e.g. ':3000')"`
|
Listen string `flag:"listen" env:"LISTEN" default:"" description:"Enable HTTP server if set to IP/Port (e.g. ':3000')"`
|
||||||
VersionAndExit bool `flag:"version" default:"false" description:"Prints current version and exits"`
|
VersionAndExit bool `flag:"version" default:"false" description:"Prints current version and exits"`
|
||||||
}{}
|
}{}
|
||||||
|
@ -26,6 +28,7 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
rconfig.AutoEnv(true)
|
||||||
if err := rconfig.ParseAndValidate(&cfg); err != nil {
|
if err := rconfig.ParseAndValidate(&cfg); err != nil {
|
||||||
log.Fatalf("Unable to parse commandline options: %s", err)
|
log.Fatalf("Unable to parse commandline options: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -67,14 +70,34 @@ func doCLIUpload() error {
|
||||||
log.Warn("No BaseURL configured, output will be no complete URL")
|
log.Warn("No BaseURL configured, output will be no complete URL")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var inFile io.ReadSeeker
|
||||||
|
|
||||||
inFileName := rconfig.Args()[1]
|
inFileName := rconfig.Args()[1]
|
||||||
|
|
||||||
|
if inFileName == "-" {
|
||||||
|
inFileName = "stdin"
|
||||||
|
if cfg.ContentType == "" {
|
||||||
|
// If we don't have an explicitly set content-type assume stdin contains text
|
||||||
|
cfg.ContentType = "text/plain"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stdin is not seekable, so we need to buffer it
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
if _, err := io.Copy(buf, os.Stdin); err != nil {
|
||||||
|
log.WithError(err).Fatal("Could not read stdin")
|
||||||
|
}
|
||||||
|
|
||||||
|
inFile = bytes.NewReader(buf.Bytes())
|
||||||
|
} else {
|
||||||
inFileHandle, err := os.Open(inFileName)
|
inFileHandle, err := os.Open(inFileName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Unable to open source file: %s", err)
|
return fmt.Errorf("Unable to open source file: %s", err)
|
||||||
}
|
}
|
||||||
defer inFileHandle.Close()
|
defer inFileHandle.Close()
|
||||||
|
inFile = inFileHandle
|
||||||
|
}
|
||||||
|
|
||||||
url, err := executeUpload(inFileName, inFileHandle, true)
|
url, err := executeUpload(inFileName, inFile, true, cfg.ContentType)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Unable to upload file: %s", err)
|
return fmt.Errorf("Unable to upload file: %s", err)
|
||||||
}
|
}
|
||||||
|
@ -85,7 +108,7 @@ func doCLIUpload() error {
|
||||||
|
|
||||||
func doBootstrap() error {
|
func doBootstrap() error {
|
||||||
for _, asset := range []string{"index.html", "app.js"} {
|
for _, asset := range []string{"index.html", "app.js"} {
|
||||||
if _, err := executeUpload(asset, bytes.NewReader(MustAsset("frontend/"+asset)), false); err != nil {
|
if _, err := executeUpload(asset, bytes.NewReader(MustAsset("frontend/"+asset)), false, ""); err != nil {
|
||||||
return fmt.Errorf("Unable to upload bootstrap asset %q: %s", asset, err)
|
return fmt.Errorf("Unable to upload bootstrap asset %q: %s", asset, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ import (
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
func executeUpload(inFileName string, inFileHandle io.ReadSeeker, useCalculatedFilename bool) (string, error) {
|
func executeUpload(inFileName string, inFileHandle io.ReadSeeker, useCalculatedFilename bool, overrideMimeType string) (string, error) {
|
||||||
var (
|
var (
|
||||||
upFile = inFileName
|
upFile = inFileName
|
||||||
err error
|
err error
|
||||||
|
@ -34,6 +34,10 @@ func executeUpload(inFileName string, inFileHandle io.ReadSeeker, useCalculatedF
|
||||||
mimeType = "application/octet-stream"
|
mimeType = "application/octet-stream"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if overrideMimeType != "" {
|
||||||
|
mimeType = overrideMimeType
|
||||||
|
}
|
||||||
|
|
||||||
log.Debugf("Uploading file to %q with type %q", upFile, mimeType)
|
log.Debugf("Uploading file to %q with type %q", upFile, mimeType)
|
||||||
|
|
||||||
sess := session.Must(session.NewSession())
|
sess := session.Must(session.NewSession())
|
||||||
|
|
Loading…
Reference in a new issue