diff options
| author | Chris Lu <chris.lu@gmail.com> | 2013-08-06 13:23:10 -0700 |
|---|---|---|
| committer | Chris Lu <chris.lu@gmail.com> | 2013-08-06 13:23:10 -0700 |
| commit | f457eef144e148396d476d23b762cf4dc99f7c85 (patch) | |
| tree | aafc7188c151cbbf17ab82f4cf8b35d34655fb7c /go/weed/master.go | |
| parent | d51c8d37bd1ddee1a11d6f39bb18a212862b8883 (diff) | |
| download | seaweedfs-f457eef144e148396d476d23b762cf4dc99f7c85.tar.xz seaweedfs-f457eef144e148396d476d23b762cf4dc99f7c85.zip | |
add /submit handler for both master and volume server
Diffstat (limited to 'go/weed/master.go')
| -rw-r--r-- | go/weed/master.go | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/go/weed/master.go b/go/weed/master.go index 5ed3c43fd..ee8f7c6a7 100644 --- a/go/weed/master.go +++ b/go/weed/master.go @@ -1,6 +1,8 @@ package main import ( + "bytes" + "code.google.com/p/weed-fs/go/operation" "code.google.com/p/weed-fs/go/replication" "code.google.com/p/weed-fs/go/storage" "code.google.com/p/weed-fs/go/topology" @@ -191,6 +193,10 @@ func redirectHandler(w http.ResponseWriter, r *http.Request) { } } +func submitFromMasterServerHandler(w http.ResponseWriter, r *http.Request) { + submitForClientHandler(w, r, "localhost:"+strconv.Itoa(*mport)) +} + func runMaster(cmd *Command, args []string) bool { if *mMaxCpu < 1 { *mMaxCpu = runtime.NumCPU() @@ -211,6 +217,7 @@ func runMaster(cmd *Command, args []string) bool { http.HandleFunc("/vol/status", volumeStatusHandler) http.HandleFunc("/vol/vacuum", volumeVacuumHandler) + http.HandleFunc("/submit", submitFromMasterServerHandler) http.HandleFunc("/", redirectHandler) topo.StartRefreshWritableVolumes(*garbageThreshold) @@ -227,3 +234,45 @@ func runMaster(cmd *Command, args []string) bool { } return true } + +func submitForClientHandler(w http.ResponseWriter, r *http.Request, masterUrl string) { + m := make(map[string]interface{}) + if r.Method != "POST" { + m["error"] = "Only submit via POST!" + writeJsonQuiet(w, r, m) + return + } + + debug("parsing upload file...") + fname, data, mimeType, isGzipped, lastModified, pe := storage.ParseUpload(r) + if pe != nil { + writeJsonError(w, r, pe) + return + } + + debug("assigning file id for", fname) + assignResult, ae := Assign(masterUrl, 1) + if ae != nil { + writeJsonError(w, r, ae) + return + } + + url := "http://" + assignResult.PublicUrl + "/" + assignResult.Fid + if lastModified != 0 { + url = url + "?ts=" + strconv.FormatUint(lastModified, 10) + } + + debug("upload file to store", url) + uploadResult, err := operation.Upload(url, fname, bytes.NewReader(data), isGzipped, mimeType) + if err != nil { + writeJsonError(w, r, err) + return + } + + m["fileName"] = fname + m["fid"] = assignResult.Fid + m["fileUrl"] = assignResult.PublicUrl + "/" + assignResult.Fid + m["size"] = uploadResult.Size + writeJsonQuiet(w, r, m) + return +} |
