relay.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. if channelType == common.ChannelTypeCustom {
  13. baseURL = c.GetString("base_url")
  14. }
  15. req, err := http.NewRequest(c.Request.Method, fmt.Sprintf("%s%s", baseURL, c.Request.URL.String()), c.Request.Body)
  16. if err != nil {
  17. c.JSON(http.StatusOK, gin.H{
  18. "error": gin.H{
  19. "message": err.Error(),
  20. "type": "one_api_error",
  21. },
  22. })
  23. return
  24. }
  25. req.Header = c.Request.Header.Clone()
  26. // Fix HTTP Decompression failed
  27. // https://github.com/stoplightio/prism/issues/1064#issuecomment-824682360
  28. req.Header.Del("Accept-Encoding")
  29. client := &http.Client{}
  30. resp, err := client.Do(req)
  31. if err != nil {
  32. c.JSON(http.StatusOK, gin.H{
  33. "error": gin.H{
  34. "message": err.Error(),
  35. "type": "one_api_error",
  36. },
  37. })
  38. return
  39. }
  40. for k, v := range resp.Header {
  41. c.Writer.Header().Set(k, v[0])
  42. }
  43. _, err = io.Copy(c.Writer, resp.Body)
  44. if err != nil {
  45. c.JSON(http.StatusOK, gin.H{
  46. "error": gin.H{
  47. "message": err.Error(),
  48. "type": "one_api_error",
  49. },
  50. })
  51. return
  52. }
  53. }