diff --git a/weed-fs/src/cmd/weedc.go b/weed-fs/src/cmd/weedc.go index 2591b1fb8..a78d36c69 100644 --- a/weed-fs/src/cmd/weedc.go +++ b/weed-fs/src/cmd/weedc.go @@ -38,19 +38,8 @@ func storeHandler(w http.ResponseWriter, r *http.Request) { } func GetHandler(w http.ResponseWriter, r *http.Request) { n := new(storage.Needle) - path := r.URL.Path - sepIndex := strings.LastIndex(path, "/") - commaIndex := strings.LastIndex(path[sepIndex:], ",") - dotIndex := strings.LastIndex(path[sepIndex:], ".") - fid := path[commaIndex+1:] - if dotIndex > 0 { - fid = path[commaIndex+1 : dotIndex] - } - if commaIndex <= 0 { - log.Println("unknown file id", path[sepIndex+1:commaIndex]) - return - } - volumeId, _ := strconv.Atoui64(path[sepIndex+1 : commaIndex]) + vid, fid, ext := parseURLPath(r.URL.Path) + volumeId, _ := strconv.Atoui64(vid) n.ParsePath(fid) if *IsDebug { @@ -65,17 +54,14 @@ func GetHandler(w http.ResponseWriter, r *http.Request) { log.Println("request with unmaching cookie from ", r.RemoteAddr, "agent", r.UserAgent()) return } - if dotIndex > 0 { - ext := path[dotIndex:] + if ext!="" { w.Header().Set("Content-Type", mime.TypeByExtension(ext)) } w.Write(n.Data) } func PostHandler(w http.ResponseWriter, r *http.Request) { - path := r.URL.Path - commaIndex := strings.LastIndex(path, ",") - sepIndex := strings.LastIndex(path[:commaIndex], "/") - volumeId, e := strconv.Atoui64(path[sepIndex+1 : commaIndex]) + vid, _, _ := parseURLPath(r.URL.Path) + volumeId, e := strconv.Atoui64(vid) if e != nil { writeJson(w, r, e) } else { @@ -87,19 +73,8 @@ func PostHandler(w http.ResponseWriter, r *http.Request) { } func DeleteHandler(w http.ResponseWriter, r *http.Request) { n := new(storage.Needle) - path := r.URL.Path - sepIndex := strings.LastIndex(path, "/") - commaIndex := strings.LastIndex(path[sepIndex:], ",") - dotIndex := strings.LastIndex(path[sepIndex:], ".") - fid := path[commaIndex+1:] - if dotIndex > 0 { - fid = path[commaIndex+1 : dotIndex] - } - if commaIndex <= 0 { - log.Println("unknown file id", path[sepIndex+1:commaIndex]) - return - } - volumeId, _ := strconv.Atoui64(path[sepIndex+1 : commaIndex]) + vid, fid, _ := parseURLPath(r.URL.Path) + volumeId, _ := strconv.Atoui64(vid) n.ParsePath(fid) cookie := n.Cookie @@ -130,6 +105,23 @@ func writeJson(w http.ResponseWriter, r *http.Request, obj interface{}) { } //log.Println("JSON Response", string(bytes)) } +func parseURLPath(path string)(vid, fid, ext string){ + sepIndex := strings.LastIndex(path, "/") + commaIndex := strings.LastIndex(path[sepIndex:], ",") + dotIndex := strings.LastIndex(path[sepIndex:], ".") + vid = path[sepIndex+1 : commaIndex] + fid = path[commaIndex+1:] + ext = "" + if dotIndex > 0 { + fid = path[commaIndex+1 : dotIndex] + ext = path[dotIndex+1:] + } + if commaIndex <= 0 { + log.Println("unknown file id", path[sepIndex+1:commaIndex]) + return + } + return +} func main() { flag.Parse() diff --git a/weed-fs/src/pkg/directory/file_id.go b/weed-fs/src/pkg/directory/file_id.go index a88daf752..549fcdc53 100644 --- a/weed-fs/src/pkg/directory/file_id.go +++ b/weed-fs/src/pkg/directory/file_id.go @@ -6,6 +6,7 @@ import ( "storage" "strconv" "strings" + "util" ) type FileId struct { @@ -30,8 +31,8 @@ func ParseFileId(fid string) *FileId { } func (n *FileId) String() string { bytes := make([]byte, 12) - storage.Uint64toBytes(bytes[0:8], n.Key) - storage.Uint32toBytes(bytes[8:12], n.Hashcode) + util.Uint64toBytes(bytes[0:8], n.Key) + util.Uint32toBytes(bytes[8:12], n.Hashcode) nonzero_index := 0 for ; bytes[nonzero_index] == 0; nonzero_index++ { } diff --git a/weed-fs/src/pkg/storage/needle.go b/weed-fs/src/pkg/storage/needle.go index c643e7651..c667aa245 100644 --- a/weed-fs/src/pkg/storage/needle.go +++ b/weed-fs/src/pkg/storage/needle.go @@ -8,6 +8,7 @@ import ( "log" "os" "strings" + . "util" ) type Needle struct { diff --git a/weed-fs/src/pkg/storage/needle_map.go b/weed-fs/src/pkg/storage/needle_map.go index f870bd497..19030be3f 100644 --- a/weed-fs/src/pkg/storage/needle_map.go +++ b/weed-fs/src/pkg/storage/needle_map.go @@ -3,6 +3,7 @@ package storage import ( "log" "os" + . "util" ) type NeedleValue struct { @@ -50,11 +51,8 @@ func LoadNeedleMap(file *os.File) *NeedleMap { } return nm } -func (nm *NeedleMap) PutInMap(key uint64, offset uint32, size uint32) { - nm.m[key] = &NeedleValue{Offset: offset, Size: size} -} func (nm *NeedleMap) Put(key uint64, offset uint32, size uint32) (int, os.Error) { - nm.PutInMap(key,offset,size) + nm.m[key] = &NeedleValue{Offset: offset, Size: size} Uint64toBytes(nm.bytes[0:8], key) Uint32toBytes(nm.bytes[8:12], offset) Uint32toBytes(nm.bytes[12:16], size) diff --git a/weed-fs/src/pkg/storage/store.go b/weed-fs/src/pkg/storage/store.go index 2a49124c4..14f69bf1d 100644 --- a/weed-fs/src/pkg/storage/store.go +++ b/weed-fs/src/pkg/storage/store.go @@ -8,6 +8,7 @@ import ( "strings" "strconv" "url" + "util" ) type Store struct { @@ -66,7 +67,7 @@ func (s *Store) Join(mserver string) { values.Add("volumes", string(bytes)) log.Println("Registering exiting volumes", string(bytes)) values.Add("capacity", strconv.Itoa(s.capacity)) - retString := post("http://"+mserver+"/dir/join", values) + retString := util.Post("http://"+mserver+"/dir/join", values) if retString != nil { newVids := new([]int) log.Println("Instructed to create volume", string(retString)) diff --git a/weed-fs/src/pkg/storage/util.go b/weed-fs/src/pkg/util/bytes.go similarity index 58% rename from weed-fs/src/pkg/storage/util.go rename to weed-fs/src/pkg/util/bytes.go index 48efeffe6..24fdf47af 100644 --- a/weed-fs/src/pkg/storage/util.go +++ b/weed-fs/src/pkg/util/bytes.go @@ -1,11 +1,4 @@ -package storage - -import ( - "http" - "io/ioutil" - "url" - "log" -) +package util func BytesToUint64(b []byte)(v uint64){ length := uint(len(b)) @@ -36,17 +29,3 @@ func Uint32toBytes(b []byte, v uint32){ } } -func post(url string, values url.Values)[]byte{ - r, err := http.PostForm(url, values) - if err != nil { - log.Println("post:", err) - return nil - } - defer r.Body.Close() - b, err := ioutil.ReadAll(r.Body) - if err != nil { - log.Println("post:", err) - return nil - } - return b -} \ No newline at end of file diff --git a/weed-fs/src/pkg/util/post.go b/weed-fs/src/pkg/util/post.go new file mode 100644 index 000000000..8b421c830 --- /dev/null +++ b/weed-fs/src/pkg/util/post.go @@ -0,0 +1,23 @@ +package util + +import ( + "http" + "io/ioutil" + "url" + "log" +) + +func Post(url string, values url.Values)[]byte{ + r, err := http.PostForm(url, values) + if err != nil { + log.Println("post:", err) + return nil + } + defer r.Body.Close() + b, err := ioutil.ReadAll(r.Body) + if err != nil { + log.Println("post:", err) + return nil + } + return b +}