aboutsummaryrefslogtreecommitdiff
path: root/weed/server/common.go
diff options
context:
space:
mode:
Diffstat (limited to 'weed/server/common.go')
-rw-r--r--weed/server/common.go88
1 files changed, 72 insertions, 16 deletions
diff --git a/weed/server/common.go b/weed/server/common.go
index 31a9a73b8..8a1ccdddc 100644
--- a/weed/server/common.go
+++ b/weed/server/common.go
@@ -11,6 +11,7 @@ import (
"strings"
"time"
+ "github.com/valyala/fasthttp"
"google.golang.org/grpc"
"github.com/chrislusf/seaweedfs/weed/glog"
@@ -35,7 +36,47 @@ func init() {
statikFS, _ = statik.New()
}
-func writeJson(w http.ResponseWriter, r *http.Request, httpStatus int, obj interface{}) (err error) {
+
+func writeJson(ctx *fasthttp.RequestCtx, httpStatus int, obj interface{}) (err error) {
+ var bytes []byte
+ if ctx.FormValue("pretty") != nil {
+ bytes, err = json.MarshalIndent(obj, "", " ")
+ } else {
+ bytes, err = json.Marshal(obj)
+ }
+ if err != nil {
+ return
+ }
+ callback := ctx.FormValue("callback")
+ if callback == nil {
+ ctx.Response.Header.Set("Content-Type", "application/json")
+ ctx.SetStatusCode(httpStatus)
+ if httpStatus == http.StatusNotModified {
+ return
+ }
+ _, err = ctx.Response.BodyWriter().Write(bytes)
+ } else {
+ ctx.Response.Header.Set("Content-Type", "application/javascript")
+ ctx.SetStatusCode(httpStatus)
+ if httpStatus == http.StatusNotModified {
+ return
+ }
+ if _, err = ctx.Response.BodyWriter().Write([]uint8(callback)); err != nil {
+ return
+ }
+ if _, err = ctx.Response.BodyWriter().Write([]uint8("(")); err != nil {
+ return
+ }
+ fmt.Fprint(ctx.Response.BodyWriter(), string(bytes))
+ if _, err = ctx.Response.BodyWriter().Write([]uint8(")")); err != nil {
+ return
+ }
+ }
+
+ return
+}
+
+func oldWriteJson(w http.ResponseWriter, r *http.Request, httpStatus int, obj interface{}) (err error) {
var bytes []byte
if r.FormValue("pretty") != "" {
bytes, err = json.MarshalIndent(obj, "", " ")
@@ -74,17 +115,32 @@ func writeJson(w http.ResponseWriter, r *http.Request, httpStatus int, obj inter
return
}
-// wrapper for writeJson - just logs errors
-func writeJsonQuiet(w http.ResponseWriter, r *http.Request, httpStatus int, obj interface{}) {
- if err := writeJson(w, r, httpStatus, obj); err != nil {
+// wrapper for oldWriteJson - just logs errors
+func oldWriteJsonQuiet(w http.ResponseWriter, r *http.Request, httpStatus int, obj interface{}) {
+ if err := oldWriteJson(w, r, httpStatus, obj); err != nil {
+ glog.V(0).Infof("error writing JSON status %d: %v", httpStatus, err)
+ glog.V(1).Infof("JSON content: %+v", obj)
+ }
+}
+
+// wrapper for oldWriteJson - just logs errors
+func writeJsonQuiet(ctx *fasthttp.RequestCtx, httpStatus int, obj interface{}) {
+ if err := writeJson(ctx, httpStatus, obj); err != nil {
glog.V(0).Infof("error writing JSON status %d: %v", httpStatus, err)
glog.V(1).Infof("JSON content: %+v", obj)
}
}
-func writeJsonError(w http.ResponseWriter, r *http.Request, httpStatus int, err error) {
+
+func oldWriteJsonError(w http.ResponseWriter, r *http.Request, httpStatus int, err error) {
+ m := make(map[string]interface{})
+ m["error"] = err.Error()
+ oldWriteJsonQuiet(w, r, httpStatus, m)
+}
+
+func writeJsonError(ctx *fasthttp.RequestCtx, httpStatus int, err error) {
m := make(map[string]interface{})
m["error"] = err.Error()
- writeJsonQuiet(w, r, httpStatus, m)
+ writeJsonQuiet(ctx, httpStatus, m)
}
func debug(params ...interface{}) {
@@ -94,14 +150,14 @@ func debug(params ...interface{}) {
func submitForClientHandler(w http.ResponseWriter, r *http.Request, masterUrl string, grpcDialOption grpc.DialOption) {
m := make(map[string]interface{})
if r.Method != "POST" {
- writeJsonError(w, r, http.StatusMethodNotAllowed, errors.New("Only submit via POST!"))
+ oldWriteJsonError(w, r, http.StatusMethodNotAllowed, errors.New("Only submit via POST!"))
return
}
debug("parsing upload file...")
- fname, data, mimeType, pairMap, isGzipped, originalDataSize, lastModified, _, _, pe := needle.ParseUpload(r, 256*1024*1024)
+ fname, data, mimeType, pairMap, isGzipped, originalDataSize, lastModified, _, _, pe := needle.OldParseUpload(r, 256*1024*1024)
if pe != nil {
- writeJsonError(w, r, http.StatusBadRequest, pe)
+ oldWriteJsonError(w, r, http.StatusBadRequest, pe)
return
}
@@ -111,7 +167,7 @@ func submitForClientHandler(w http.ResponseWriter, r *http.Request, masterUrl st
if r.FormValue("count") != "" {
count, pe = strconv.ParseUint(r.FormValue("count"), 10, 32)
if pe != nil {
- writeJsonError(w, r, http.StatusBadRequest, pe)
+ oldWriteJsonError(w, r, http.StatusBadRequest, pe)
return
}
}
@@ -124,7 +180,7 @@ func submitForClientHandler(w http.ResponseWriter, r *http.Request, masterUrl st
}
assignResult, ae := operation.Assign(masterUrl, grpcDialOption, ar)
if ae != nil {
- writeJsonError(w, r, http.StatusInternalServerError, ae)
+ oldWriteJsonError(w, r, http.StatusInternalServerError, ae)
return
}
@@ -136,7 +192,7 @@ func submitForClientHandler(w http.ResponseWriter, r *http.Request, masterUrl st
debug("upload file to store", url)
uploadResult, err := operation.Upload(url, fname, bytes.NewReader(data), isGzipped, mimeType, pairMap, assignResult.Auth)
if err != nil {
- writeJsonError(w, r, http.StatusInternalServerError, err)
+ oldWriteJsonError(w, r, http.StatusInternalServerError, err)
return
}
@@ -145,7 +201,7 @@ func submitForClientHandler(w http.ResponseWriter, r *http.Request, masterUrl st
m["fileUrl"] = assignResult.PublicUrl + "/" + assignResult.Fid
m["size"] = originalDataSize
m["eTag"] = uploadResult.ETag
- writeJsonQuiet(w, r, http.StatusCreated, m)
+ oldWriteJsonQuiet(w, r, http.StatusCreated, m)
return
}
@@ -185,20 +241,20 @@ func parseURLPath(path string) (vid, fid, filename, ext string, isVolumeIdOnly b
func statsHealthHandler(w http.ResponseWriter, r *http.Request) {
m := make(map[string]interface{})
m["Version"] = util.VERSION
- writeJsonQuiet(w, r, http.StatusOK, m)
+ oldWriteJsonQuiet(w, r, http.StatusOK, m)
}
func statsCounterHandler(w http.ResponseWriter, r *http.Request) {
m := make(map[string]interface{})
m["Version"] = util.VERSION
m["Counters"] = serverStats
- writeJsonQuiet(w, r, http.StatusOK, m)
+ oldWriteJsonQuiet(w, r, http.StatusOK, m)
}
func statsMemoryHandler(w http.ResponseWriter, r *http.Request) {
m := make(map[string]interface{})
m["Version"] = util.VERSION
m["Memory"] = stats.MemStat()
- writeJsonQuiet(w, r, http.StatusOK, m)
+ oldWriteJsonQuiet(w, r, http.StatusOK, m)
}
func handleStaticResources(defaultMux *http.ServeMux) {