anchor.diff:      Body = lists:nthtail(H + 3, Resp),
       case string:tokens(Resp, "\r\n") of
           ["HTTP/1.1 201" ++ _|_] ->
  -            {ok, Body};
  +            {ok, list_to_binary(Body)};
           ["HTTP/1.1 " ++ Code|_] ->
  -            {error, list_to_integer(string:sub_word(Code, 1, 32)), Body};
  +            {error, {list_to_integer(string:sub_word(Code, 1, 32)), Body}};
           _ ->
               {error, invalid_response}
       end.
  
positive.code:             S = self(),
              spawn_link(fun() -> http_put_conn(SrcPath, DstUrl, S) end),
              receive
                  ok -> P ! {S, ddfs_util, ok}, ok;
                  {'EXIT', _, _} ->
                      P ! {S, ddfs_util, {error, crashed}}, ok;
                  E -> P ! {S, ddfs_util, E}, ok
              after Timeout ->
                  P ! {S, ddfs_util, {error, timeout}}, ok
              end,
              exit(die)
          end),
      receive
          {Pid, ddfs_util, Reply} -> Reply
      end.
  
  -spec http_put_conn(nonempty_string(), nonempty_string(), pid()) -> _.
  http_put_conn(SrcPath, DstUrl, Parent) ->
      {_, Addr, Path, _, _} = mochiweb_util:urlsplit(lists:flatten(DstUrl)),
      {Host, Port} = parse_host(Addr),
  
negative.code:     send_body(Socket, IO).
  
  -spec read_response(port()) ->
      {'error', term()} | {'ok', binary()}.
  read_response(Socket) ->
      {ok, RBin} = recv_all(Socket),
      Resp = binary_to_list(RBin),
  