(ctx context.Context, serverURL *url.URL, inv *serpent.Invocation)
| 806 | } |
| 807 | |
| 808 | func (r *RootCmd) createHTTPClient(ctx context.Context, serverURL *url.URL, inv *serpent.Invocation) (*http.Client, error) { |
| 809 | baseTransport, err := newHTTPTransport(r.tlsConfig) |
| 810 | if err != nil { |
| 811 | return nil, err |
| 812 | } |
| 813 | transport := baseTransport |
| 814 | |
| 815 | transport = wrapTransportWithTelemetryHeader(transport, inv) |
| 816 | transport = wrapTransportWithUserAgentHeader(transport, inv) |
| 817 | if !r.noVersionCheck { |
| 818 | buildInfoTransport, err := newHTTPTransport(r.tlsConfig) |
| 819 | if err != nil { |
| 820 | return nil, err |
| 821 | } |
| 822 | transport = wrapTransportWithVersionCheck(transport, inv, buildinfo.Version(), func(ctx context.Context) (codersdk.BuildInfoResponse, error) { |
| 823 | // Create a new client without any wrapped transport |
| 824 | // otherwise it creates an infinite loop! |
| 825 | basicClient := codersdk.New(serverURL, codersdk.WithHTTPClient(&http.Client{Transport: buildInfoTransport})) |
| 826 | return basicClient.BuildInfo(ctx) |
| 827 | }) |
| 828 | } |
| 829 | if !r.noFeatureWarning { |
| 830 | transport = wrapTransportWithEntitlementsCheck(transport, inv.Stderr) |
| 831 | } |
| 832 | headerTransport, err := r.HeaderTransport(ctx, serverURL) |
| 833 | if err != nil { |
| 834 | return nil, xerrors.Errorf("create header transport: %w", err) |
| 835 | } |
| 836 | // The header transport has to come last. |
| 837 | // codersdk checks for the header transport to get headers |
| 838 | // to clone on the DERP client. |
| 839 | headerTransport.Transport = transport |
| 840 | return &http.Client{ |
| 841 | Transport: headerTransport, |
| 842 | }, nil |
| 843 | } |
| 844 | |
| 845 | func newHTTPTransport(tlsConfig *tls.Config) (http.RoundTripper, error) { |
| 846 | defaultTransport, ok := http.DefaultTransport.(*http.Transport) |
no test coverage detected