anchor.diff:              end;
           _ ->
               halt(500, Rq, St)
  +    end.
  +
  +copy(#http_req{host=[ToBucket|_], raw_path= <<"/",ToPath/binary>>}=Rq,
  +     #state{dir=Dir}=St,
  +     <<"/",FromFullPath/binary>>) ->
  +    [FromBucket, FromPath] = binary:split(FromFullPath, <<"/">>),
  +    case ?BACKEND:obj_copy(Dir, FromBucket, FromPath, ToBucket, ToPath) of
  +        {ok, _} -> {true, Rq, St};
  +        _       -> {false, Rq, St}
       end.
   
   %% ===================================================================
  
positive.code:     {[{{<<"*">>, <<"*">>, []}, download}], Rq, St}.
  
  content_types_accepted(Rq, St) ->
      {[{'*', upload}], Rq, St}.
  
  resource_exists(#http_req{host=[Bucket|_],
                            raw_path= <<"/",Path/binary>>}=Rq,
  
negative.code: %% ===================================================================
  %%                         Content Accepted
  %% ===================================================================
  
  upload_or_copy(Rq, St) ->
      io:fwrite("Upload or Copy?", []),
      case cowboy_http_req:parse_header(<<"X-Amz-Copy-Source">>, Rq) of
          {undefined, undefined, Rq2} ->
              io:fwrite(" Upload!~n", []),
              io:fwrite("Rq~p~n", [Rq2]),
              upload(Rq2, St);
          {undefined, Source, Rq2} ->
              io:fwrite(" Copy!~n", []),
              copy(Rq2, St, Source)
      end.
  
  upload(#http_req{host=[Bucket|_],
                   raw_path= <<"/",Path/binary>>,
  