relay.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. package controller
  2. import (
  3. "fmt"
  4. "github.com/gin-gonic/gin"
  5. "io"
  6. "net/http"
  7. "one-api/common"
  8. )
  9. func Relay(c *gin.Context) {
  10. channelType := c.GetInt("channel")
  11. baseURL := common.ChannelBaseURLs[channelType]
  12. req, err := http.NewRequest(c.Request.Method, fmt.Sprintf("%s%s", baseURL, c.Request.URL.String()), c.Request.Body)
  13. if err != nil {
  14. c.JSON(http.StatusOK, gin.H{
  15. "error": gin.H{
  16. "message": err.Error(),
  17. "type": "one_api_error",
  18. },
  19. })
  20. return
  21. }
  22. req.Header = c.Request.Header.Clone()
  23. // Fix HTTP Decompression failed
  24. // https://github.com/stoplightio/prism/issues/1064#issuecomment-824682360
  25. req.Header.Del("Accept-Encoding")
  26. client := &http.Client{}
  27. resp, err := client.Do(req)
  28. if err != nil {
  29. c.JSON(http.StatusOK, gin.H{
  30. "error": gin.H{
  31. "message": err.Error(),
  32. "type": "one_api_error",
  33. },
  34. })
  35. return
  36. }
  37. for k, v := range resp.Header {
  38. c.Writer.Header().Set(k, v[0])
  39. }
  40. _, err = io.Copy(c.Writer, resp.Body)
  41. if err != nil {
  42. c.JSON(http.StatusOK, gin.H{
  43. "error": gin.H{
  44. "message": err.Error(),
  45. "type": "one_api_error",
  46. },
  47. })
  48. return
  49. }
  50. }