gcs_transport.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package main
  2. import (
  3. "context"
  4. "log"
  5. "net/http"
  6. "strconv"
  7. "strings"
  8. "cloud.google.com/go/storage"
  9. "google.golang.org/api/option"
  10. )
  11. type gcsTransport struct {
  12. client *storage.Client
  13. }
  14. func newGCSTransport() http.RoundTripper {
  15. client, err := storage.NewClient(context.Background(), option.WithCredentialsJSON([]byte(conf.GCSKey)))
  16. if err != nil {
  17. log.Fatalf("Can't create GCS client: %s", err)
  18. }
  19. return gcsTransport{client}
  20. }
  21. func (t gcsTransport) RoundTrip(req *http.Request) (resp *http.Response, err error) {
  22. bkt := t.client.Bucket(req.URL.Host)
  23. obj := bkt.Object(strings.TrimPrefix(req.URL.Path, "/"))
  24. if g, err := strconv.ParseInt(req.URL.RawQuery, 10, 64); err == nil && g > 0 {
  25. obj = obj.Generation(g)
  26. }
  27. reader, err := obj.NewReader(context.Background())
  28. if err != nil {
  29. return nil, err
  30. }
  31. return &http.Response{
  32. Status: "200 OK",
  33. StatusCode: 200,
  34. Proto: "HTTP/1.0",
  35. ProtoMajor: 1,
  36. ProtoMinor: 0,
  37. Header: make(http.Header),
  38. ContentLength: reader.Size(),
  39. Body: reader,
  40. Close: true,
  41. Request: req,
  42. }, nil
  43. }