|
|
@@ -113,6 +113,7 @@ func (h serverHandler) serveKeys(w http.ResponseWriter, r *http.Request) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+ rr.Path = etcdserver.KeysDir + rr.Path
|
|
|
resp, err := h.server.Do(ctx, rr)
|
|
|
if err != nil {
|
|
|
writeError(w, err)
|
|
|
@@ -121,14 +122,15 @@ func (h serverHandler) serveKeys(w http.ResponseWriter, r *http.Request) {
|
|
|
|
|
|
switch {
|
|
|
case resp.Event != nil:
|
|
|
- if err := writeEvent(w, resp.Event, h.timer); err != nil {
|
|
|
+ ev := trimEventPrefix(resp.Event, etcdserver.KeysDir)
|
|
|
+ if err := writeEvent(w, ev, h.timer); err != nil {
|
|
|
// Should never be reached
|
|
|
log.Printf("error writing event: %v", err)
|
|
|
}
|
|
|
case resp.Watcher != nil:
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), defaultWatchTimeout)
|
|
|
defer cancel()
|
|
|
- handleWatch(ctx, w, resp.Watcher, rr.Stream, h.timer)
|
|
|
+ handleKeyWatch(ctx, w, resp.Watcher, rr.Stream, h.timer)
|
|
|
default:
|
|
|
writeError(w, errors.New("received response with no Event/Watcher!"))
|
|
|
}
|
|
|
@@ -444,7 +446,7 @@ func writeEvent(w http.ResponseWriter, ev *store.Event, rt etcdserver.RaftTimer)
|
|
|
return json.NewEncoder(w).Encode(ev)
|
|
|
}
|
|
|
|
|
|
-func handleWatch(ctx context.Context, w http.ResponseWriter, wa store.Watcher, stream bool, rt etcdserver.RaftTimer) {
|
|
|
+func handleKeyWatch(ctx context.Context, w http.ResponseWriter, wa store.Watcher, stream bool, rt etcdserver.RaftTimer) {
|
|
|
defer wa.Remove()
|
|
|
ech := wa.EventChan()
|
|
|
var nch <-chan bool
|
|
|
@@ -476,6 +478,7 @@ func handleWatch(ctx context.Context, w http.ResponseWriter, wa store.Watcher, s
|
|
|
// send to the client in time. Then we simply end streaming.
|
|
|
return
|
|
|
}
|
|
|
+ ev = trimEventPrefix(ev, etcdserver.KeysDir)
|
|
|
if err := json.NewEncoder(w).Encode(ev); err != nil {
|
|
|
// Should never be reached
|
|
|
log.Printf("error writing event: %v\n", err)
|
|
|
@@ -502,3 +505,23 @@ func allowMethod(w http.ResponseWriter, m string, ms ...string) bool {
|
|
|
http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed)
|
|
|
return false
|
|
|
}
|
|
|
+
|
|
|
+func trimEventPrefix(ev *store.Event, pre string) *store.Event {
|
|
|
+ if ev == nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ ev.Node = trimNodeExternPrefix(ev.Node, pre)
|
|
|
+ ev.PrevNode = trimNodeExternPrefix(ev.PrevNode, pre)
|
|
|
+ return ev
|
|
|
+}
|
|
|
+
|
|
|
+func trimNodeExternPrefix(n *store.NodeExtern, pre string) *store.NodeExtern {
|
|
|
+ if n == nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ n.Key = strings.TrimPrefix(n.Key, pre)
|
|
|
+ for _, nn := range n.Nodes {
|
|
|
+ nn = trimNodeExternPrefix(nn, pre)
|
|
|
+ }
|
|
|
+ return n
|
|
|
+}
|