refactor: validate and parse the endpoint and proxy at program load#1267
refactor: validate and parse the endpoint and proxy at program load#1267
Conversation
| if parsed.String() != cfg.endpointURL.String() { | ||
| return cmderrors.Usage(fmt.Sprintf("endpoint argument %s conflicts with configured endpoint %s", parsed, cfg.endpointURL)) | ||
| } |
There was a problem hiding this comment.
The existence of this check calls into question the command-line parameter - SRC_ENDPOINT (or the value from the config file) is the source[1] of truth, forcing the user to put the same value on the command line.
Adding to the confusion is that if there is nothing in the config file or in SRC_ENDPOINT, cfg.endpointURL defaults to https://sourcegraph.com, which is probably wrong pretty much all of the time, and still invalidates anything different on the command line.
I kept the error condition and message (although I did change the semantics by changing from an exit error to a usage error) because I didn't want to rip that rug out from under anyone at this point.
Thoughts?
[1] no pun intended, but I do like it
There was a problem hiding this comment.
I think it's reasonable to keep backwards maintainability in this PR, but follow up with one to make the breaking changes. That makes it easier to isolate and revert if necessary.
There was a problem hiding this comment.
I believe you are changing the behaviour here. The old behaviour ignored SRC_ENDPOINT for login if the argument was set. The old error message was misleading
Edit: I see in the loginCmd function they checked if cfg.Endpoint is the same. I imagine that was a mistake. I agree with you about how this should work. But for now lets keep the same behaviour.
There was a problem hiding this comment.
For illustration, here's how it works currently (before these changes):
▶ SRC_ENDPOINT=https://sourcegraph.coursegraph.com src login https://sourcegraph.com
❌ Problem: The configured endpoint is https://sourcegraph.coursegraph.com, not https://sourcegraph.com.
🛠 To fix: Create an access token by going to https://sourcegraph.com/user/settings/tokens, then set the following environment variables in your terminal:
export SRC_ENDPOINT=https://sourcegraph.com
export SRC_ACCESS_TOKEN=(your access token)
To verify that it's working, run the login command again.
And here's how it works after these changes:
▶ SRC_ENDPOINT=https://sourcegraph.coursegraph.com ./src login https://sourcegraph.com
error: The configured endpoint is https://sourcegraph.coursegraph.com, not https://sourcegraph.com
'src login' helps you authenticate 'src' to access a Sourcegraph instance with your user credentials.
Usage:
src login SOURCEGRAPH_URL
Examples:
...
cmd/src/login.go
Outdated
| if cfg.configFilePath != "" { | ||
| fmt.Fprintln(out) | ||
| fmt.Fprintf(out, "⚠️ Warning: Configuring src with a JSON file is deprecated. Please migrate to using the env vars SRC_ENDPOINT, SRC_ACCESS_TOKEN, and SRC_PROXY instead, and then remove %s. See https://github.com/sourcegraph/src-cli#readme for more information.\n", cfg.ConfigFilePath) | ||
| fmt.Fprintf(out, "⚠️ Warning: Configuring src with a JSON file is deprecated. Please migrate to using the env vars SRC_ENDPOINT, SRC_ACCESS_TOKEN, and SRC_PROXY instead, and then remove %s. See https://github.com/sourcegraph/src-cli#readme for more information.\n", cfg.configFilePath) |
There was a problem hiding this comment.
The config file has been deprecated for a long time, but if it ever is finally removed, the ability to set additional headers will go also. Do we need to keep the ability to set additional headers around? If so, we should probably introduce yet another environment variable for those and delay the config file removal. If not, let's complete the config file deprecation!
There was a problem hiding this comment.
|
This change is part of the following stack: Change managed by git-spice. |
bahrmichael
left a comment
There was a problem hiding this comment.
I think there's a bug in https://github.com/sourcegraph/src-cli/pull/1267/changes#r2903861064. But apart from that good to go, so I'll approve to unblock.
| executionURL := fmt.Sprintf( | ||
| "%s/%s/batch-changes/%s/executions/%s", | ||
| strings.TrimSuffix(cfg.Endpoint, "/"), | ||
| cfg.endpointURL, |
There was a problem hiding this comment.
Maybe? It is a pretty complex concatenation. Here are a few options for comparison:
Current:
executionURL := fmt.Sprintf(
"%s/%s/batch-changes/%s/executions/%s",
cfg.endpointURL,
strings.TrimPrefix(namespace.URL, "/"),
batchChangeName,
batchSpecID,
)
Proposal A:
executionURL := cfg.endpointURL.JoinPath(
fmt.Sprintf(
"/%s/batch-changes/%s/executions/%s", namespace.URL,
batchChangeName,
batchSpecID,
),
).String()
Proposal B:
executionURL := endpointURL.
JoinPath(namespace.URL).
JoinPath("batch-changes").
JoinPath(batchChangeName).
JoinPath("executions").
JoinPath(batchSpecID).
String()
I think proposal B is the easiest to read, but also it's nearly the same as the original fmt.Sprintf.
keegancsmith
left a comment
There was a problem hiding this comment.
approving, but agree with Michael's catch on the breaking change.
- config struct: unexport fields, replace Endpoint/Proxy strings with endpointURL/proxyURL (*url.URL) and proxyPath, parse once in readConfig - api.ClientOpts: Endpoint string → EndpointURL *url.URL - login: accept *url.URL, move endpoint conflict check to handler - code_intel_upload: simplify makeCodeIntelUploadURL with stack copy, remove error return - api.go: use JoinPath for URL construction instead of string concat - Update all call sites and tests Amp-Thread-ID: https://ampcode.com/threads/T-019cc5da-fb05-71f8-962b-689cfc5b494d Co-authored-by: Amp <amp@ampcode.com>
…tain a query string
cab95e8 to
97c1b0a
Compare
Summary
Parse the endpoint URL at program load instead of passing around an unparsed string and needing to check/parse it in multiple places.
Parse the proxy url at program load, supporting
HTTP_PROXY,HTTPS_PROXYandNO_PROXYin addition toSRC_PROXY.SRC_PROXYtakes precedence.Changes
configstruct (cmd/src/main.go)configFromFilestruct containing the JSON elementspackage main)endpointURL-EndpointandProxyare now inconfigFromFileendpointURLinreadConfig- consumers use the parsed URLapi.ClientOpts(internal/api/api.go)Endpoint string→EndpointURL *url.URLJoinPathfor URL construction instead of string concatenation withTrimRightlogincommand (cmd/src/login.go)loginCmdnow uses the config'sendpointURLloginCmdinto the handler, where the CLI arg is parsed and compared before entering the commandcode_intel_upload(cmd/src/code_intel_upload.go)makeCodeIntelUploadURLuses a stack copy (u := *cfg.endpointURL) instead of re-parsing the URLTests
*url.URLTesting
All affected packages pass: