code: public synchronized BufferedReader getReader()
                      throws UnsupportedEncodingException, IOException {
  
          if (TraceComponent.isAnyTracingEnabled()&&logger.isLoggable (Level.FINE)) {
              logger.logp(Level.FINE, CLASS_NAME,"getReader", "this->"+this+": gotInputStream = " + _srtRequestHelper._gotInputStream);
          }
          if (WCCustomProperties.CHECK_REQUEST_OBJECT_IN_USE){
              checkRequestObjectInUse();
          }
          // MultiRead Start
          if (this.multiReadPropertyEnabled) {
              if (_srtRequestHelper._InputStreamClosed) {
                  ((SRTInputStream) this._in).restart();
              } 
          }
          // MultiRead End
          if (_srtRequestHelper._gotInputStream){
              throw new IllegalStateException(liberty_nls.getString(  "InputStream.already.obtained", "Input Stream already obtained"));
          }
  
          if (_srtRequestHelper._reader == null) {
              _srtRequestHelper._reader =
                              new BufferedReader( new InputStreamReader(_in, getReaderEncoding()));
          }
          _srtRequestHelper._gotReader = true; // MultiRead
          if (TraceComponent.isAnyTracingEnabled()&&logger.isLoggable (Level.FINE)) {
              logger.logp(Level.FINE, CLASS_NAME,"getReader", "this->"+this+": reader = " + _srtRequestHelper._reader);
          }
          return _srtRequestHelper._reader;
      }
docs: /*
  Note for MultiRead:
  If this is the first call - register an observer to get a notification (alertClose()) when input stream is closed.
  If the is first call after alerClose, restart the input stream. This will cause a notification (alertOpen()) that the input stream has been opened.
  Any other call - no special processing.