Chris Lu
4 years ago
3 changed files with 118 additions and 6 deletions
-
2weed/server/common.go
-
8weed/server/filer_server_handlers.go
-
102weed/server/filer_server_handlers_tagging.go
@ -0,0 +1,102 @@ |
|||
package weed_server |
|||
|
|||
import ( |
|||
"context" |
|||
"net/http" |
|||
"strings" |
|||
|
|||
"github.com/chrislusf/seaweedfs/weed/glog" |
|||
"github.com/chrislusf/seaweedfs/weed/storage/needle" |
|||
"github.com/chrislusf/seaweedfs/weed/util" |
|||
) |
|||
|
|||
// add or replace one file Seaweed- prefixed attributes
|
|||
// curl -X PUT -H "Seaweed-Name1: value1" http://localhost:8888/path/to/a/file?tagging
|
|||
func (fs *FilerServer) PutTaggingHandler(w http.ResponseWriter, r *http.Request) { |
|||
|
|||
ctx := context.Background() |
|||
|
|||
path := r.URL.Path |
|||
if strings.HasSuffix(path, "/") { |
|||
path = path[:len(path)-1] |
|||
} |
|||
|
|||
existingEntry, err := fs.filer.FindEntry(ctx, util.FullPath(path)) |
|||
if err != nil { |
|||
writeJsonError(w, r, http.StatusNotFound, err) |
|||
return |
|||
} |
|||
if existingEntry == nil { |
|||
writeJsonError(w, r, http.StatusNotFound, err) |
|||
return |
|||
} |
|||
|
|||
if existingEntry.Extended == nil { |
|||
existingEntry.Extended = make(map[string][]byte) |
|||
} |
|||
|
|||
for header, values := range r.Header { |
|||
if strings.HasPrefix(header, needle.PairNamePrefix) { |
|||
for _, value := range values { |
|||
existingEntry.Extended[header] = []byte(value) |
|||
} |
|||
} |
|||
} |
|||
|
|||
if dbErr := fs.filer.CreateEntry(ctx, existingEntry, false, false, nil); dbErr != nil { |
|||
glog.V(0).Infof("failing to update %s tagging : %v", path, dbErr) |
|||
writeJsonError(w, r, http.StatusInternalServerError, err) |
|||
return |
|||
} |
|||
|
|||
writeJsonQuiet(w, r, http.StatusAccepted, nil) |
|||
return |
|||
} |
|||
|
|||
// remove all Seaweed- prefixed attributes
|
|||
// curl -X DELETE http://localhost:8888/path/to/a/file?tagging
|
|||
func (fs *FilerServer) DeleteTaggingHandler(w http.ResponseWriter, r *http.Request) { |
|||
|
|||
ctx := context.Background() |
|||
|
|||
path := r.URL.Path |
|||
if strings.HasSuffix(path, "/") { |
|||
path = path[:len(path)-1] |
|||
} |
|||
|
|||
existingEntry, err := fs.filer.FindEntry(ctx, util.FullPath(path)) |
|||
if err != nil { |
|||
writeJsonError(w, r, http.StatusNotFound, err) |
|||
return |
|||
} |
|||
if existingEntry == nil { |
|||
writeJsonError(w, r, http.StatusNotFound, err) |
|||
return |
|||
} |
|||
|
|||
if existingEntry.Extended == nil { |
|||
existingEntry.Extended = make(map[string][]byte) |
|||
} |
|||
|
|||
hasDeletion := false |
|||
for header, _ := range existingEntry.Extended { |
|||
if strings.HasPrefix(header, needle.PairNamePrefix) { |
|||
delete(existingEntry.Extended, header) |
|||
hasDeletion = true |
|||
} |
|||
} |
|||
|
|||
if !hasDeletion { |
|||
writeJsonQuiet(w, r, http.StatusNotModified, nil) |
|||
return |
|||
} |
|||
|
|||
if dbErr := fs.filer.CreateEntry(ctx, existingEntry, false, false, nil); dbErr != nil { |
|||
glog.V(0).Infof("failing to delete %s tagging : %v", path, dbErr) |
|||
writeJsonError(w, r, http.StatusInternalServerError, err) |
|||
return |
|||
} |
|||
|
|||
writeJsonQuiet(w, r, http.StatusAccepted, nil) |
|||
return |
|||
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue