anchor.diff:  
   -record(state, { client_id,
                    hosts,
  -                 bucket}).
  +                 bucket,
  +                 report_fun}).
   
   %% ====================================================================
   %% API
  
positive.code:         {Error, Reason} ->
              {Error, Reason, S2}
      end;
  run(get, KeyGen, _ValueGen, #state{bucket = Bucket} = State) ->
      {NextHost, S2} = next_host(State),
      {Host, Port} = NextHost,
      Key = KeyGen(),
      Url = url(Host, Port, Bucket, Key),
      case do_get({Host, Port}, Url, []) of
          ok ->
              {ok, S2};
          {Error, Reason} ->
              {Error, Reason, S2}
      end;
  run(_Operation, _KeyGen, _ValueGen, State) ->
      {ok, State}.
  
  %% ====================================================================
  %% Internal functions
  %% ====================================================================
  
  insert(KeyGen, ValueGen, {Host, Port}, Bucket) ->
      Key = KeyGen(),
      Url = url(Host, Port, Bucket, Key),
      Value = ValueGen(),
      do_put({Host, Port}, Url, [], Value).
  
  url(Host, Port, Bucket, Key) ->
      UnparsedUrl = lists:concat(["http://", Host, ":", Port, "/", Bucket, "/", Key]),
  
negative.code:             end
      end.
  
  do_put(Host, Url, Headers, Value, ReportFun) ->
      case send_request(Host, Url, Headers ++ [{'Content-Type', 'application/octet-stream'}],
                        put, Value, proxy_opts()) of
          {ok, "201", _Header, _Body} ->
              {ok, ReportFun(byte_size(Value))};
          {ok, "204", _Header, _Body} ->
              {ok, ReportFun(byte_size(Value))};
          {ok, Code, _Header, _Body} ->
              {error, {http_error, Code}};
          {error, Reason} ->
  