static int cache_control_remove(request_rec *r, const char *cc_header,
        apr_table_t *headers)
{
    char *last, *slast, *sheader;
    int found = 0;

    if (cc_header) {
        apr_status_t rv;
        char *header = apr_pstrdup(r->pool, cc_header), *token, *arg;
        for (rv = cache_strqtok(header, &token, &arg, &last);
             rv == APR_SUCCESS;
             rv = cache_strqtok(NULL, &token, &arg, &last)) {
            if (!arg) {
                continue;
            }

            switch (token[0]) {
            case 'n':
            case 'N':
                if (!ap_cstr_casecmp(token, "no-cache")) {
                    for (rv = cache_strqtok(arg, &sheader, NULL, &slast);
                         rv == APR_SUCCESS;
                         rv = cache_strqtok(NULL, &sheader, NULL, &slast)) {
                        apr_table_unset(headers, sheader);
                    }
                    found = 1;
                }
                break;

            case 'p':
            case 'P':
                if (!ap_cstr_casecmp(token, "private")) {
                    for (rv = cache_strqtok(arg, &sheader, NULL, &slast);
                         rv == APR_SUCCESS;
                         rv = cache_strqtok(NULL, &sheader, NULL, &slast)) {
                        apr_table_unset(headers, sheader);
                    }
                    found = 1;
                }
                break;
            }
        }
    }

    return found;
}