cf_worker.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package service
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "one-api/common"
  8. "one-api/setting"
  9. "strings"
  10. )
  11. // WorkerRequest Worker请求的数据结构
  12. type WorkerRequest struct {
  13. URL string `json:"url"`
  14. Key string `json:"key"`
  15. Method string `json:"method,omitempty"`
  16. Headers map[string]string `json:"headers,omitempty"`
  17. Body json.RawMessage `json:"body,omitempty"`
  18. }
  19. // DoWorkerRequest 通过Worker发送请求
  20. func DoWorkerRequest(req *WorkerRequest) (*http.Response, error) {
  21. if !setting.EnableWorker() {
  22. return nil, fmt.Errorf("worker not enabled")
  23. }
  24. if !setting.WorkerAllowHttpImageRequestEnabled && !strings.HasPrefix(req.URL, "https") {
  25. return nil, fmt.Errorf("only support https url")
  26. }
  27. workerUrl := setting.WorkerUrl
  28. if !strings.HasSuffix(workerUrl, "/") {
  29. workerUrl += "/"
  30. }
  31. // 序列化worker请求数据
  32. workerPayload, err := json.Marshal(req)
  33. if err != nil {
  34. return nil, fmt.Errorf("failed to marshal worker payload: %v", err)
  35. }
  36. return http.Post(workerUrl, "application/json", bytes.NewBuffer(workerPayload))
  37. }
  38. func DoDownloadRequest(originUrl string) (resp *http.Response, err error) {
  39. if setting.EnableWorker() {
  40. common.SysLog(fmt.Sprintf("downloading file from worker: %s", originUrl))
  41. req := &WorkerRequest{
  42. URL: originUrl,
  43. Key: setting.WorkerValidKey,
  44. }
  45. return DoWorkerRequest(req)
  46. } else {
  47. common.SysLog(fmt.Sprintf("downloading from origin: %s", originUrl))
  48. return http.Get(originUrl)
  49. }
  50. }