|
|
@ -66,6 +66,20 @@ func DoLocalRequest(req *http.Request) (*http.Response, error) {
|
|
|
|
return tsClient.Do(req)
|
|
|
|
return tsClient.Do(req)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
type errorJSON struct {
|
|
|
|
|
|
|
|
Error string
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// bestError returns either err, or if body contains a valid JSON
|
|
|
|
|
|
|
|
// object of type errorJSON, its non-empty error body.
|
|
|
|
|
|
|
|
func bestError(err error, body []byte) error {
|
|
|
|
|
|
|
|
var j errorJSON
|
|
|
|
|
|
|
|
if err := json.Unmarshal(body, &j); err == nil && j.Error != "" {
|
|
|
|
|
|
|
|
return errors.New(j.Error)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func send(ctx context.Context, method, path string, wantStatus int, body io.Reader) ([]byte, error) {
|
|
|
|
func send(ctx context.Context, method, path string, wantStatus int, body io.Reader) ([]byte, error) {
|
|
|
|
req, err := http.NewRequestWithContext(ctx, method, "http://local-tailscaled.sock"+path, body)
|
|
|
|
req, err := http.NewRequestWithContext(ctx, method, "http://local-tailscaled.sock"+path, body)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
@ -81,7 +95,8 @@ func send(ctx context.Context, method, path string, wantStatus int, body io.Read
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if res.StatusCode != wantStatus {
|
|
|
|
if res.StatusCode != wantStatus {
|
|
|
|
return nil, fmt.Errorf("HTTP %s: %s (expected %v)", res.Status, slurp, wantStatus)
|
|
|
|
err := fmt.Errorf("HTTP %s: %s (expected %v)", res.Status, slurp, wantStatus)
|
|
|
|
|
|
|
|
return nil, bestError(err, slurp)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return slurp, nil
|
|
|
|
return slurp, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|