Skip to content

Commit f8d349a

Browse files
committed
Add GraphQLFeaturesHeader and update related code to use headers package constants
1 parent d336e5b commit f8d349a

File tree

6 files changed

+29
-14
lines changed

6 files changed

+29
-14
lines changed

pkg/http/headers/headers.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,4 +43,11 @@ const (
4343
MCPInsidersHeader = "X-MCP-Insiders"
4444
// MCPFeaturesHeader is a comma-separated list of feature flags to enable.
4545
MCPFeaturesHeader = "X-MCP-Features"
46+
47+
// GitHub-specific headers.
48+
49+
// GraphQLFeaturesHeader is a comma-separated list of GraphQL feature flags to enable for GraphQL requests.
50+
GraphQLFeaturesHeader = "GraphQL-Features"
51+
// GitHubAPIVersionHeader is the header used to specify the GitHub API version.
52+
GitHubAPIVersionHeader = "X-GitHub-Api-Version"
4653
)

pkg/http/middleware/token_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"testing"
77

88
ghcontext "github.com/github/github-mcp-server/pkg/context"
9+
"github.com/github/github-mcp-server/pkg/http/headers"
910
"github.com/github/github-mcp-server/pkg/http/oauth"
1011
"github.com/github/github-mcp-server/pkg/utils"
1112
"github.com/stretchr/testify/assert"
@@ -181,7 +182,7 @@ func TestExtractUserToken(t *testing.T) {
181182

182183
req := httptest.NewRequest(http.MethodGet, "/test", nil)
183184
if tt.authHeader != "" {
184-
req.Header.Set("Authorization", tt.authHeader)
185+
req.Header.Set(headers.AuthorizationHeader, tt.authHeader)
185186
}
186187
rr := httptest.NewRecorder()
187188

@@ -220,7 +221,7 @@ func TestExtractUserToken_NilOAuthConfig(t *testing.T) {
220221
handler := middleware(nextHandler)
221222

222223
req := httptest.NewRequest(http.MethodGet, "/test", nil)
223-
req.Header.Set("Authorization", "Bearer ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
224+
req.Header.Set(headers.AuthorizationHeader, "Bearer ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
224225
rr := httptest.NewRecorder()
225226

226227
handler.ServeHTTP(rr, req)

pkg/http/transport/bearer.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"strings"
66

77
ghcontext "github.com/github/github-mcp-server/pkg/context"
8+
headers "github.com/github/github-mcp-server/pkg/http/headers"
89
)
910

1011
type BearerAuthTransport struct {
@@ -14,11 +15,11 @@ type BearerAuthTransport struct {
1415

1516
func (t *BearerAuthTransport) RoundTrip(req *http.Request) (*http.Response, error) {
1617
req = req.Clone(req.Context())
17-
req.Header.Set("Authorization", "Bearer "+t.Token)
18+
req.Header.Set(headers.AuthorizationHeader, "Bearer "+t.Token)
1819

1920
// Check for GraphQL-Features in context and add header if present
2021
if features := ghcontext.GetGraphQLFeatures(req.Context()); len(features) > 0 {
21-
req.Header.Set("GraphQL-Features", strings.Join(features, ", "))
22+
req.Header.Set(headers.GraphQLFeaturesHeader, strings.Join(features, ", "))
2223
}
2324

2425
return t.Transport.RoundTrip(req)

pkg/http/transport/graphql_features_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"testing"
88

99
ghcontext "github.com/github/github-mcp-server/pkg/context"
10+
"github.com/github/github-mcp-server/pkg/http/headers"
1011

1112
"github.com/stretchr/testify/assert"
1213
"github.com/stretchr/testify/require"
@@ -56,8 +57,8 @@ func TestGraphQLFeaturesTransport(t *testing.T) {
5657

5758
// Create a test server that captures the request header
5859
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
59-
capturedHeader = r.Header.Get("GraphQL-Features")
60-
headerExists = r.Header.Get("GraphQL-Features") != ""
60+
capturedHeader = r.Header.Get(headers.GraphQLFeaturesHeader)
61+
headerExists = r.Header.Get(headers.GraphQLFeaturesHeader) != ""
6162
w.WriteHeader(http.StatusOK)
6263
}))
6364
defer server.Close()
@@ -97,7 +98,7 @@ func TestGraphQLFeaturesTransport_NilTransport(t *testing.T) {
9798

9899
// Create a test server
99100
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
100-
capturedHeader = r.Header.Get("GraphQL-Features")
101+
capturedHeader = r.Header.Get(headers.GraphQLFeaturesHeader)
101102
w.WriteHeader(http.StatusOK)
102103
}))
103104
defer server.Close()
@@ -141,13 +142,13 @@ func TestGraphQLFeaturesTransport_DoesNotMutateOriginalRequest(t *testing.T) {
141142
require.NoError(t, err)
142143

143144
// Store the original header value
144-
originalHeader := req.Header.Get("GraphQL-Features")
145+
originalHeader := req.Header.Get(headers.GraphQLFeaturesHeader)
145146

146147
// Execute the request
147148
resp, err := transport.RoundTrip(req)
148149
require.NoError(t, err)
149150
defer resp.Body.Close()
150151

151152
// Verify the original request was not mutated
152-
assert.Equal(t, originalHeader, req.Header.Get("GraphQL-Features"))
153+
assert.Equal(t, originalHeader, req.Header.Get(headers.GraphQLFeaturesHeader))
153154
}

pkg/http/transport/user_agent.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package transport
22

3-
import "net/http"
3+
import (
4+
"net/http"
5+
6+
"github.com/github/github-mcp-server/pkg/http/headers"
7+
)
48

59
type UserAgentTransport struct {
610
Transport http.RoundTripper
@@ -9,6 +13,6 @@ type UserAgentTransport struct {
913

1014
func (t *UserAgentTransport) RoundTrip(req *http.Request) (*http.Response, error) {
1115
req = req.Clone(req.Context())
12-
req.Header.Set("User-Agent", t.Agent)
16+
req.Header.Set(headers.UserAgentHeader, t.Agent)
1317
return t.Transport.RoundTrip(req)
1418
}

pkg/scopes/fetcher.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"strings"
99
"time"
1010

11+
"github.com/github/github-mcp-server/pkg/http/headers"
1112
"github.com/github/github-mcp-server/pkg/utils"
1213
)
1314

@@ -78,9 +79,9 @@ func (f *Fetcher) FetchTokenScopes(ctx context.Context, token string) ([]string,
7879
return nil, fmt.Errorf("failed to create request: %w", err)
7980
}
8081

81-
req.Header.Set("Authorization", "Bearer "+token)
82-
req.Header.Set("Accept", "application/vnd.github+json")
83-
req.Header.Set("X-GitHub-Api-Version", "2022-11-28")
82+
req.Header.Set(headers.AuthorizationHeader, "Bearer "+token)
83+
req.Header.Set(headers.AcceptHeader, "application/vnd.github+json")
84+
req.Header.Set(headers.GitHubAPIVersionHeader, "2022-11-28")
8485

8586
resp, err := f.client.Do(req)
8687
if err != nil {

0 commit comments

Comments
 (0)