|
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 | returnnil,err
|
238 | 241 | }
|
239 | 242 | }
|
| 243 | +client,err:=createUnauthenticatedClient(cmd,serverURL) |
| 244 | +iferr!=nil { |
| 245 | +returnnil,err |
| 246 | +} |
| 247 | +client.SessionToken=token |
| 248 | +returnclient,nil |
| 249 | +} |
| 250 | + |
| 251 | +funccreateUnauthenticatedClient(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 | +iferr!=nil { |
| 255 | +returnnil,err |
| 256 | +} |
| 257 | +transport:=&headerTransport{ |
| 258 | +transport:http.DefaultTransport, |
| 259 | +headers:map[string]string{}, |
| 260 | +} |
| 261 | +for_,header:=rangeheaders { |
| 262 | +parts:=strings.SplitN(header,"=",2) |
| 263 | +iflen(parts)<2 { |
| 264 | +returnnil,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 | returnclient,nil
|
243 | 270 | }
|
244 | 271 |
|
@@ -530,3 +557,15 @@ func checkWarnings(cmd *cobra.Command, client *codersdk.Client) error {
|
530 | 557 |
|
531 | 558 | returnnil
|
532 | 559 | }
|
| 560 | + |
| 561 | +typeheaderTransportstruct { |
| 562 | +transport http.RoundTripper |
| 563 | +headersmap[string]string |
| 564 | +} |
| 565 | + |
| 566 | +func (h*headerTransport)RoundTrip(req*http.Request) (*http.Response,error) { |
| 567 | +fork,v:=rangeh.headers { |
| 568 | +req.Header.Add(k,v) |
| 569 | +} |
| 570 | +returnh.transport.RoundTrip(req) |
| 571 | +} |