|
4 | 4 | "context"
|
5 | 5 | "flag"
|
6 | 6 | "fmt"
|
| 7 | + "net/http" |
7 | 8 | "net/url"
|
8 | 9 | "os"
|
9 | 10 | "strings"
|
@@ -41,6 +42,7 @@ const (
|
41 | 42 | varAgentToken = "agent-token"
|
42 | 43 | varAgentURL = "agent-url"
|
43 | 44 | varGlobalConfig = "global-config"
|
| 45 | + varHeader = "header" |
44 | 46 | varNoOpen = "no-open"
|
45 | 47 | varNoVersionCheck = "no-version-warning"
|
46 | 48 | varNoFeatureWarning = "no-feature-warning"
|
@@ -174,6 +176,7 @@ func Root(subcommands []*cobra.Command) *cobra.Command {
|
174 | 176 | cliflag.String(cmd.PersistentFlags(), varAgentURL, "", "CODER_AGENT_URL", "", "Specify the URL for an agent to access your deployment.")
|
175 | 177 | _ = cmd.PersistentFlags().MarkHidden(varAgentURL)
|
176 | 178 | cliflag.String(cmd.PersistentFlags(), varGlobalConfig, "", "CODER_CONFIG_DIR", configdir.LocalConfig("coderv2"), "Specify the path to the global `coder` config directory.")
|
| 179 | + cliflag.StringArray(cmd.PersistentFlags(), varHeader, "", "CODER_HEADER", []string{}, "HTTP headers added to all requests. Provide as \"Key=Value\"") |
177 | 180 | cmd.PersistentFlags().Bool(varForceTty, false, "Force the `coder` command to run as if connected to a TTY.")
|
178 | 181 | _ = cmd.PersistentFlags().MarkHidden(varForceTty)
|
179 | 182 | cmd.PersistentFlags().Bool(varNoOpen, false, "Block automatically opening URLs in the browser.")
|
@@ -237,8 +240,32 @@ func CreateClient(cmd *cobra.Command) (*codersdk.Client, error) {
|
237 | 240 | return nil, err
|
238 | 241 | }
|
239 | 242 | }
|
| 243 | + client, err := createUnauthenticatedClient(cmd, serverURL) |
| 244 | + if err != nil { |
| 245 | + return nil, err |
| 246 | + } |
| 247 | + client.SessionToken = token |
| 248 | + return client, nil |
| 249 | +} |
| 250 | + |
| 251 | +func createUnauthenticatedClient(cmd *cobra.Command, serverURL *url.URL) (*codersdk.Client, error) { |
240 | 252 | client := codersdk.New(serverURL)
|
241 |
| - client.SessionToken = strings.TrimSpace(token) |
| 253 | + headers, err := cmd.Flags().GetStringArray(varHeader) |
| 254 | + if err != nil { |
| 255 | + return nil, err |
| 256 | + } |
| 257 | + transport := &headerTransport{ |
| 258 | + transport: http.DefaultTransport, |
| 259 | + headers: map[string]string{}, |
| 260 | + } |
| 261 | + for _, header := range headers { |
| 262 | + parts := strings.SplitN(header, "=", 2) |
| 263 | + if len(parts) < 2 { |
| 264 | + return nil, xerrors.Errorf("split header %q had less than two parts", header) |
| 265 | + } |
| 266 | + transport.headers[parts[0]] = parts[1] |
| 267 | + } |
| 268 | + client.HTTPClient.Transport = transport |
242 | 269 | return client, nil
|
243 | 270 | }
|
244 | 271 |
|
@@ -530,3 +557,15 @@ func checkWarnings(cmd *cobra.Command, client *codersdk.Client) error {
|
530 | 557 |
|
531 | 558 | return nil
|
532 | 559 | }
|
| 560 | + |
| 561 | +type headerTransport struct { |
| 562 | + transport http.RoundTripper |
| 563 | + headers map[string]string |
| 564 | +} |
| 565 | + |
| 566 | +func (h *headerTransport) RoundTrip(req *http.Request) (*http.Response, error) { |
| 567 | + for k, v := range h.headers { |
| 568 | + req.Header.Add(k, v) |
| 569 | + } |
| 570 | + return h.transport.RoundTrip(req) |
| 571 | +} |
0 commit comments