gcs_transport.go 1.1 KB

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