All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.codehaus.httpcache4j.util.AuthDirectivesParser Maven / Gradle / Ivy

The newest version!
package org.codehaus.httpcache4j.util;

import org.codehaus.httpcache4j.AuthDirective;
import org.codehaus.httpcache4j.Directive;
import org.codehaus.httpcache4j.Directives;
import org.codehaus.httpcache4j.Parameter;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * Copied from Abdera 2, and then adapted to use.
 *
 */
public final class AuthDirectivesParser {

    private final static String TOKEN = "[\\!\\#\\$\\%\\&\\'\\*\\+\\-\\.\\^\\_\\`\\|\\~a-zA-Z0-9]+";
    private final static String B64 = "([a-zA-Z0-9\\-\\.\\_\\~\\+\\/]+\\=*)";
    private final static String PARAM = TOKEN+"\\s*=\\s*(?:(?:\"(?:(?:\\Q\\\"\\E)|[^\"])*\")|(?:"+TOKEN+"))";
    private final static String PARAMS = "\\s*,?\\s*(" + PARAM + "(?:\\s*,\\s*(?:"+PARAM+")?)*)";
    private final static String B64orPARAM = "(?:" + PARAMS + "|" + B64 + ")";
    private final static String PATTERN = "("+TOKEN+")(?:\\s*" + B64orPARAM + ")?";
    private final static Pattern pattern =
            Pattern.compile(PATTERN);
    private final static Pattern param =
            Pattern.compile("(" + PARAM + ")");


    public static Directives parse(String challenge) {
        Matcher matcher = pattern.matcher(Objects.requireNonNull(challenge));
        List challenges = new ArrayList<>();
        while (matcher.find()) {
            String scheme = matcher.group(1);
            String params = matcher.group(2);
            params = params != null ? params.replaceAll(",\\s*,", ",").replaceAll(",\\s*,", ",") : null;
            String b64token = matcher.group(3);
            List parameters = new ArrayList<>();
            if (params != null) {
                Matcher mparams = param.matcher(params);
                while(mparams.find()) {
                    String p = mparams.group(1);
                    String[] ps = p.split("\\s*=\\s*", 2);
                    String name = ps[0];
                    if (name.charAt(name.length()-1)=='*')
                        name = name.substring(0,name.length()-1);
                    parameters.add(DirectivesParser.createParameter(name, ps[1]));
                }
            }
            challenges.add(new AuthDirective(scheme, b64token, parameters));
        }
        return new Directives(challenges);
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy