1
0

gcs_transport.go 1000 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package main
  2. import (
  3. "context"
  4. "log"
  5. "net/http"
  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. log.Fatalf("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. reader, err := obj.NewReader(context.Background())
  24. if err != nil {
  25. return nil, err
  26. }
  27. return &http.Response{
  28. Status: "200 OK",
  29. StatusCode: 200,
  30. Proto: "HTTP/1.0",
  31. ProtoMajor: 1,
  32. ProtoMinor: 0,
  33. Header: make(http.Header),
  34. ContentLength: reader.Size(),
  35. Body: reader,
  36. Close: true,
  37. Request: req,
  38. }, nil
  39. }