程序包 qhs.interfaces

接口 URIParser


  • public interface URIParser
    URIParser接口的实现类既用于分析、缓存请求URI(Request-URI),也用于URL重写(URL是URI的子集)。 qhs内置有本接口的实现类,开发人员无需开发本接口的实现类。 qhs内置的实现类可分析以下两种形式URI:

    1、scheme://[userinfo@]host[:port][path][?query]

    2、[path]?query

    上述两种形式URI由scheme、userinfo、host、port、path、query等部件构成,“[]”括住的字符、部件是可选的。

    上述的schme、userinfo、host、port、path、query等部件的构成字符遵循rfc3986的规定。

    • 方法概要

      所有方法 实例方法 抽象方法 
      修饰符和类型 方法 说明
      void clearHost()
      清除URI的host部件。
      void clearPath()
      清除URI的path部件。
      void clearPort()
      清除URI的port部件。
      void clearQuery()
      清除URI的query部件。
      void clearScheme()
      清除URI的scheme部件。
      void clearUserinfo()
      清除URI的userinfo部件。
      byte[] getHost​(boolean escaped)
      返回URI的host部件。
      int getHost​(boolean escaped, byte[] buffer, int startIndex)
      复制URI的host部件到缓存区。
      int getHostLength​(boolean escaped)
      返回URI的host部件的长度。
      java.lang.String getParsingResultString()
      返回URI的分析结果。
      byte[] getPath​(boolean escaped)
      返回URI的path部件。
      int getPath​(boolean escaped, byte[] buffer, int startIndex)
      复制URI的path部件到缓存区。
      int getPathLength​(boolean escaped)
      返回URI的path部件的长度。
      int getPathMaxLength()
      返回URI的path部件的允许最大长度。
      int getPort()
      返回URI的port部件。
      byte[] getQuery​(boolean escaped)
      返回URI的query部件。
      int getQuery​(boolean escaped, byte[] buffer, int startIndex)
      复制URI的query部件到缓存区。
      int getQueryLength​(boolean escaped)
      返回URI的query部件的长度。
      int getQueryMaxLength()
      返回URI的query部件的允许最大长度。
      byte[] getScheme()
      返回URI的scheme部件。
      int getScheme​(byte[] buffer)
      复制URI的scheme部件到缓存区。
      int getSchemeLength()
      返回URI的scheme部件的长度。
      byte[] getURI()
      返回已转义的URI。
      int getURI​(byte[] buffer)
      复制已转义的URI到buffer参数。
      int getURILength()
      返回已转义的URI的长度。
      byte[] getUserinfo​(boolean escaped)
      返回URI的userinfo部件。
      int getUserinfo​(boolean escaped, byte[] buffer, int startIndex)
      复制URI的userinfo部件到缓存区。
      int getUserinfoLength​(boolean escaped)
      返回URI的userinfo部件的长度。
      boolean isIPv4Address()
      判断URI的host部件是否属于IPv4地址。
      boolean isIPv6Address()
      判断URI的host部件是否属于IPv6地址。
      boolean isRegname()
      判断URI的host部件是否属于已注册名称。
      boolean parse​(byte[] buffer)
      分析一个URI。
      boolean parse​(byte[] buffer, int startIndex, int endIndex)
      分析一个URI。
      void parseQuery​(UFormDataListener listener, char[] tempCharBuffer)
      尝试分析属于application/x-www-form-urlencoded媒体类型的表单数据(form data)。
      boolean pathAppend​(byte[] ba, int startIndex, int endIndex)
      对URI的path部件追加数据。
      boolean pathEndsWith​(byte[] ba)
      检测URI的path部件的末端。
      boolean pathEquals​(byte[] ba)
      检测URI的path部件是否相等。
      int pathIndexOf​(int startIndex, byte[] ba)
      在URI的path部件上查找数据。
      boolean pathInsert​(int startIndex, byte[] ba)
      在URI的path部件上插入数据。
      boolean pathRemove​(int startIndex, int endIndex)
      在URI的path部件上删除数据。
      int pathReplace​(int startIndex, byte[] oldBytes, byte[] newBytes)
      尝试在URI的path部件上替换一次数据。
      boolean pathStartsWith​(byte[] ba)
      检测URI的path部件的开始。
      boolean setHost​(boolean escaped, byte[] buffer)
      对URI的host部件设置为IPv4地址、IPv6地址、已注册名称(registered name,例如:www.temp-name.cn)。
      boolean setHost​(byte[] buffer)
      对URI的host部件设置为IPv4地址、IPv6地址、已注册名称。
      boolean setPath​(boolean escaped, byte[] buffer)
      设置URI的path部件。
      boolean setPath​(boolean escaped, byte[] buffer, int length)
      设置URI的path部件。
      void setPort​(int port)
      设置URI的port部件。
      boolean setQuery​(boolean escaped, byte[] buffer)
      设置URI的query部件。
      boolean setQuery​(boolean escaped, byte[] buffer, int length)
      设置URI的query部件。
      boolean setScheme​(byte[] buffer)
      设置URI的scheme部件。
      boolean setUserinfo​(boolean escaped, byte[] buffer)
      设置URI的userinfo部件。
    • 方法详细资料

      • getSchemeLength

        int getSchemeLength()
        返回URI的scheme部件的长度。
        返回:
        URI的scheme部件的长度。
      • getScheme

        byte[] getScheme()
        返回URI的scheme部件。
        返回:
        URI的scheme部件。
      • getScheme

        int getScheme​(byte[] buffer)
        复制URI的scheme部件到缓存区。

        如果用于调用本方法的参数值设置不足以容纳URI的scheme部件,就抛出异常。

        参数:
        buffer - 用于存放scheme部件的缓存区。
        返回:
        存放在buffer参数的scheme部件的长度。
      • setScheme

        boolean setScheme​(byte[] buffer)
        设置URI的scheme部件。

        调用本方法时,本方法检测存放在buffer参数的scheme部件是否遵循rfc3986的规定。 如果遵循了rfc3986规定而且部件长度可接受,就把存放在buffer参数的scheme部件复制成为URI的scheme部件,否则就清除URI的scheme部件。

        参数:
        buffer - 存放有scheme部件的缓存区。
        返回:
        true值表示设置操作成功,false值表示设置操作失败。
      • clearScheme

        void clearScheme()
        清除URI的scheme部件。
      • getUserinfoLength

        int getUserinfoLength​(boolean escaped)
        返回URI的userinfo部件的长度。
        参数:
        escaped -

        如果escaped值为true,就返回已转义的userinfo部件的长度。

        如果escaped值为false,就返回未转义的userinfo部件的长度。

        返回:
        URI的userinfo部件的长度。
      • getUserinfo

        byte[] getUserinfo​(boolean escaped)
        返回URI的userinfo部件。
        参数:
        escaped -

        如果escaped值为true,就返回已转义的userinfo部件。

        如果escaped值为false,就返回未转义的userinfo部件。

        返回:
        URI的userinfo部件。
      • getUserinfo

        int getUserinfo​(boolean escaped,
                        byte[] buffer,
                        int startIndex)
        复制URI的userinfo部件到缓存区。
        参数:
        escaped -

        如果escaped值为true,就复制已转义的userinfo部件。

        如果escaped值为false,就复制未转义的userinfo部件。

        buffer - 用于存放userinfo部件的缓存区。如果在buffer数组上的可用空间长度小于URI的userinfo部件的长度,就抛出异常。
        startIndex - 在buffer参数存放userinfo部件的开始位置。
        返回:
        存放在buffer参数的userinfo部件的长度。
      • setUserinfo

        boolean setUserinfo​(boolean escaped,
                            byte[] buffer)
        设置URI的userinfo部件。
        参数:
        escaped -

        如果escaped值为true,就检测存放在buffer参数的userinfo部件是否遵循rfc3986的规定。 如果遵循了rfc3986的规定而且部件的长度可接受,就把存放在buffer参数的userinfo部件复制成为URI的userinfo部件,否则就清除URI的userinfo部件。

        如果escaped值为false,就尝试把存放在buffer参数的userinfo部件复制成为URI的userinfo部件, 并在复制的过程中尝试对构成userinfo部件的字符进行转义。在复制的过程中,如果发现buffer参数的userinfo部件太长,就清除URI的userinfo部件。

        buffer - 存放有userinfo部件的缓存区。
        返回:
        true值表示设置操作成功,false值表示设置操作失败。
      • clearUserinfo

        void clearUserinfo()
        清除URI的userinfo部件。
      • setHost

        boolean setHost​(boolean escaped,
                        byte[] buffer)
        对URI的host部件设置为IPv4地址、IPv6地址、已注册名称(registered name,例如:www.temp-name.cn)。
        参数:
        escaped - escaped参数不适用于IPv4地址、IPv6地址,只适用于已注册名称。

        如果escaped值为true,就检测存放在buffer参数的已注册名称是否遵循rfc3986的规定。 如果遵循了rfc3986的规定而且部件的长度可接受,就把存放在buffer参数的已注册名称复制成为URI的host部件,否则就清除URI的host部件。

        如果escaped值为false,就把存放在buffer参数的已注册名称复制成为URI的host部件, 并在复制的过程中尝试对构成host部件的字符进行转义。在复制的过程中,如果发现存放在buffer参数的host部件太长,就清除URI的host部件。

        buffer - 存放有IPv4地址、IPv6地址、已注册名称的缓存区。
        返回:
        true值表示设置操作成功,false值表示设置操作失败。
      • setHost

        boolean setHost​(byte[] buffer)
        对URI的host部件设置为IPv4地址、IPv6地址、已注册名称。 调用本方法等于调用setHost(true, buffer)。
        参数:
        buffer - 略。
        返回:
        略。
      • isIPv4Address

        boolean isIPv4Address()
        判断URI的host部件是否属于IPv4地址。
        返回:
        true值表示host部件属于IPv4地址,false值表示host部件不属于IPv4地址。
      • isIPv6Address

        boolean isIPv6Address()
        判断URI的host部件是否属于IPv6地址。
        返回:
        true值表示host部件属于IPv6地址,false值表示host部件不属于IPv6地址。
      • isRegname

        boolean isRegname()
        判断URI的host部件是否属于已注册名称。
        返回:
        true值表示host部件属于已注册名称,false值表示host部件不属于已注册名称。
      • getHostLength

        int getHostLength​(boolean escaped)
        返回URI的host部件的长度。
        参数:
        escaped -

        如果escaped值为true,就返回已转义的host部件的长度。

        如果escaped值为false,就返回未转义的host部件的长度。

        返回:
        URI的host部件的长度。
      • getHost

        byte[] getHost​(boolean escaped)
        返回URI的host部件。
        参数:
        escaped -

        如果escaped值为true,就返回已转义的host部件。

        如果escaped值为false,就返回未转义的host部件。

        返回:
        URI的host部件。
      • getHost

        int getHost​(boolean escaped,
                    byte[] buffer,
                    int startIndex)
        复制URI的host部件到缓存区。
        参数:
        escaped -

        如果escaped为true,就复制已转义的host部件。

        如果escaped为false,就复制未转义的host部件。

        buffer - 用于存放host部件的缓存区。如果在buffer数组上的可用空间长度小于URI的host部件的长度,就抛出异常。
        startIndex - 在buffer参数存放host部件的开始位置。
        返回:
        存放在buffer参数的host部件的长度。
      • clearHost

        void clearHost()
        清除URI的host部件。
      • getPort

        int getPort()
        返回URI的port部件。
        返回:
        port部件。
      • setPort

        void setPort​(int port)
        设置URI的port部件。
        参数:
        port - 端口号。
      • clearPort

        void clearPort()
        清除URI的port部件。
      • getPathLength

        int getPathLength​(boolean escaped)
        返回URI的path部件的长度。
        参数:
        escaped -

        如果escaped值为true,就返回已转义的path部件的长度。

        如果escaped值为false,就返回未转义的path部件的长度。

        返回:
        URI的path部件的长度。
      • getPath

        int getPath​(boolean escaped,
                    byte[] buffer,
                    int startIndex)
        复制URI的path部件到缓存区。
        参数:
        escaped -

        如果escaped值为true,就复制已转义的path部件。

        如果escaped值为false,就复制未转义的path部件。

        buffer - 用于存放path部件的缓存区。如果在buffer数组上的可用空间长度小于URI的path部件,就抛出异常。
        startIndex - 在buffer参数存放path部件的开始位置。
        返回:
        存放在buffer参数的path部件的长度。
      • getPath

        byte[] getPath​(boolean escaped)
        返回URI的path部件。
        参数:
        escaped -

        如果escaped值为true,就复制已转义的path部件。

        如果escaped值为false,就复制未转义的path部件。

        返回:
        URI的path部件。
      • setPath

        boolean setPath​(boolean escaped,
                        byte[] buffer,
                        int length)
        设置URI的path部件。
        参数:
        escaped -

        如果escaped值为true,就检测存放在buffer参数的path部件是否遵循rfc3986的规定。 如果遵循了rfc3986的规定而且部件的长度可接受,就把存放在buffer参数的path部件复制成为URI的path部件,否则就清除URI的path部件。

        如果escaped值为false,就把存放在buffer参数的path部件复制成为URI的path部件, 并在复制的过程中尝试对构成path部件的字符进行转义。在复制的过程中,如果发现要复制的path部件太长,就清除URI的path部件。

        URI的path部件的允许最大长度由base.xml(在qhs安装目录内部的config子目录)的PathMaxLength元素说明。

        buffer - 存放有path部件的缓存区。存放在缓存区的path部件必须是一个绝对路径。
        length - 存放在buffer参数的path部件的长度。
        返回:
        true值表示设置操作成功,false值表示设置操作失败。
      • setPath

        boolean setPath​(boolean escaped,
                        byte[] buffer)
        设置URI的path部件。 调用本方法等于调用setPath(escaped, buffer, buffer.length);
        参数:
        escaped - 略。
        buffer - 略。
        返回:
        略。
      • clearPath

        void clearPath()
        清除URI的path部件。
      • getPathMaxLength

        int getPathMaxLength()
        返回URI的path部件的允许最大长度。
        返回:
        未转义的(unescaped)path部件的允许最大长度。
      • pathEquals

        boolean pathEquals​(byte[] ba)
        检测URI的path部件是否相等。 例如:
         //以下rewrite()方法定义在URL重写器。
         public RewriteResult rewrite(ThreadContext tc, URIParser uriParser) {
            uriParser.setPath(false, "/a一b二c".getBytes());
            boolean res = false;
        
            res = uriParser.pathEquals("/a一b二c".getBytes());
            //res值等于true。
        
            res = uriParser.pathEquals("/a一b".getBytes());
            //res值等于false。
        
            return RewriteResult.RESOURCE_URL;
         }
         
        参数:
        ba - 存放未转义(unescaped)字符的数组。
        返回:
        true值表示相等,false值表示不相等。
      • pathStartsWith

        boolean pathStartsWith​(byte[] ba)
        检测URI的path部件的开始。 例如:
         //以下rewrite()方法定义在URL重写器。
         public RewriteResult rewrite(ThreadContext tc, URIParser uriParser) {
            uriParser.setPath(false, "/a一b二c".getBytes());
            boolean res = false;
        
            res = uriParser.pathStartsWith("/a一b二c".getBytes());
            //res值等于true。
        
            res = uriParser.pathStartsWith("/a一b".getBytes());
            //res值等于true。
        
            res = uriParser.pathStartsWith("/".getBytes());
            //res值等于true。
        
            res = uriParser.pathStartsWith("/abc".getBytes());
            //res值等于false。
        
            return RewriteResult.RESOURCE_URL;
         }
         
        参数:
        ba - 存放未转义(unescaped)字符的数组。
        返回:
        true值表示相等,false值表示不相等。
      • pathEndsWith

        boolean pathEndsWith​(byte[] ba)
        检测URI的path部件的末端。 例如:
         //以下rewrite()方法定义在URL重写器。
         public RewriteResult rewrite(ThreadContext tc, URIParser uriParser) {
            uriParser.setPath(false, "/a一b二c".getBytes());
            boolean res = false;
        
            res = uriParser.pathEndsWith("/a一b二c".getBytes());
            //res值等于true。
        
            res = uriParser.pathEndsWith("b二c".getBytes());
            //res值等于true。
        
            res = uriParser.pathEndsWith("c".getBytes());
            //res值等于true。
        
            res = uriParser.pathEndsWith("abc".getBytes());
            //res值等于false。
        
            res = uriParser.pathEndsWith("/a一b二cdef".getBytes());
            //res值等于false。
        
            return RewriteResult.RESOURCE_URL;
         }
         
        参数:
        ba - 存放未转义(unescaped)字符的数组。
        返回:
        true值表示相等,false值表示不相等。
      • pathIndexOf

        int pathIndexOf​(int startIndex,
                        byte[] ba)
        在URI的path部件上查找数据。 例如:
         //以下rewrite()方法定义在URL重写器。
         public RewriteResult rewrite(ThreadContext tc, URIParser uriParser) {
            uriParser.setPath(false, "/a一b二c三d四e五".getBytes());
            int res = 0;
        
            res = uriParser.pathIndexOf(0, "/a一b二c".getBytes());
            //res值等于0。
        
            res = uriParser.pathIndexOf(0, "b二c三".getBytes());
            //res值等于5。
        
            res = uriParser.pathIndexOf(5, "b二c三".getBytes());
            //res值等于5。
        
            res = uriParser.pathIndexOf(6, "b二c三".getBytes());
            //res值等于-1。
        
            res = uriParser.pathIndexOf(7, "b二c三".getBytes());
            //res值等于-1。
        
            return RewriteResult.RESOURCE_URL;
         }
         
        参数:
        startIndex - 在未转义的path部件上执行查找操作的开始位置。
        ba - 存放未转义(unescaped)字符的数组,即被查找的数据。
        返回:
        -1值表示找不到,而其它返回值(返回值等于大于0)等于被查找字符数组所在的位置。
      • pathReplace

        int pathReplace​(int startIndex,
                        byte[] oldBytes,
                        byte[] newBytes)
        尝试在URI的path部件上替换一次数据。 例如:
         //以下rewrite()方法定义在URL重写器。
         public RewriteResult rewrite(ThreadContext tc, URIParser uriParser) {
            final byte[] pathBa = "/a一b二c三a一b二c三".getBytes();
            int res = 0;
            String str = null;
        
            uriParser.setPath(false, pathBa);
            res = uriParser.pathReplace(0, "b二c".getBytes(), "e四".getBytes());
            str = new String(uriParser.getPath(false));
            //res值等于5。
            //str值等于"/a一e四三a一b二c三"。
        
            uriParser.setPath(false, pathBa);
            res = uriParser.pathReplace(8, "b二c".getBytes(), "e四".getBytes());
            str = new String(uriParser.getPath(false));
            //res值等于17。
            //str值等于"/a一b二c三a一e四三"。
        
            uriParser.setPath(false, pathBa);
            res = uriParser.pathReplace(0, "/a一b二c三a一b二c三".getBytes(), "/".getBytes());
            str = new String(uriParser.getPath(false));
            //res值等于0。
            //str值等于"/"。
        
            uriParser.setPath(false, pathBa);
            res = uriParser.pathReplace(8, "/a一b".getBytes(), "e四".getBytes());
            str = new String(uriParser.getPath(false));
            //res值等于-1,如果执行了替换操作,导致path部件不能形成绝对路径。
            //str值等于"/a一b二c三a一b二c三"。
        
            return RewriteResult.RESOURCE_URL;
         }
         
        参数:
        startIndex - 在未转义的path部件上执行查找操作的开始位置。
        oldBytes - 被替换的旧数据。
        newBytes - 用于替换旧数据的新数据。
        返回:
        -1值表示替换操作失败,而其它返回值(返回值等于大于0)等于替换了旧数据所在的位置。
      • pathAppend

        boolean pathAppend​(byte[] ba,
                           int startIndex,
                           int endIndex)
        对URI的path部件追加数据。 例如:
         //以下rewrite()方法定义在URL重写器。
         public RewriteResult rewrite(ThreadContext tc, URIParser uriParser) {
            boolean res = false;
            String str = null;
            byte[] ba = "/a一b二c三d四e五".getBytes();//1个汉字由3个UTF-8字节编码。
        
            uriParser.clearPath();
            res = uriParser.pathAppend(ba, 0, 5);
            str = new String(uriParser.getPath(false));
            //res值等于true。
            //str值等于"/a一"。
        
            res = uriParser.pathAppend(ba, 13, 21);
            str = new String(uriParser.getPath(false));
            //res值等于true。
            //str值等于"/a一d四e五"。
        
            uriParser.clearPath();
            res = uriParser.pathAppend(ba, 13, 21);
            str = new String(uriParser.getPath(false));
            //res值等于false,如果执行了追加数据,导致path部件不能形成绝对路径。
            //str值等于""。
        
            return RewriteResult.RESOURCE_URL;
         }
         
        参数:
        ba - 存放未转义(unescaped)字符的数组。
        startIndex - 在ba数组上的追加数据的开始位置。
        endIndex - 在ba数组上的追加数据的结束位置。
        返回:
        true值表示追加操作是成功的,false值表示没有执行追加操作。
      • pathRemove

        boolean pathRemove​(int startIndex,
                           int endIndex)
        在URI的path部件上删除数据。 例如:
         //以下rewrite()方法定义在URL重写器。
         public RewriteResult rewrite(ThreadContext tc, URIParser uriParser) {
            boolean res = false;
            String str = null;
            byte[] ba = "/a一b二c三d四e五".getBytes();//1个汉字由3个UTF-8字节编码。
        
            uriParser.clearPath();
            uriParser.setPath(false, ba);
            res = uriParser.pathRemove(9, ba.length);
            str = new String(uriParser.getPath(false));
            //res值等于true。
            //str值等于"/a一b二"。
        
            uriParser.clearPath();
            uriParser.setPath(false, ba);
            res = uriParser.pathRemove(0, 5);
            str = new String(uriParser.getPath(false));
            //res值等于false,如果执行了删除操作,导致path部件不能形成绝对路径。
            //str值等于"/a一b二c三d四e五"。
        
            return RewriteResult.RESOURCE_URL;
         }
         
        参数:
        startIndex - 在未转义的path部件上执行删除操作的开始位置。
        endIndex - 在未转义的path部件上执行删除操作的结束位置。
        返回:
        true值表示删除操作是成功的,false值表示没有执行删除操作。
      • pathInsert

        boolean pathInsert​(int startIndex,
                           byte[] ba)
        在URI的path部件上插入数据。 例如:
         //以下rewrite()方法定义在URL重写器。
         public RewriteResult rewrite(ThreadContext tc, URIParser uriParser) {
            boolean res = false;
            String str = null;
            byte[] ba = "/a一b二c".getBytes();//1个汉字由3个UTF-8字节编码。
        
            uriParser.clearPath();
            uriParser.setPath(false, ba);
            res = uriParser.pathInsert(9, "三d四e五".getBytes());
            str = new String(uriParser.getPath(false));
            //res值等于true。
            //str值等于"/a一b二三d四e五c"。
        
            uriParser.clearPath();
            uriParser.setPath(false, ba);
            res = uriParser.pathInsert(0, "三d四e五".getBytes());
            str = new String(uriParser.getPath(false));
            //res值等于false,如果执行了插入操作,导致path部件不能形成绝对路径。
            //str值等于"/a一b二c"。
        
            return RewriteResult.RESOURCE_URL;
         }
         
        参数:
        startIndex - 在未转义的path部件上执行插入操作的开始位置。
        ba - 存放未转义(unescaped)字符的数组,即要插入的数据。
        返回:
        true值表示插入操作是成功的,false值表示没有执行插入操作。
      • getQueryLength

        int getQueryLength​(boolean escaped)
        返回URI的query部件的长度。
        参数:
        escaped -

        如果escaped值为true,就返回已转义的query部件的长度。

        如果escaped值为false,就返回未转义的query部件的长度。

        返回:
        URI的query部件的长度。
      • getQuery

        int getQuery​(boolean escaped,
                     byte[] buffer,
                     int startIndex)
        复制URI的query部件到缓存区。
        参数:
        escaped -

        如果escaped值为true,就复制已转义的query部件。

        如果escaped值为false,就复制未转义的query部件。

        buffer - 用于存放query部件的缓存区。如果在buffer数组上的可用空间长度小于URI的query部件,就抛出异常。
        startIndex - 在buffer参数存放query部件的开始位置。
        返回:
        存放在buffer参数的query部件的长度。
      • getQuery

        byte[] getQuery​(boolean escaped)
        返回URI的query部件。
        参数:
        escaped -

        如果escaped值为true,就返回已转义的query部件。

        如果escaped值为false,就返回未转义的query部件。

        返回:
        URI的query部件。
      • setQuery

        boolean setQuery​(boolean escaped,
                         byte[] buffer,
                         int length)
        设置URI的query部件。
        参数:
        escaped -

        如果escaped值为true,就检测存放在buffer参数的query部件是否遵循rfc3986的规定。 如果遵循了rfc3986的规定而且部件的长度可接受,就把存放在buffer参数的query部件复制成为URI的query部件,否则就清除URI的query部件。

        如果escaped值为false,就把存放在buffer参数的query部件复制成为URI的query部件, 并在复制的过程中尝试对构成query部件的字符进行转义。在复制的过程中,如果发现要复制的query部件太长,就清除URI的query部件。

        URI的query部件的允许最大长度由base.xml(在qhs安装目录内部的config子目录)的QueryMaxLength元素说明。

        buffer - 存放有query部件的缓存区。
        length - 存放在buffer参数的query部件的长度。
        返回:
        true值表示设置操作成功,false值表示设置操作失败。
      • setQuery

        boolean setQuery​(boolean escaped,
                         byte[] buffer)
        设置URI的query部件。 调用本方法等于调用setQuery(escaped, buffer, buffer.length)。
        参数:
        escaped - 略。
        buffer - 略。
        返回:
        略。
      • clearQuery

        void clearQuery()
        清除URI的query部件。
      • getQueryMaxLength

        int getQueryMaxLength()
        返回URI的query部件的允许最大长度。
        返回:
        已转义的(escaped)query部件的允许最大长度。
      • parseQuery

        void parseQuery​(UFormDataListener listener,
                        char[] tempCharBuffer)
                 throws java.lang.Exception
        尝试分析属于application/x-www-form-urlencoded媒体类型的表单数据(form data)。

        本方法把URI的query部件当作为application/x-www-form-urlencoded媒体类型的表单数据, 并且创建、调用application/x-www-form-urlencoded媒体类型数据分析器对表单数据进行分析。

        参数:
        listener - 一个监听器,监听器用于接收来自数据分析器的事件。
        tempCharBuffer - 略。
        抛出:
        java.lang.Exception - URI的query部件不符合application/x-www-form-urlencoded媒体类型数据格式。
      • parse

        boolean parse​(byte[] buffer,
                      int startIndex,
                      int endIndex)
        分析一个URI。
        参数:
        buffer - 存放有URI的缓存区。
        startIndex - 存放在buffer参数的URI的开始位置。
        endIndex - 存放在buffer参数的URI的结束位置。例如:
         //以下rewrite()方法定义在URL重写器。
         public RewriteResult rewrite(ThreadContext tc, URIParser uriParser) {
            boolean res = false;
            String str = null;
            String url = "http://www.temp-name.com/abc.html";
        
            res = uriParser.parse(url.getBytes(), 0, url.length());
            str = new String(uriParser.getURI());
            //res值等于true。
            //str值等于"http://www.temp-name.com/abc.html"。
        
            res = uriParser.parse(("abcde" + url).getBytes(), 5, 5 + url.length());
            str = new String(uriParser.getURI());
            //res值等于true。
            //str值等于"http://www.temp-name.com/abc.html"。
        
            return RewriteResult.RESOURCE_URL;
         }
         
        返回:
        true值表示分析操作成功,false值表示分析操作失败。
      • parse

        boolean parse​(byte[] buffer)
        分析一个URI。 调用本方法等于调用parse(buffer, 0, buffer.length)。
        参数:
        buffer - 略。
        返回:
        略。
      • getURILength

        int getURILength()
        返回已转义的URI的长度。
        返回:
        URI的长度。
      • getURI

        byte[] getURI()
        返回已转义的URI。
        返回:
        一个URI。
      • getURI

        int getURI​(byte[] buffer)
        复制已转义的URI到buffer参数。
        参数:
        buffer - 用于存放URI的缓存区。如果在buffer参数上的空白空间不足以容纳整个URI,就抛出异常。
        返回:
        存放在buffer参数的URI的长度。