Working With HTTP Headers

The plugin checks all client request headers for the Proxy-Authorization MIME field, which should contain the user name and password. The plugin’s continuation handler, auth-plugin, calls handle_dns to check the Proxy-Authorization field. The handle_dns routine uses TSHttpTxnClientReqGet and TSMimeHdrFieldFind to obtain the Proxy-Authorization field:

{
    TSMBuffer bufp;
    TSMLoc hdr_loc;
    TSMLoc field_loc;
    const char *val;
    char *user, *password;

    if (!TSHttpTxnClientReqGet (txnp, &bufp, &hdr_loc)) {
        TSError ("[basic_authorization] Couldn't retrieve client request header");
        goto done;
    }

    field_loc = TSMimeHdrFieldFind (bufp, hdr_loc,
            TS_MIME_FIELD_PROXY_AUTHORIZATION);

If the Proxy-Authorization field is present, then the plugin checks that the authentication type is “Basic”, and the user name and password are present and valid:

val = TSMimeHdrFieldValueStringGet (bufp, hdr_loc, field_loc, -1, &authval_length);
if (!val) {
    TSError ("[basic_authorization] No value in Proxy-Authorization field");
    TSHandleMLocRelease (bufp, hdr_loc, field_loc);
    TSHandleMLocRelease (bufp, TS_NULL_MLOC, hdr_loc);
    goto done;
}

if (strncmp (val, "Basic", 5) != 0) {
    TSError ("[basic_authorization] No Basic auth type in Proxy-Authorization");
    TSHandleMLocRelease (bufp, hdr_loc, field_loc);
    TSHandleMLocRelease (bufp, TS_NULL_MLOC, hdr_loc);
    goto done;
}

val += 5;
while ((*val == ' ') || (*val == '\t')) {
    val += 1;
}

user = base64_decode (val);
password = strchr (user, ':');
if (!password) {
    TSError ("[basic_authorization] No password in authorization information");
    TSfree (user);
    TSHandleMLocRelease (bufp, hdr_loc, field_loc);
    TSHandleMLocRelease (bufp, TS_NULL_MLOC, hdr_loc);
    goto done;
}
*password = '\0';
password += 1;

if (!authorized (user, password)) {
    TSError ("[basic_authorization] %s:%s not authorized", user, password);
    TSfree (user);
    TSHandleMLocRelease (bufp, hdr_loc, field_loc);
    TSHandleMLocRelease (bufp, TS_NULL_MLOC, hdr_loc);
    goto done;
}

TSfree (user);
TSHandleMLocRelease (bufp, hdr_loc, field_loc);
TSHandleMLocRelease (bufp, TS_NULL_MLOC, hdr_loc);
TSHttpTxnReenable (txnp, TS_EVENT_HTTP_CONTINUE);
return;