(initCtx context.Context, serverURL *url.URL, token string, options *Options)
| 93 | } |
| 94 | |
| 95 | func (*client) NewConn(initCtx context.Context, serverURL *url.URL, token string, options *Options) (vpnC Conn, err error) { |
| 96 | if options == nil { |
| 97 | options = &Options{} |
| 98 | } |
| 99 | |
| 100 | if options.Headers == nil { |
| 101 | options.Headers = http.Header{} |
| 102 | } |
| 103 | |
| 104 | headers := options.Headers |
| 105 | sdk := codersdk.New(serverURL) |
| 106 | sdk.SetSessionToken(token) |
| 107 | sdk.HTTPClient.Transport = &codersdk.HeaderTransport{ |
| 108 | Transport: http.DefaultTransport, |
| 109 | Header: headers.Clone(), |
| 110 | } |
| 111 | |
| 112 | // New context, separate from initCtx. We don't want to cancel the |
| 113 | // connection if initCtx is canceled. |
| 114 | ctx, cancel := context.WithCancel(context.Background()) |
| 115 | defer func() { |
| 116 | if err != nil { |
| 117 | cancel() |
| 118 | } |
| 119 | }() |
| 120 | |
| 121 | rpcURL, err := sdk.URL.Parse("/api/v2/tailnet") |
| 122 | if err != nil { |
| 123 | return nil, xerrors.Errorf("parse rpc url: %w", err) |
| 124 | } |
| 125 | |
| 126 | me, err := sdk.User(initCtx, codersdk.Me) |
| 127 | if err != nil { |
| 128 | return nil, xerrors.Errorf("get user: %w", err) |
| 129 | } |
| 130 | |
| 131 | connInfo, err := workspacesdk.New(sdk).AgentConnectionInfoGeneric(initCtx) |
| 132 | if err != nil { |
| 133 | return nil, xerrors.Errorf("get connection info: %w", err) |
| 134 | } |
| 135 | // default to DNS suffix of "coder" if the server hasn't set it (might be too old). |
| 136 | dnsNameOptions := tailnet.DNSNameOptions{Suffix: tailnet.CoderDNSSuffix} |
| 137 | dnsMatch := tailnet.CoderDNSSuffix |
| 138 | if connInfo.HostnameSuffix != "" { |
| 139 | dnsNameOptions.Suffix = connInfo.HostnameSuffix |
| 140 | dnsMatch = connInfo.HostnameSuffix |
| 141 | } |
| 142 | |
| 143 | headers.Set(codersdk.SessionTokenHeader, token) |
| 144 | dialer := workspacesdk.NewWebsocketDialer(options.Logger, rpcURL, &websocket.DialOptions{ |
| 145 | HTTPClient: sdk.HTTPClient, |
| 146 | HTTPHeader: headers.Clone(), |
| 147 | CompressionMode: websocket.CompressionDisabled, |
| 148 | }, workspacesdk.WithWorkspaceUpdates(&proto.WorkspaceUpdatesRequest{ |
| 149 | WorkspaceOwnerId: tailnet.UUIDToByteSlice(me.ID), |
| 150 | })) |
| 151 | |
| 152 | derpMapRewriter := &derpMapRewriter{ |
nothing calls this directly
no test coverage detected