diff options
author | Lewis Marshall <lewis@lmars.net> | 2017-04-07 06:22:22 +0800 |
---|---|---|
committer | Felix Lange <fjl@users.noreply.github.com> | 2017-04-07 06:22:22 +0800 |
commit | 71fdaa42386173da7bfa13f1728c394aeeb4eb01 (patch) | |
tree | 364a169f650982d3b2880c95e40e2c91cb27c86e /cmd/swarm/upload.go | |
parent | 9aca9e6deb243b87cc75325be593a3b0c2f0a113 (diff) | |
download | dexon-71fdaa42386173da7bfa13f1728c394aeeb4eb01.tar.gz dexon-71fdaa42386173da7bfa13f1728c394aeeb4eb01.tar.zst dexon-71fdaa42386173da7bfa13f1728c394aeeb4eb01.zip |
swarm/api: refactor and improve HTTP API (#3773)
This PR deprecates the file related RPC calls in favour of an improved HTTP API.
The main aim is to expose a simple to use API which can be consumed by thin
clients (e.g. curl and HTML forms) without the need for complex logic (e.g.
manipulating prefix trie manifests).
Diffstat (limited to 'cmd/swarm/upload.go')
-rw-r--r-- | cmd/swarm/upload.go | 78 |
1 files changed, 50 insertions, 28 deletions
diff --git a/cmd/swarm/upload.go b/cmd/swarm/upload.go index 46f10c4be..42673ae21 100644 --- a/cmd/swarm/upload.go +++ b/cmd/swarm/upload.go @@ -18,13 +18,15 @@ package main import ( - "encoding/json" "fmt" "io" "io/ioutil" + "mime" + "net/http" "os" "os/user" "path" + "path/filepath" "strings" "github.com/ethereum/go-ethereum/cmd/utils" @@ -42,12 +44,10 @@ func upload(ctx *cli.Context) { defaultPath = ctx.GlobalString(SwarmUploadDefaultPath.Name) fromStdin = ctx.GlobalBool(SwarmUpFromStdinFlag.Name) mimeType = ctx.GlobalString(SwarmUploadMimeType.Name) + client = swarm.NewClient(bzzapi) + file string ) - var client = swarm.NewClient(bzzapi) - var entry swarm.ManifestEntry - var file string - if len(args) != 1 { if fromStdin { tmp, err := ioutil.TempFile("", "swarm-stdin") @@ -66,41 +66,47 @@ func upload(ctx *cli.Context) { utils.Fatalf("Need filename as the first and only argument") } } else { - file = args[0] + file = expandPath(args[0]) + } + + if !wantManifest { + f, err := swarm.Open(file) + if err != nil { + utils.Fatalf("Error opening file: %s", err) + } + defer f.Close() + hash, err := client.UploadRaw(f, f.Size) + if err != nil { + utils.Fatalf("Upload failed: %s", err) + } + fmt.Println(hash) + return } - fi, err := os.Stat(expandPath(file)) + stat, err := os.Stat(file) if err != nil { - utils.Fatalf("Failed to stat file: %v", err) + utils.Fatalf("Error opening file: %s", err) } - if fi.IsDir() { + var hash string + if stat.IsDir() { if !recursive { utils.Fatalf("Argument is a directory and recursive upload is disabled") } - if !wantManifest { - utils.Fatalf("Manifest is required for directory uploads") + hash, err = client.UploadDirectory(file, defaultPath, "") + } else { + if mimeType == "" { + mimeType = detectMimeType(file) } - mhash, err := client.UploadDirectory(file, defaultPath) + f, err := swarm.Open(file) if err != nil { - utils.Fatalf("Failed to upload directory: %v", err) + utils.Fatalf("Error opening file: %s", err) } - fmt.Println(mhash) - return + defer f.Close() + f.ContentType = mimeType + hash, err = client.Upload(f, "") } - entry, err = client.UploadFile(file, fi, mimeType) if err != nil { - utils.Fatalf("Upload failed: %v", err) - } - mroot := swarm.Manifest{Entries: []swarm.ManifestEntry{entry}} - if !wantManifest { - // Print the manifest. This is the only output to stdout. - mrootJSON, _ := json.MarshalIndent(mroot, "", " ") - fmt.Println(string(mrootJSON)) - return - } - hash, err := client.UploadManifest(mroot) - if err != nil { - utils.Fatalf("Manifest upload failed: %v", err) + utils.Fatalf("Upload failed: %s", err) } fmt.Println(hash) } @@ -128,3 +134,19 @@ func homeDir() string { } return "" } + +func detectMimeType(file string) string { + if ext := filepath.Ext(file); ext != "" { + return mime.TypeByExtension(ext) + } + f, err := os.Open(file) + if err != nil { + return "" + } + defer f.Close() + buf := make([]byte, 512) + if n, _ := f.Read(buf); n > 0 { + return http.DetectContentType(buf) + } + return "" +} |