package awskit-s3-sim

  1. Overview
  2. Docs

Source file simulator_object_copy.ml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
open Awskit_s3
open Simulator_support
open Simulator_headers
open Simulator_state
open Simulator_error
open Simulator_store
open Simulator_checksum

let validate_opt f = function None -> Ok () | Some value -> f value

let copy conn ~source_bucket ~source_key ~destination_bucket ~destination_key
    ?options () =
  let options = Option.value ~default:Copy_object.default_options options in
  match validate_bucket_key source_bucket source_key with
  | Error error -> Error error
  | Ok () -> (
      match validate_bucket_key destination_bucket destination_key with
      | Error error -> Error error
      | Ok () -> (
          match
            require_object_version conn source_bucket source_key
              options.source_version_id
          with
          | Error error -> Error error
          | Ok src -> (
              match
                validate_opt validate_checksum_algorithm
                  options.checksum_algorithm
              with
              | Error error -> Error error
              | Ok () -> (
                  match require_bucket conn destination_bucket with
                  | Error error -> Error error
                  | Ok destination_bucket_state -> (
                      match
                        operation_fault conn `Copy_object destination_bucket
                          (Some destination_key)
                      with
                      | Some error -> Error error
                      | None -> (
                          match
                            ensure_copy_source_preconditions src
                              options.source_preconditions
                          with
                          | Error error -> Error error
                          | Ok () ->
                              let metadata =
                                match options.metadata_directive with
                                | Some (`Replace metadata) -> metadata
                                | _ -> src.metadata
                              in
                              let computed_checksum =
                                checksum_for_algorithm ~body:src.body
                                  options.checksum_algorithm
                              in
                              let checksum =
                                match computed_checksum.values with
                                | [] -> src.checksum
                                | _ -> computed_checksum
                              in
                              let obj =
                                {
                                  body = src.body;
                                  etag = src.etag;
                                  version_id = None;
                                  content_type = src.content_type;
                                  metadata;
                                  storage_class =
                                    (match options.storage_class with
                                    | Some sc -> Some sc
                                    | None -> src.storage_class);
                                  tags = src.tags;
                                  checksum;
                                  last_modified = now conn;
                                }
                              in
                              let obj =
                                store_object conn destination_bucket_state
                                  destination_key obj
                              in
                              Ok
                                {
                                  Copy_object.etag = Some obj.etag;
                                  last_modified = Some obj.last_modified;
                                  version_id = obj.version_id;
                                  copy_source_version_id = src.version_id;
                                  response =
                                    response 200
                                      ~headers:
                                        (version_headers obj.version_id
                                        @ copy_source_version_headers
                                            src.version_id);
                                }))))))