Datasources: Ensure the 'Host' custom header functions as expected (#80715)

Supports "Host" custom header.

Co-authored-by: Pei-Tang Huang <tangtheone@gmail.com>
pull/80735/head
Andres Martinez Gotor 1 year ago committed by GitHub
parent 82638d059f
commit 67fe33aa62
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 69
      pkg/services/datasources/service/datasource_test.go

@ -865,6 +865,75 @@ func TestService_GetHttpTransport(t *testing.T) {
require.Equal(t, "Ok", bodyStr)
})
t.Run("Should set request Host if it is configured in custom headers within JsonData", func(t *testing.T) {
provider := httpclient.NewProvider()
sjson := simplejson.NewFromAny(map[string]any{
"httpHeaderName1": "Host",
})
sqlStore := db.InitTestDB(t)
secretsService := secretsmng.SetupTestService(t, fakes.NewFakeSecretsStore())
secretsStore := secretskvs.NewSQLSecretsKVStore(sqlStore, secretsService, log.New("test.logger"))
quotaService := quotatest.New(false, nil)
dsService, err := ProvideService(sqlStore, secretsService, secretsStore, cfg, featuremgmt.WithFeatures(), acmock.New(), acmock.NewMockedPermissionsService(), quotaService, &pluginstore.FakePluginStore{})
require.NoError(t, err)
ds := datasources.DataSource{
ID: 1,
OrgID: 1,
Name: "kubernetes",
URL: "http://k8s:8001",
Type: "Kubernetes",
JsonData: sjson,
}
secureJsonData, err := json.Marshal(map[string]string{
"httpHeaderValue1": "example.com",
})
require.NoError(t, err)
err = secretsStore.Set(context.Background(), ds.OrgID, ds.Name, secretskvs.DataSourceSecretType, string(secureJsonData))
require.NoError(t, err)
headers := dsService.getCustomHeaders(sjson, map[string]string{"httpHeaderValue1": "example.com"})
require.Equal(t, "example.com", headers["Host"])
// 1. Start HTTP test server which checks the request headers
backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.Host == "example.com" {
w.WriteHeader(200)
_, err := w.Write([]byte("Ok"))
require.NoError(t, err)
return
}
w.WriteHeader(503)
_, err := w.Write([]byte("Server name mismatch"))
require.NoError(t, err)
}))
defer backend.Close()
// 2. Get HTTP transport from datasource which uses the test server as backend
ds.URL = backend.URL
rt, err := dsService.GetHTTPTransport(context.Background(), &ds, provider)
require.NoError(t, err)
require.NotNil(t, rt)
// 3. Send test request which should have the Authorization header set
req := httptest.NewRequest("GET", backend.URL+"/test-host", nil)
res, err := rt.RoundTrip(req)
require.NoError(t, err)
t.Cleanup(func() {
err := res.Body.Close()
require.NoError(t, err)
})
body, err := io.ReadAll(res.Body)
require.NoError(t, err)
bodyStr := string(body)
require.Equal(t, "Ok", bodyStr)
})
t.Run("Should use request timeout if configured in JsonData", func(t *testing.T) {
provider := httpclient.NewProvider()

Loading…
Cancel
Save