code: private void parseURI(byte[] data, int start) {
          // at this point, we're parsing /URI [?querystring]
          if (start >= data.length) {
              // PK22096 - default to "/" if not found, should have caught empty
              // string inputs previously (http://host:port is valid)
              this.myURIBytes = SLASH;
              if (tc.isDebugEnabled()) {
                  Tr.debug(tc, "Defaulting to slash since no URI data found");
              }
              return;
          }
          int uri_end = data.length;
          for (int i = start; i < data.length; i++) {
              // look for the query string marker
              if ('?' == data[i]) {
                  uri_end = i;
                  break;
              }
          }
          // save off the URI
          if (start == uri_end) {
              // no uri found
              throw new IllegalArgumentException("Missing URI: " + GenericUtils.getEnglishString(data));
          }
          if (0 == start && uri_end == data.length) {
              this.myURIBytes = data;
          } else {
              this.myURIBytes = new byte[uri_end - start];
              System.arraycopy(data, start, this.myURIBytes, 0, this.myURIBytes.length);
              uri_end++; // jump past the '?'
              if (uri_end < data.length) {
                  // save off the query string data
                  byte[] query = new byte[data.length - uri_end];
                  System.arraycopy(data, uri_end, query, 0, query.length);
                  setQueryString(query);
              }
          }
      }
docs: Parse the URI information out of the input data, along with any query
  information found afterwards. If format errors are found, then an
  exception is thrown.
  
  @param data
  @param start
  @throws IllegalArgumentException