anchor.diff:      uri(URI, []).
   
   uri(URI, Headers) ->
  -    State = request2(URI, Headers),
  +    uri(URI, Headers, #state{}).
  +
  +uri(URI, Headers, State) ->
  +    State1 = request2(URI, Headers, State),
       Var = otis_var:parse("$(URI)"),
  -    {_, Result} = otis_var:expand(State, Var),
  +    {_, Result} = otis_var:expand(State1, Var),
       lists:flatten(Result).
   
   request(URI) ->
       request(URI, []).
   
   request(URI, Headers) ->
  -    State = request2(URI, Headers),
  +    request(URI, Headers, #state{}).
  +
  +request(URI, Headers, State) ->
  +    State1 = request2(URI, Headers, State),
       Var = otis_var:parse("$(RESULT)"),
  -    {_, Result} = otis_var:expand(State, Var),
  +    {_, Result} = otis_var:expand(State1, Var),
       lists:flatten(Result).
   
  -request2(URI, Headers) ->
  +request2(URI, Headers, State) ->
       {Scheme, Host, Port, Path, Query} = otis_utils:parse_uri(URI),
       Server_IP = otis_utils:server_ip(Host),
       Headers1  = [
         {string:to_lower(H), V, undefined, undefined}
         || {H, V} <- Headers
       ],
  -    State = #state{
  +    State1 = State#state{
         server_name = Host,
         server_ip   = Server_IP,
         server_port = Port,
  
positive.code: -export([
      uri/1,
      uri/2,
      request/1,
      request/2,
      eval/1,
      call_rule/2,
      conf/0,
  
negative.code:       headers     = Headers1,
        query_str   = Query
      },
      State2 = case otis_var:get_header(State1, "host") of
          {_, undefined} ->
              Host1 = otis_utils:format_host(Scheme, Host, Port),
              otis_var:set_header(State1, "host", Host1);
          _ ->
              State1
      end,
      eval(State2).
  
  eval(State) ->
      ?FIRST_RULE(State).
  