@@ -3,7 +3,6 @@ package desktop
33import (
44 "context"
55 "fmt"
6- "github.com/docker/model-cli/pkg/types"
76 "net/http"
87 "net/url"
98 "os"
@@ -16,6 +15,7 @@ import (
1615 "github.com/docker/cli/cli/context/docker"
1716 clientpkg "github.com/docker/docker/client"
1817 "github.com/docker/model-cli/pkg/standalone"
18+ "github.com/docker/model-cli/pkg/types"
1919 "github.com/docker/model-runner/pkg/inference"
2020)
2121
@@ -155,6 +155,10 @@ func DetectContext(ctx context.Context, cli *command.DockerCli) (*ModelRunnerCon
155155 client = http .DefaultClient
156156 }
157157
158+ if userAgent := os .Getenv ("USER_AGENT" ); userAgent != "" {
159+ setUserAgent (client , userAgent )
160+ }
161+
158162 // Success.
159163 return & ModelRunnerContext {
160164 kind : kind ,
@@ -183,3 +187,39 @@ func (c *ModelRunnerContext) URL(path string) string {
183187func (c * ModelRunnerContext ) Client () DockerHttpClient {
184188 return c .client
185189}
190+
191+ func setUserAgent (client DockerHttpClient , userAgent string ) {
192+ if httpClient , ok := client .(* http.Client ); ok {
193+ transport := httpClient .Transport
194+ if transport == nil {
195+ transport = http .DefaultTransport
196+ }
197+
198+ httpClient .Transport = & userAgentTransport {
199+ userAgent : userAgent ,
200+ transport : transport ,
201+ }
202+ }
203+ }
204+
205+ type userAgentTransport struct {
206+ userAgent string
207+ transport http.RoundTripper
208+ }
209+
210+ func (u * userAgentTransport ) RoundTrip (req * http.Request ) (* http.Response , error ) {
211+ reqClone := req .Clone (req .Context ())
212+
213+ existingUA := reqClone .UserAgent ()
214+
215+ var newUA string
216+ if existingUA != "" {
217+ newUA = existingUA + " " + u .userAgent
218+ } else {
219+ newUA = u .userAgent
220+ }
221+
222+ reqClone .Header .Set ("User-Agent" , newUA )
223+
224+ return u .transport .RoundTrip (reqClone )
225+ }
0 commit comments