code: public static String addEncodedPaths(String p1, String p2) {
          if (p1 == null || p1.length() == 0) {
              if (p1 != null && p2 == null)
                  return p1;
              return p2;
          }
          if (p2 == null || p2.length() == 0)
              return p1;
  
          int split = p1.indexOf(';');
          if (split < 0)
              split = p1.indexOf('?');
          if (split == 0)
              return p2 + p1;
          if (split < 0)
              split = p1.length();
  
          StringBuilder buf = new StringBuilder(p1.length() + p2.length() + 2);
          buf.append(p1);
  
          if (buf.charAt(split - 1) == '/') {
              if (p2.startsWith(URIUtils.SLASH)) {
                  buf.deleteCharAt(split - 1);
                  buf.insert(split - 1, p2);
              } else
                  buf.insert(split, p2);
          } else {
              if (p2.startsWith(URIUtils.SLASH))
                  buf.insert(split, p2);
              else {
                  buf.insert(split, '/');
                  buf.insert(split + 1, p2);
              }
          }
  
          return buf.toString();
      }
docs: Add two encoded URI path segments.
  Handles null and empty paths, path and query params
  (eg ?a=b or ;JSESSIONID=xxx) and avoids duplicate '/'
  
  @param p1 URI path segment (should be encoded)
  @param p2 URI path segment (should be encoded)
  @return Legally combined path segments.