func (h *leaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) return } b, err := ioutil.ReadAll(r.Body) if err != nil { http.Error(w, "error reading body", http.StatusBadRequest) return } lreq := pb.LeaseKeepAliveRequest{} if err := lreq.Unmarshal(b); err != nil { http.Error(w, "error unmarshalling request", http.StatusBadRequest) return } ttl, err := h.l.Renew(LeaseID(lreq.ID)) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } // TODO: fill out ResponseHeader resp := &pb.LeaseKeepAliveResponse{ID: lreq.ID, TTL: ttl} v, err := resp.Marshal() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/protobuf") w.Write(v) }
func (h *leaseHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { http.Error(w, "Method Not Allowed", http.StatusMethodNotAllowed) return } b, err := ioutil.ReadAll(r.Body) if err != nil { http.Error(w, "error reading body", http.StatusBadRequest) return } var v []byte switch r.URL.Path { case LeasePrefix: lreq := pb.LeaseKeepAliveRequest{} if err := lreq.Unmarshal(b); err != nil { http.Error(w, "error unmarshalling request", http.StatusBadRequest) return } ttl, err := h.l.Renew(lease.LeaseID(lreq.ID)) if err != nil { if err == lease.ErrLeaseNotFound { http.Error(w, err.Error(), http.StatusNotFound) return } http.Error(w, err.Error(), http.StatusBadRequest) return } // TODO: fill out ResponseHeader resp := &pb.LeaseKeepAliveResponse{ID: lreq.ID, TTL: ttl} v, err = resp.Marshal() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } case LeaseInternalPrefix: lreq := leasepb.LeaseInternalRequest{} if err := lreq.Unmarshal(b); err != nil { http.Error(w, "error unmarshalling request", http.StatusBadRequest) return } l := h.l.Lookup(lease.LeaseID(lreq.LeaseTimeToLiveRequest.ID)) if l == nil { http.Error(w, lease.ErrLeaseNotFound.Error(), http.StatusNotFound) return } // TODO: fill out ResponseHeader resp := &leasepb.LeaseInternalResponse{ LeaseTimeToLiveResponse: &pb.LeaseTimeToLiveResponse{ Header: &pb.ResponseHeader{}, ID: lreq.LeaseTimeToLiveRequest.ID, TTL: int64(l.Remaining().Seconds()), GrantedTTL: l.TTL(), }, } if lreq.LeaseTimeToLiveRequest.Keys { ks := l.Keys() kbs := make([][]byte, len(ks)) for i := range ks { kbs[i] = []byte(ks[i]) } resp.LeaseTimeToLiveResponse.Keys = kbs } v, err = resp.Marshal() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } default: http.Error(w, fmt.Sprintf("unknown request path %q", r.URL.Path), http.StatusBadRequest) return } w.Header().Set("Content-Type", "application/protobuf") w.Write(v) }