code.gitea.io/gitea@v1.21.7/services/webhook/deliver_test.go (about) 1 // Copyright 2019 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package webhook 5 6 import ( 7 "context" 8 "net/http" 9 "net/http/httptest" 10 "net/url" 11 "testing" 12 "time" 13 14 "code.gitea.io/gitea/models/db" 15 "code.gitea.io/gitea/models/unittest" 16 webhook_model "code.gitea.io/gitea/models/webhook" 17 "code.gitea.io/gitea/modules/hostmatcher" 18 "code.gitea.io/gitea/modules/setting" 19 api "code.gitea.io/gitea/modules/structs" 20 webhook_module "code.gitea.io/gitea/modules/webhook" 21 22 "github.com/stretchr/testify/assert" 23 "github.com/stretchr/testify/require" 24 ) 25 26 func TestWebhookProxy(t *testing.T) { 27 oldWebhook := setting.Webhook 28 t.Cleanup(func() { 29 setting.Webhook = oldWebhook 30 }) 31 32 setting.Webhook.ProxyURL = "http://localhost:8080" 33 setting.Webhook.ProxyURLFixed, _ = url.Parse(setting.Webhook.ProxyURL) 34 setting.Webhook.ProxyHosts = []string{"*.discordapp.com", "discordapp.com"} 35 36 allowedHostMatcher := hostmatcher.ParseHostMatchList("webhook.ALLOWED_HOST_LIST", "discordapp.com,s.discordapp.com") 37 38 tests := []struct { 39 req string 40 want string 41 wantErr bool 42 }{ 43 { 44 req: "https://discordapp.com/api/webhooks/xxxxxxxxx/xxxxxxxxxxxxxxxxxxx", 45 want: "http://localhost:8080", 46 wantErr: false, 47 }, 48 { 49 req: "http://s.discordapp.com/assets/xxxxxx", 50 want: "http://localhost:8080", 51 wantErr: false, 52 }, 53 { 54 req: "http://github.com/a/b", 55 want: "", 56 wantErr: false, 57 }, 58 { 59 req: "http://www.discordapp.com/assets/xxxxxx", 60 want: "", 61 wantErr: true, 62 }, 63 } 64 for _, tt := range tests { 65 t.Run(tt.req, func(t *testing.T) { 66 req, err := http.NewRequest("POST", tt.req, nil) 67 require.NoError(t, err) 68 69 u, err := webhookProxy(allowedHostMatcher)(req) 70 if tt.wantErr { 71 assert.Error(t, err) 72 return 73 } 74 75 assert.NoError(t, err) 76 77 got := "" 78 if u != nil { 79 got = u.String() 80 } 81 assert.Equal(t, tt.want, got) 82 }) 83 } 84 } 85 86 func TestWebhookDeliverAuthorizationHeader(t *testing.T) { 87 assert.NoError(t, unittest.PrepareTestDatabase()) 88 89 done := make(chan struct{}, 1) 90 s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 91 assert.Equal(t, "/webhook", r.URL.Path) 92 assert.Equal(t, "Bearer s3cr3t-t0ken", r.Header.Get("Authorization")) 93 w.WriteHeader(200) 94 done <- struct{}{} 95 })) 96 t.Cleanup(s.Close) 97 98 hook := &webhook_model.Webhook{ 99 RepoID: 3, 100 URL: s.URL + "/webhook", 101 ContentType: webhook_model.ContentTypeJSON, 102 IsActive: true, 103 Type: webhook_module.GITEA, 104 } 105 err := hook.SetHeaderAuthorization("Bearer s3cr3t-t0ken") 106 assert.NoError(t, err) 107 assert.NoError(t, webhook_model.CreateWebhook(db.DefaultContext, hook)) 108 db.GetEngine(db.DefaultContext).NoAutoTime().DB().Logger.ShowSQL(true) 109 110 hookTask := &webhook_model.HookTask{HookID: hook.ID, EventType: webhook_module.HookEventPush, Payloader: &api.PushPayload{}} 111 112 hookTask, err = webhook_model.CreateHookTask(db.DefaultContext, hookTask) 113 assert.NoError(t, err) 114 if !assert.NotNil(t, hookTask) { 115 return 116 } 117 118 assert.NoError(t, Deliver(context.Background(), hookTask)) 119 select { 120 case <-done: 121 case <-time.After(5 * time.Second): 122 t.Fatal("waited to long for request to happen") 123 } 124 125 assert.True(t, hookTask.IsSucceed) 126 }