webhook-interceptor/main.go
2019-11-30 13:05:47 +01:00

138 lines
3 KiB
Go

package main
import (
"encoding/json"
"io/ioutil"
"log"
"net/http"
"time"
)
var version string
type PR struct {
Action string `json:"action"`
}
func prHandler(w http.ResponseWriter, r *http.Request) {
var pr PR
defer r.Body.Close()
body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Printf("debug headers: %#v", r.Header)
log.Printf("debug body: %s", string(body))
err = json.Unmarshal(body, &pr)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
switch pr.Action {
case "opened", "reopened", "synchronize", // GitHub
"synchronized": // Gitea
if r.Header.Get("X-Interceptor-Action") == "create" {
w.Write(body)
return
}
case "closed":
if r.Header.Get("X-Interceptor-Action") == "delete" {
w.Write(body)
return
}
}
w.WriteHeader(http.StatusBadRequest)
}
type Push struct {
Ref string `json:"ref"`
}
func pushHandler(w http.ResponseWriter, r *http.Request) {
var p Push
defer r.Body.Close()
body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Printf("debug headers: %#v", r.Header)
log.Printf("debug: %s", string(body))
err = json.Unmarshal(body, &p)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if r.Header.Get("X-Interceptor-Ref") == p.Ref {
w.Write(body)
return
}
w.WriteHeader(http.StatusBadRequest)
}
type CommentBody struct {
Comment Comment `json:"comment"`
}
type Comment struct {
Body string `json:"body"`
}
func commentHandler(w http.ResponseWriter, r *http.Request) {
var c CommentBody
defer r.Body.Close()
body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Printf("debug headers: %#v", r.Header)
log.Printf("debug: %s", string(body))
err = json.Unmarshal(body, &c)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
if r.Header.Get("X-Interceptor-Comment") == c.Comment.Body {
w.Write(body)
return
}
w.WriteHeader(http.StatusBadRequest)
}
func dumpHandler(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Printf("debug headers: %#v", r.Header)
log.Printf("debug: %s", string(body))
w.WriteHeader(http.StatusBadRequest)
}
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
event := r.Header.Get("X-GitHub-Event")
log.Printf("%s %s %s: %s", r.RemoteAddr, r.Method, r.URL, event)
switch event {
case "pull_request":
prHandler(w, r)
case "push":
pushHandler(w, r)
//case "issue_comment":
// commentHandler(w, r)
default:
dumpHandler(w, r)
}
})
s := &http.Server{
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 120 * time.Second,
Addr: ":8080",
}
log.Fatal(s.ListenAndServe())
}