helper.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package s3crypto
  2. import (
  3. "errors"
  4. "io"
  5. "io/ioutil"
  6. "os"
  7. "path/filepath"
  8. "github.com/aws/aws-sdk-go/aws/request"
  9. )
  10. func getWriterStore(req *request.Request, path string, useTempFile bool) (io.ReadWriteSeeker, error) {
  11. if !useTempFile {
  12. return &bytesReadWriteSeeker{}, nil
  13. }
  14. // Create temp file to be used later for calculating the SHA256 header
  15. f, err := ioutil.TempFile(path, "")
  16. if err != nil {
  17. return nil, err
  18. }
  19. req.Handlers.Send.PushBack(func(r *request.Request) {
  20. // Close the temp file and cleanup
  21. f.Close()
  22. fpath := filepath.Join(path, f.Name())
  23. os.Remove(fpath)
  24. })
  25. return f, nil
  26. }
  27. type bytesReadWriteSeeker struct {
  28. buf []byte
  29. i int64
  30. }
  31. // Copied from Go stdlib bytes.Reader
  32. func (ws *bytesReadWriteSeeker) Read(b []byte) (int, error) {
  33. if ws.i >= int64(len(ws.buf)) {
  34. return 0, io.EOF
  35. }
  36. n := copy(b, ws.buf[ws.i:])
  37. ws.i += int64(n)
  38. return n, nil
  39. }
  40. func (ws *bytesReadWriteSeeker) Write(b []byte) (int, error) {
  41. ws.buf = append(ws.buf, b...)
  42. return len(b), nil
  43. }
  44. // Copied from Go stdlib bytes.Reader
  45. func (ws *bytesReadWriteSeeker) Seek(offset int64, whence int) (int64, error) {
  46. var abs int64
  47. switch whence {
  48. case 0:
  49. abs = offset
  50. case 1:
  51. abs = int64(ws.i) + offset
  52. case 2:
  53. abs = int64(len(ws.buf)) + offset
  54. default:
  55. return 0, errors.New("bytes.Reader.Seek: invalid whence")
  56. }
  57. if abs < 0 {
  58. return 0, errors.New("bytes.Reader.Seek: negative position")
  59. }
  60. ws.i = abs
  61. return abs, nil
  62. }