anchor.diff:  
     String get method => _request.method;
   
  +  //----------------------------------------------------------------
  +  /// Returns the request's path as a relative path.
  +  ///
  +  /// That is, starting with "~/" (if possible), otherwise the full path is
  +  /// returned.
  +
  +  String requestPath() {
  +    var p = this.request.uri.path;
  +
  +    if (p.startsWith(_server._basePath)) {
  +      // TODO: this needs more work to account for # and ? parameters
  +
  +      if (p.length <= _server._basePath.length) p = "~/";
  +      else p = "~/" + p.substring(_server._basePath.length);
  +    } else {
  +      p = "~/";
  +    }
  +
  +    return p;
  +  }
  +
     //================================================================
     // Session
   
  
positive.code:   /// needs to explicitly delete a cookie if the session is cleared.
  
    bool _sessionWasSetInRequest;
  
    //================================================================
    /// The three different sources of parameters.
  
negative.code:       return url;
      }
    }
  
    //----------------------------------------------------------------
    /// Returns hidden form parameter input to include the session parameter.
    ///
    /// If there is no session (i.e. session is null) or cookies are being used
    /// to preserve the session, returns the empty string.
  
    String sessionFormHiddenParameter() {
      if (hasSession && !this._sessionUsingCookies) {
        // Require hidden POST form parameter to preserve session
        return "<input type=\"hidden\" name=\"" +
          HEsc.attr(_server.sessionParamName) +
            "\" value=\"" +
          HEsc.attr(session.id) +
          "\"/>";
      } else {
        return ""; // hidden POST form parameter not required
      }
    }
  }
  