code: protected Features getFeaturesFromRequest(HttpServletRequest request, boolean versionError) throws IOException {
  		final String sourceMethod = "getFeaturesFromRequest"; //$NON-NLS-1$
  		boolean isTraceLogging = log.isLoggable(Level.FINER);
  		if (isTraceLogging) {
  			log.entering(sourceClass, sourceMethod, new Object[]{request, versionError});
  		}
  		StringBuffer sb = request.getRequestURL();
  		if (sb != null && request.getQueryString() != null) {
  			sb.append("?").append(request.getQueryString()); //$NON-NLS-1$
  		}
  		Features defaultFeatures = getAggregator().getConfig().getDefaultFeatures(sb != null ? sb.toString() : null);
  		Features features = null;
  		if (!versionError) {		// don't trust feature encoding if version changed
  			features = getFeaturesFromRequestEncoded(request, defaultFeatures);
  		}
  		if (features == null) {
  			features = new Features(defaultFeatures);
  			String has  = getHasConditionsFromRequest(request);
  			if (has != null) {
  				for (String s : has.split("[;,*]")) { //$NON-NLS-1$
  					boolean value = true;
  					if (s.startsWith("!")) { //$NON-NLS-1$
  						s = s.substring(1);
  						value = false;
  					}
  					features.put(s, value);
  				}
  			}
  		}
  		if (isTraceLogging) {
  			log.exiting(sourceClass, sourceMethod, features);
  		}
  		return features.unmodifiableFeatures();
  	}
docs: Returns a map containing the has-condition/value pairs specified in the request
  
  @param request
  The http request object
  @param versionError
  True if a version error was detected.
  @return The map containing the has-condition/value pairs.
  @throws IOException