relay.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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. acceptHeader := c.Request.Header.Get("Accept")
  32. if acceptHeader != "" {
  33. req.Header.Set("Accept", acceptHeader)
  34. }
  35. connectionHeader := c.Request.Header.Get("Connection")
  36. if connectionHeader != "" {
  37. req.Header.Set("Connection", connectionHeader)
  38. }
  39. lastEventIDHeader := c.Request.Header.Get("Last-Event-ID")
  40. if lastEventIDHeader != "" {
  41. req.Header.Set("Last-Event-ID", lastEventIDHeader)
  42. }
  43. client := &http.Client{}
  44. resp, err := client.Do(req)
  45. if err != nil {
  46. c.JSON(http.StatusOK, gin.H{
  47. "error": gin.H{
  48. "message": err.Error(),
  49. "type": "one_api_error",
  50. },
  51. })
  52. return
  53. }
  54. for k, v := range resp.Header {
  55. c.Writer.Header().Set(k, v[0])
  56. }
  57. _, err = io.Copy(c.Writer, resp.Body)
  58. if err != nil {
  59. c.JSON(http.StatusOK, gin.H{
  60. "error": gin.H{
  61. "message": err.Error(),
  62. "type": "one_api_error",
  63. },
  64. })
  65. return
  66. }
  67. }