relay.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. req.Header.Set("Authorization", c.Request.Header.Get("Authorization"))
  30. req.Header.Set("Content-Type", c.Request.Header.Get("Content-Type"))
  31. client := &http.Client{}
  32. resp, err := client.Do(req)
  33. if err != nil {
  34. c.JSON(http.StatusOK, gin.H{
  35. "error": gin.H{
  36. "message": err.Error(),
  37. "type": "one_api_error",
  38. },
  39. })
  40. return
  41. }
  42. for k, v := range resp.Header {
  43. c.Writer.Header().Set(k, v[0])
  44. }
  45. _, err = io.Copy(c.Writer, resp.Body)
  46. if err != nil {
  47. c.JSON(http.StatusOK, gin.H{
  48. "error": gin.H{
  49. "message": err.Error(),
  50. "type": "one_api_error",
  51. },
  52. })
  53. return
  54. }
  55. }