// @rest PUT /v1/webhook/:appid/:topic/:ver?group=xx func (this *manServer) createWebhookHandler(w http.ResponseWriter, r *http.Request, params httprouter.Params) { topic := params.ByName(UrlParamTopic) if !manager.Default.ValidateTopicName(topic) { log.Warn("illegal topic: %s", topic) writeBadRequest(w, "illegal topic") return } query := r.URL.Query() group := query.Get("group") realIp := getHttpRemoteIp(r) hisAppid := params.ByName(UrlParamAppid) myAppid := r.Header.Get(HttpHeaderAppid) ver := params.ByName(UrlParamVersion) if err := manager.Default.AuthSub(myAppid, r.Header.Get(HttpHeaderSubkey), hisAppid, topic, group); err != nil { log.Error("+webhook[%s/%s] -(%s): {%s.%s.%s UA:%s} %v", myAppid, group, realIp, hisAppid, topic, ver, r.Header.Get("User-Agent"), err) writeAuthFailure(w, err) return } cluster, found := manager.Default.LookupCluster(hisAppid) if !found { log.Error("+webhook[%s/%s] -(%s): {%s.%s.%s UA:%s} undefined cluster", myAppid, group, realIp, hisAppid, topic, ver, r.Header.Get("User-Agent")) writeBadRequest(w, "invalid appid") return } log.Info("+webhook[%s/%s] %s(%s): {%s.%s.%s UA:%s}", myAppid, group, r.RemoteAddr, realIp, hisAppid, topic, ver, r.Header.Get("User-Agent")) rawTopic := manager.Default.KafkaTopic(hisAppid, topic, ver) var hook zk.WebhookMeta decoder := json.NewDecoder(r.Body) if err := decoder.Decode(&hook); err != nil { log.Error("+webhook[%s/%s] %s(%s): {%s.%s.%s UA:%s} %v", myAppid, group, r.RemoteAddr, realIp, hisAppid, topic, ver, r.Header.Get("User-Agent"), err) writeBadRequest(w, err.Error()) return } r.Body.Close() // validate the url for _, ep := range hook.Endpoints { _, err := url.ParseRequestURI(ep) if err != nil { log.Error("+webhook[%s/%s] %s(%s): {%s.%s.%s UA:%s} %+v %v", myAppid, group, r.RemoteAddr, realIp, hisAppid, topic, ver, r.Header.Get("User-Agent"), hook.Endpoints, err) writeBadRequest(w, err.Error()) return } } hook.Cluster = cluster // cluster is decided by server if err := this.gw.zkzone.CreateOrUpdateWebhook(rawTopic, hook); err != nil { log.Error("+webhook[%s/%s] %s(%s): {%s.%s.%s UA:%s} %v", myAppid, group, r.RemoteAddr, realIp, hisAppid, topic, ver, r.Header.Get("User-Agent"), err) writeServerError(w, err.Error()) return } w.Write(ResponseOk) }