Add BASE64CF codec

Each their own variant, *sigh*
parent bd3d4146
......@@ -96,6 +96,14 @@ varnish v1 -vcl {
set resp.http.b64urlnopadxcode =
blob.transcode(IDENTITY, BASE64URLNOPAD,
encoded=req.url + "Hello world" + req.url);
set resp.http.b64cfxcodeout =
blob.transcode(BASE64, BASE64CF,
encoded="+/Y=");
set resp.http.b64cfxcodein =
blob.transcode(BASE64CF, BASE64,
encoded="-~Y_");
}
} -start
......@@ -122,6 +130,8 @@ client c1 {
expect resp.http.b64xcode == "L0hlbGxvIHdvcmxkLw=="
expect resp.http.b64urlxcode == "L0hlbGxvIHdvcmxkLw=="
expect resp.http.b64urlnopadxcode == "L0hlbGxvIHdvcmxkLw"
expect resp.http.b64cfxcodeout == "-~Y_"
expect resp.http.b64cfxcodein == "+/Y="
} -run
varnish v1 -vcl {
......
......@@ -76,6 +76,10 @@ static const struct vmod_blob_fptr {
B64_FUNCS,
.encode_l = base64nopad_encode_l
},
[BASE64CF] = {
B64_FUNCS,
.encode_l = base64_encode_l
},
[HEX] = {
.decode_l = hex_decode_l,
.decode = hex_decode,
......
......@@ -70,6 +70,7 @@ ENUM values for an encoding scheme can be one of:
* ``BASE64``
* ``BASE64URL``
* ``BASE64URLNOPAD``
* ``BASE64CF``
* ``HEX``
* ``URL``
......@@ -141,6 +142,11 @@ The ``BASE64URLNOPAD`` encoding uses the same alphabet as
``BASE6URL``, but leaves out the padding. Thus the length of an
encoding with this scheme is not necessarily a multiple of four.
The ``BASE64CF` is similar to ``BASE64URL``, with the following
changes to ``BASE64``: ``+`` replaced with ``-``, ``/`` replaced with
``~`` and ``_`` as the padding character. It is used by a certain CDN
provider who also inspired the name.
The *case* ENUM MUST be set to ``DEFAULT`` for for all of the
``BASE64*`` encodings.
......@@ -176,8 +182,8 @@ The ``URL`` encoding implements "percent encoding" as per RFC3986. The
affect alphabetic characters that are not percent-encoded.
$Function BLOB decode(ENUM {IDENTITY, BASE64, BASE64URL, BASE64URLNOPAD,
HEX, URL} decoding="IDENTITY", INT length=0,
STRANDS encoded)
BASE64CF, HEX, URL} decoding="IDENTITY",
INT length=0, STRANDS encoded)
Returns the BLOB derived from the string *encoded* according to the
scheme specified by *decoding*.
......@@ -201,7 +207,7 @@ Example::
$Function STRING encode(ENUM {IDENTITY, BASE64, BASE64URL, BASE64URLNOPAD,
HEX, URL} encoding="IDENTITY",
BASE64CF, HEX, URL} encoding="IDENTITY",
ENUM {LOWER, UPPER, DEFAULT} case="DEFAULT", BLOB blob)
Returns a string representation of the BLOB *blob* as specified by
......@@ -230,9 +236,9 @@ Example::
= blob.encode(blob=blob.decode(encoded="foo"));
$Function STRING transcode(ENUM {IDENTITY, BASE64, BASE64URL, BASE64URLNOPAD,
HEX, URL} decoding="IDENTITY",
BASE64CF, HEX, URL} decoding="IDENTITY",
ENUM {IDENTITY, BASE64, BASE64URL, BASE64URLNOPAD,
HEX, URL} encoding="IDENTITY",
BASE64CF, HEX, URL} encoding="IDENTITY",
ENUM {LOWER, UPPER, DEFAULT} case="DEFAULT",
INT length=0, STRANDS encoded)
......@@ -303,8 +309,8 @@ default value of *offset* is ``0B``.
``offset + length`` requires more bytes than are available in the
BLOB.
$Object blob(ENUM {IDENTITY, BASE64, BASE64URL, BASE64URLNOPAD, HEX,
URL} decoding="IDENTITY",
$Object blob(ENUM {IDENTITY, BASE64, BASE64URL, BASE64URLNOPAD, BASE64CF,
HEX, URL} decoding="IDENTITY",
STRANDS encoded)
Creates an object that contains the BLOB derived from the string
......@@ -335,8 +341,8 @@ Example::
set resp.http.The-Stringblob =
blob.encode(blob=stringblob.get());
$Method STRING .encode(ENUM {IDENTITY, BASE64, BASE64URL, BASE64URLNOPAD, HEX,
URL} encoding="IDENTITY",
$Method STRING .encode(ENUM {IDENTITY, BASE64, BASE64URL, BASE64URLNOPAD,
BASE64CF, HEX,URL} encoding="IDENTITY",
ENUM {LOWER, UPPER, DEFAULT} case="DEFAULT")
Returns an encoding of BLOB created by the constructor, according to
......
......@@ -158,6 +158,45 @@ static const struct b64_alphabet {
},
0
},
[BASE64CF] = {
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef"
"ghijklmnopqrstuvwxyz0123456789-~",
{
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, 62, ILL, ILL, /* - */
52, 53, 54, 55, 56, 57, 58, 59, /* 0 - 7 */
60, 61, ILL, ILL, ILL, ILL, ILL, ILL, /* 8, 9 */
ILL, 0, 1, 2, 3, 4, 5, 6, /* A - G */
7, 8, 9, 10, 11, 12, 13, 14, /* H - O */
15, 16, 17, 18, 19, 20, 21, 22, /* P - W */
23, 24, 25, ILL, ILL, ILL, ILL, PAD, /* X, Y, Z, _ */
ILL, 26, 27, 28, 29, 30, 31, 32, /* a - g */
33, 34, 35, 36, 37, 38, 39, 40, /* h - o */
41, 42, 43, 44, 45, 46, 47, 48, /* p - w */
49, 50, 51, ILL, ILL, ILL, 63, ILL, /* x, y, z, ~*/
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
ILL, ILL, ILL, ILL, ILL, ILL, ILL, ILL,
},
'_'
}
};
#define base64_l(l) (((l) << 2) / 3)
......
......@@ -6,6 +6,7 @@
VMODENUM(BASE64)
VMODENUM(BASE64URL)
VMODENUM(BASE64URLNOPAD)
VMODENUM(BASE64CF)
VMODENUM(HEX)
VMODENUM(IDENTITY)
VMODENUM(URL)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment