docs: public URLNormalizer removeDotSegments() {
          String path = toURL().getPath().trim();
  
          // (Bulleted comments are from RFC3986, section-5.2.4)
  
          // 1.  The input buffer is initialized with the now-appended path
          //     components and the output buffer is initialized to the empty
          //     string.
          StringBuilder in = new StringBuilder(path);
          StringBuilder out = new StringBuilder();
  
          // 2.  While the input buffer is not empty, loop as follows:
          while (in.length() > 0) {
  
              // A.  If the input buffer begins with a prefix of "../" or "./",
              //     then remove that prefix from the input buffer; otherwise,
              if (startsWith(in, "../")) {
                  deleteStart(in, "../");
              } else if (startsWith(in, "./")) {
                  deleteStart(in, "./");
              }
  
              // B.  if the input buffer begins with a prefix of "/./" or "/.",
              //     where "." is a complete path segment, then replace that
              //     prefix with "/" in the input buffer; otherwise,
              else if (startsWith(in, "/./")) {
                  replaceStart(in, "/./", "/");
              } else if (equalStrings(in, "/.")) {
                  replaceStart(in, "/.", "/");
              }
  
              // C.  if the input buffer begins with a prefix of "/../" or "/..",
              //     where ".." is a complete path segment, then replace that
              //     prefix with "/" in the input buffer and remove the last
              //     segment and its preceding "/" (if any) from the output
              //     buffer; otherwise,
              else if (startsWith(in, "/../")) {
                  replaceStart(in, "/../", "/");
                  removeLastSegment(out);
              } else if (equalStrings(in, "/..")) {
                  replaceStart(in, "/..", "/");
                  removeLastSegment(out);
              }
  
              // D.  if the input buffer consists only of "." or "..", then remove
              //      that from the input buffer; otherwise,
              else if (equalStrings(in, "..")) {
                  deleteStart(in, "..");
              } else if (equalStrings(in, ".")) {
                  deleteStart(in, ".");
              }
  
              // E.  move the first path segment in the input buffer to the end of
              //     the output buffer, including the initial "/" character (if
              //     any) and any subsequent characters up to, but not including,
              //     the next "/" character or the end of the input buffer.
              else {
                  int nextSlashIndex = in.indexOf("/", 1);
                  if (nextSlashIndex > -1) {
                      out.append(in.substring(0, nextSlashIndex));
                      in.delete(0, nextSlashIndex);
                  } else {
                      out.append(in);
                      in.setLength(0);
                  }
              }
          }
  
          // 3.  Finally, the output buffer is returned as the result of
          //     remove_dot_segments.
          url = StringUtils.replaceOnce(url, path, out.toString());
          return this;
      }