Request constructor
      
      Request(
    
- HttpRequest hReq,
 - String id,
 - Server server
 
Constructor
Creates a Woomera Request from a HttpRequest.
This is only used internally, when the Woomera server receives a HTTP request.
Implementation
Request(HttpRequest hReq, String id, Server server)
    : _id = id,
      _server = server,
      _coreRequest = _CoreRequestReal(hReq),
      _coreResponse = _CoreResponseReal(hReq.response) {
  _logRequest.fine(
      '[$id] ${_coreRequest.method} ${_coreRequest.internalPath(server._basePath)}');
  _logRequestHeader.finer(() {
    // Log request
    final buf = StringBuffer('[$id] HTTP headers:');
    _coreRequest.headers.forEach((name, values) {
      buf.write('\n  $name: ');
      if (values.isEmpty) {
        buf.write('<noValue>');
      } else if (values.length == 1) {
        buf.write('${values[0]}');
      } else {
        var index = 1;
        for (var v in values) {
          buf.write('\n  [${index++}] $v');
        }
      }
    });
    return buf.toString();
  });
  // Check length of URI does not exceed limits
  var length = hReq.uri.path.length;
  if (hReq.uri.hasQuery) {
    length += hReq.uri.query.length;
  }
  if (hReq.uri.hasFragment) {
    length += hReq.uri.fragment.length;
  }
  if (server.urlMaxSize < length) {
    throw PathTooLongException();
  }
  // Set queryParams from the request
  // Do not use uri.queryParams, because it does not handle repeating keys.
  queryParams = RequestParams._fromQueryString(hReq.uri.query);
  // Determine method used for maintaining (future) sessions
  if (_coreRequest.cookies.isNotEmpty) {
    _sessionUsingCookies = true; // got cookies, so browser must support them
  } else {
    // Cannot detect from HTTP request whether cookies are supported or not.
    // Use default setting from server.
    _sessionUsingCookies = _server.sessionCookieAlways;
  }
  _constructorCommon();
}