api_request.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package channel
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/gin-gonic/gin"
  6. "io"
  7. "net/http"
  8. "one-api/relay/common"
  9. "one-api/service"
  10. )
  11. func SetupApiRequestHeader(info *common.RelayInfo, c *gin.Context, req *http.Request) {
  12. req.Header.Set("Content-Type", c.Request.Header.Get("Content-Type"))
  13. req.Header.Set("Accept", c.Request.Header.Get("Accept"))
  14. if info.IsStream && c.Request.Header.Get("Accept") == "" {
  15. req.Header.Set("Accept", "text/event-stream")
  16. }
  17. }
  18. func DoApiRequest(a Adaptor, c *gin.Context, info *common.RelayInfo, requestBody io.Reader) (*http.Response, error) {
  19. fullRequestURL, err := a.GetRequestURL(info)
  20. if err != nil {
  21. return nil, fmt.Errorf("get request url failed: %w", err)
  22. }
  23. req, err := http.NewRequest(c.Request.Method, fullRequestURL, requestBody)
  24. if err != nil {
  25. return nil, fmt.Errorf("new request failed: %w", err)
  26. }
  27. err = a.SetupRequestHeader(c, req, info)
  28. if err != nil {
  29. return nil, fmt.Errorf("setup request header failed: %w", err)
  30. }
  31. resp, err := doRequest(c, req)
  32. if err != nil {
  33. return nil, fmt.Errorf("do request failed: %w", err)
  34. }
  35. return resp, nil
  36. }
  37. func doRequest(c *gin.Context, req *http.Request) (*http.Response, error) {
  38. resp, err := service.GetHttpClient().Do(req)
  39. if err != nil {
  40. return nil, err
  41. }
  42. if resp == nil {
  43. return nil, errors.New("resp is nil")
  44. }
  45. _ = req.Body.Close()
  46. _ = c.Request.Body.Close()
  47. return resp, nil
  48. }