Skip to content

Commit afcb99c

Browse files
use raw repo URIs for resources
1 parent ad58220 commit afcb99c

File tree

1 file changed

+40
-5
lines changed

1 file changed

+40
-5
lines changed

pkg/github/repository_resource.go

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import (
44
"context"
55
"encoding/base64"
66
"errors"
7+
"fmt"
8+
"io"
79
"mime"
10+
"net/http"
811
"path/filepath"
912
"strings"
1013

@@ -113,6 +116,7 @@ func repositoryResourceContentsHandler(client *github.Client) func(ctx context.C
113116
for _, entry := range directoryContent {
114117
mimeType := "text/directory"
115118
if entry.GetType() == "file" {
119+
// this is system dependent, and a best guess
116120
mimeType = mime.TypeByExtension(filepath.Ext(entry.GetName()))
117121
}
118122
resources = append(resources, mcp.TextResourceContents{
@@ -127,28 +131,59 @@ func repositoryResourceContentsHandler(client *github.Client) func(ctx context.C
127131
}
128132
if fileContent != nil {
129133
if fileContent.Content != nil {
130-
decodedContent, err := fileContent.GetContent()
134+
// download the file content from fileContent.GetDownloadURL() and use the content-type header to determine the MIME type
135+
// and return the content as a blob unless it is a text file, where you can return the content as text
136+
req, err := http.NewRequest("GET", fileContent.GetDownloadURL(), nil)
131137
if err != nil {
132-
return nil, err
138+
return nil, fmt.Errorf("failed to create request: %w", err)
133139
}
134140

135-
mimeType := mime.TypeByExtension(filepath.Ext(fileContent.GetName()))
141+
resp, err := client.Client().Do(req)
142+
if err != nil {
143+
return nil, fmt.Errorf("failed to send request: %w", err)
144+
}
145+
defer func() { _ = resp.Body.Close() }()
146+
147+
if resp.StatusCode != http.StatusOK {
148+
body, err := io.ReadAll(resp.Body)
149+
if err != nil {
150+
return nil, fmt.Errorf("failed to read response body: %w", err)
151+
}
152+
return nil, fmt.Errorf("failed to get security analysis settings: %s", string(body))
153+
}
154+
155+
mimeType := resp.Header.Get("Content-Type")
156+
if mimeType == "" {
157+
// backstop to the file extension if the content type is not set
158+
mime.TypeByExtension(filepath.Ext(fileContent.GetName()))
159+
}
136160

161+
// if the content is a string, return it as text
137162
if strings.HasPrefix(mimeType, "text") {
163+
content, err := io.ReadAll(resp.Body)
164+
if err != nil {
165+
return nil, fmt.Errorf("failed to parse the response body: %w", err)
166+
}
167+
138168
return []mcp.ResourceContents{
139169
mcp.TextResourceContents{
140170
URI: request.Params.URI,
141171
MIMEType: mimeType,
142-
Text: decodedContent,
172+
Text: string(content),
143173
},
144174
}, nil
145175
}
176+
// otherwise, read the content and encode it as base64
177+
decodedContent, err := io.ReadAll(resp.Body)
178+
if err != nil {
179+
return nil, fmt.Errorf("failed to parse the response body: %w", err)
180+
}
146181

147182
return []mcp.ResourceContents{
148183
mcp.BlobResourceContents{
149184
URI: request.Params.URI,
150185
MIMEType: mimeType,
151-
Blob: base64.StdEncoding.EncodeToString([]byte(decodedContent)), // Encode content as Base64
186+
Blob: base64.StdEncoding.EncodeToString(decodedContent), // Encode content as Base64
152187
},
153188
}, nil
154189
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy