docs: protected void handleDiscrimination() {
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
              Tr.debug(tc, "Discrimination will be called");
          }
  
          // 363633 - on z/OS we need store store some information for Proxy use
          if (getChannel().getHttpConfig().runningOnZOS()) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Storing buffer size on z/OS");
              }
              getVirtualConnection().getStateMap().put(HttpConstants.HTTPReadBufferSize, Integer.valueOf(getChannel().getHttpConfig().getIncomingBodyBufferSize()));
          }
  
          // we only allow a SUCCESS or FAILURE during discrimination
          // as no application channel above us can ask for more data
          // beyond the HTTP request.
  
          ConnectionReadyCallback oldAppSide = getApplicationCallback();
  
          DiscriminationProcess dp = getChannel().getDiscriminationProcess();
          int state = DiscriminationProcess.FAILURE;
          try {
              state = dp.discriminate(getVirtualConnection(), getHTTPContext().getRequest(), this);
          } catch (Exception e) {
              // No need to do FFDC here as the discriminate method of the
              // DiscriminationProcess implementation handles FFDC already
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                  Tr.debug(tc, "Exception caught during discriminate: " + e);
              }
              // close the connection here with the exception from the DP
              setPartiallyParsed(false);
              sendErrorMessage(e);
              return;
          }
  
          // now either pass it to the application channel or close
          // the connection
  
          if (DiscriminationProcess.SUCCESS == state) {
              // if this is a new app channel, save it to the list
              if (null != oldAppSide && !getApplicationCallback().equals(oldAppSide)) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Received new appside connlink: " + oldAppSide + " vs " + getApplicationCallback());
                  }
                  // only keep unique connlinks so check to see if it exists
                  if (null == this.appSides) {
                      // add old and new
                      this.appSides = new LinkedList<ConnectionReadyCallback>();
                      this.appSides.add(oldAppSide);
                      this.appSides.add(getApplicationCallback());
                  } else {
                      // see if we need to add the new one
                      if (!this.appSides.contains(getApplicationCallback())) {
                          this.appSides.add(getApplicationCallback());
                      }
                  }
              }
              try {
                  getApplicationCallback().ready(getVirtualConnection());
              } catch (Throwable t) {
                  FFDCFilter.processException(t, "HttpInboundLink.handleDiscrimination", "1", this);
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "App side ready() threw exception: " + t);
                  }
                  if (!this.bIsActive) {
                      // close/destroy already went through on this connection
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "Link not active, returning out.");
                      }
                      return;
                  }
                  if (getHTTPContext().headersSent()) {
                      // partial message already sent, just close
                      getDeviceLink().close(getVirtualConnection(), new Exception(t));
                      return;
                  }
                  // otherwise send an error back and close
                  sendErrorMessage(StatusCodes.UNAVAILABLE);
                  return;
              }
          } else {
              // close the connection because nobody wants it
              setPartiallyParsed(false); // keep ready() from continuing
              sendErrorMessage(new Exception("Discrimination failed"));
          }
      }