anchor.diff:           allowed_methods/2,
            content_types_provided/2,
            is_authorized/2,
  +         forbidden/2,
            malformed_request/2,
            service_available/2,
            to_json/2]).
  
positive.code: %% then go to localhost:WXYZ/wmtrace
  
  service_available(Req, State) ->
      NodeName = wrq:path_info(node_name, Req),
      State1 = State#config_state{node_name = NodeName},
      {true, Req, State1}.
  
  
negative.code: 
  is_authorized(Req, State) ->
      pushy_wm_base:is_authorized(Req, State).
  
  forbidden(Req, State) ->
      forbidden(wrq:method(Req), Req, State).
  forbidden('GET', Req,
          #config_state{requestor = Requestor,
                        requestor_type = Type,
                        node_name = NodeName} = State)
          when Requestor =/= NodeName, Type =:= client ->
      case envy:get(pushy, validate_client_node_name, true, boolean) of
          true ->
              Msg = <<"Client and node name must match">>,
              Req1 = wrq:set_resp_body(jiffy:encode({[{<<"error">>, [Msg]}]}), Req),
              {true, Req1, State};
          false -> pushy_wm_base:read_forbidden(Req, State)
      end;
  forbidden('GET', Req, State) ->
      pushy_wm_base:read_forbidden(Req, State).
  
  allowed_methods(Req, State) ->
      {['GET'], Req, State}.
  