| 2542 | } |
| 2543 | |
| 2544 | func (c *unixSocketClient) ResolveBridgeTarget( |
| 2545 | ctx context.Context, |
| 2546 | id string, |
| 2547 | name string, |
| 2548 | ) (record BridgeResolveTargetRecord, err error) { |
| 2549 | path := "/api/bridges/" + url.PathEscape(strings.TrimSpace(id)) + "/resolve" |
| 2550 | var response BridgeResolveTargetRecord |
| 2551 | requestBody := BridgeResolveTargetRequest{Name: strings.TrimSpace(name)} |
| 2552 | httpResponse, err := c.doRequest( |
| 2553 | ctx, |
| 2554 | http.MethodPost, |
| 2555 | path, |
| 2556 | nil, |
| 2557 | requestBody, |
| 2558 | ) |
| 2559 | if err != nil { |
| 2560 | return BridgeResolveTargetRecord{}, err |
| 2561 | } |
| 2562 | defer func() { |
| 2563 | if closeErr := httpResponse.Body.Close(); closeErr != nil { |
| 2564 | err = errors.Join(err, fmt.Errorf("cli: close %s %s response: %w", http.MethodPost, path, closeErr)) |
| 2565 | } |
| 2566 | }() |
| 2567 | if httpResponse.StatusCode >= 200 && httpResponse.StatusCode < 300 { |
| 2568 | if err := json.NewDecoder(httpResponse.Body).Decode(&response); err != nil { |
| 2569 | return BridgeResolveTargetRecord{}, fmt.Errorf("cli: decode %s %s response: %w", http.MethodPost, path, err) |
| 2570 | } |
| 2571 | return response, nil |
| 2572 | } |
| 2573 | if httpResponse.StatusCode == http.StatusNotFound || httpResponse.StatusCode == http.StatusUnprocessableEntity { |
| 2574 | body, readErr := io.ReadAll(io.LimitReader(httpResponse.Body, 1<<20)) |
| 2575 | if readErr != nil { |
| 2576 | return BridgeResolveTargetRecord{}, fmt.Errorf("cli: read bridge target resolve response: %w", readErr) |
| 2577 | } |
| 2578 | if json.Unmarshal(body, &response) == nil && bridgeResolveTargetHasStructuredPayload(response) { |
| 2579 | return response, nil |
| 2580 | } |
| 2581 | return BridgeResolveTargetRecord{}, readAPIErrorBody(httpResponse.StatusCode, httpResponse.Status, body) |
| 2582 | } |
| 2583 | return BridgeResolveTargetRecord{}, readAPIError(httpResponse) |
| 2584 | } |
| 2585 | |
| 2586 | func bridgeResolveTargetHasStructuredPayload(response BridgeResolveTargetRecord) bool { |
| 2587 | return response.Diagnostic != nil || |