Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 32 additions & 4 deletions backend/internal/service/proxy_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@ package service
import (
"context"
"fmt"
"net/http"
"time"

infraerrors "github.com/Wei-Shaw/sub2api/internal/pkg/errors"
"github.com/Wei-Shaw/sub2api/internal/pkg/pagination"
"github.com/Wei-Shaw/sub2api/internal/pkg/proxyurl"
"github.com/Wei-Shaw/sub2api/internal/pkg/proxyutil"
)

var (
Expand Down Expand Up @@ -171,14 +175,38 @@ func (s *ProxyService) Delete(ctx context.Context, id int64) error {

// TestConnection 测试代理连接(需要实现具体测试逻辑)
func (s *ProxyService) TestConnection(ctx context.Context, id int64) error {
proxy, err := s.proxyRepo.GetByID(ctx, id)
p, err := s.proxyRepo.GetByID(ctx, id)
if err != nil {
return fmt.Errorf("get proxy: %w", err)
}

// TODO: 实现代理连接测试逻辑
// 可以尝试通过代理发送测试请求
_ = proxy
_, parsedURL, err := proxyurl.Parse(p.URL())
if err != nil {
return fmt.Errorf("parse proxy URL: %w", err)
}

transport := &http.Transport{}
if err := proxyutil.ConfigureTransportProxy(transport, parsedURL); err != nil {
return fmt.Errorf("configure proxy transport: %w", err)
}

const testTimeout = 10 * time.Second
client := &http.Client{
Transport: transport,
Timeout: testTimeout,
}
defer client.CloseIdleConnections()

req, err := http.NewRequestWithContext(ctx, http.MethodHead, "https://httpbin.org/get", nil)
if err != nil {
return fmt.Errorf("create test request: %w", err)
}

resp, err := client.Do(req)
if err != nil {
return fmt.Errorf("proxy connection test failed: %w", err)
}
defer resp.Body.Close()

return nil
}
Expand Down