|
1 | 1 | package cli
|
2 | 2 |
|
3 | 3 | import (
|
| 4 | + "bufio" |
| 5 | + "bytes" |
4 | 6 | "context"
|
5 | 7 | "encoding/base64"
|
6 | 8 | "encoding/json"
|
@@ -361,7 +363,7 @@ func (r *RootCmd) Command(subcommands []*clibase.Cmd) (*clibase.Cmd, error) {
|
361 | 363 | {
|
362 | 364 | Flag: varHeaderCommand,
|
363 | 365 | Env: "CODER_HEADER_COMMAND",
|
364 |
| - Description: "An external process that outputs JSON-encoded key-value pairs to be used as additional HTTP headers added to all requests.", |
| 366 | + Description: "An external command that outputs additional HTTP headers added to all requests. The command must output each header as `key=value` on its own line.", |
365 | 367 | Value: clibase.StringOf(&r.headerCommand),
|
366 | 368 | Group: globalGroup,
|
367 | 369 | },
|
@@ -605,36 +607,39 @@ func (r *RootCmd) setClient(ctx context.Context, client *codersdk.Client, server
|
605 | 607 | transport: http.DefaultTransport,
|
606 | 608 | header: http.Header{},
|
607 | 609 | }
|
608 |
| - for _, header := range r.header { |
609 |
| - parts := strings.SplitN(header, "=", 2) |
610 |
| - if len(parts) < 2 { |
611 |
| - return xerrors.Errorf("split header %q had less than two parts", header) |
612 |
| - } |
613 |
| - transport.header.Add(parts[0], parts[1]) |
614 |
| - } |
| 610 | + headers := r.header |
615 | 611 | if r.headerCommand != "" {
|
616 | 612 | shell := "sh"
|
617 | 613 | caller := "-c"
|
618 | 614 | if runtime.GOOS == "windows" {
|
619 | 615 | shell = "cmd.exe"
|
620 | 616 | caller = "/c"
|
621 | 617 | }
|
| 618 | + var outBuf bytes.Buffer |
622 | 619 | // #nosec
|
623 | 620 | cmd := exec.CommandContext(ctx, shell, caller, r.headerCommand)
|
624 | 621 | cmd.Env = append(os.Environ(), "CODER_URL="+serverURL.String())
|
625 |
| - out, err := cmd.Output() |
| 622 | + cmd.Stdout = &outBuf |
| 623 | + cmd.Stderr = io.Discard |
| 624 | + err := cmd.Run() |
626 | 625 | if err != nil {
|
627 |
| - return xerrors.Errorf("failed to run %v (out: %q): %w", cmd.Args, out, err) |
| 626 | + return xerrors.Errorf("failed to run %v: %w", cmd.Args, err) |
628 | 627 | }
|
629 |
| - var headers map[string]string |
630 |
| - err = json.Unmarshal(out, &headers) |
631 |
| - if err != nil { |
632 |
| - return xerrors.Errorf("failed to parse json from %v (out: %q): %w", cmd.Args, out, err) |
| 628 | + scanner := bufio.NewScanner(&outBuf) |
| 629 | + for scanner.Scan() { |
| 630 | + headers = append(headers, scanner.Text()) |
633 | 631 | }
|
634 |
| - for key, value := range headers { |
635 |
| - transport.header.Add(key, value) |
| 632 | + if err := scanner.Err(); err != nil { |
| 633 | + return xerrors.Errorf("scan %v: %w", cmd.Args, err) |
636 | 634 | }
|
637 | 635 | }
|
| 636 | + for _, header := range headers { |
| 637 | + parts := strings.SplitN(header, "=", 2) |
| 638 | + if len(parts) < 2 { |
| 639 | + return xerrors.Errorf("split header %q had less than two parts", header) |
| 640 | + } |
| 641 | + transport.header.Add(parts[0], parts[1]) |
| 642 | + } |
638 | 643 | client.URL = serverURL
|
639 | 644 | client.HTTPClient = &http.Client{
|
640 | 645 | Transport: transport,
|
|
0 commit comments