diff --git a/ipn/localapi/localapi.go b/ipn/localapi/localapi.go index c9a6a89bf..51a84a62c 100644 --- a/ipn/localapi/localapi.go +++ b/ipn/localapi/localapi.go @@ -85,6 +85,7 @@ var handler = map[string]localAPIHandler{ "derpmap": (*Handler).serveDERPMap, "dev-set-state-store": (*Handler).serveDevSetStateStore, "set-push-device-token": (*Handler).serveSetPushDeviceToken, + "handle-push-message": (*Handler).serveHandlePushMessage, "dial": (*Handler).serveDial, "file-targets": (*Handler).serveFileTargets, "goroutines": (*Handler).serveGoroutines, @@ -1587,6 +1588,27 @@ func (h *Handler) serveSetPushDeviceToken(w http.ResponseWriter, r *http.Request w.WriteHeader(http.StatusOK) } +func (h *Handler) serveHandlePushMessage(w http.ResponseWriter, r *http.Request) { + if !h.PermitWrite { + http.Error(w, "handle push message not allowed", http.StatusForbidden) + return + } + if r.Method != "POST" { + http.Error(w, "unsupported method", http.StatusMethodNotAllowed) + return + } + var pushMessageBody map[string]any + if err := json.NewDecoder(r.Body).Decode(&pushMessageBody); err != nil { + http.Error(w, "failed to decode JSON body: "+err.Error(), http.StatusBadRequest) + return + } + + // TODO(bradfitz): do something with pushMessageBody + h.logf("localapi: got push message: %v", logger.AsJSON(pushMessageBody)) + + w.WriteHeader(http.StatusNoContent) +} + func (h *Handler) serveUploadClientMetrics(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { http.Error(w, "unsupported method", http.StatusMethodNotAllowed)