initial commits
parent
a421524de5
commit
c2d871f6e0
|
@ -0,0 +1,9 @@
|
||||||
|
package rfc3986
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sourcecode.social/reiver/go-erorr"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
errNilWriter = erorr.Error("rfc3986: nil writer")
|
||||||
|
)
|
5
go.mod
5
go.mod
|
@ -2,4 +2,7 @@ module sourcecode.social/reiver/go-rfc3986
|
||||||
|
|
||||||
go 1.20
|
go 1.20
|
||||||
|
|
||||||
require sourcecode.social/reiver/go-rfc2234 v0.0.0-20231006162118-904bbffee7e4 // indirect
|
require (
|
||||||
|
sourcecode.social/reiver/go-erorr v0.0.0-20230922202459-231149d185a1 // indirect
|
||||||
|
sourcecode.social/reiver/go-rfc2234 v0.0.0-20231006162118-904bbffee7e4 // indirect
|
||||||
|
)
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -1,3 +1,5 @@
|
||||||
|
sourcecode.social/reiver/go-erorr v0.0.0-20230922202459-231149d185a1 h1:wpnz4JicQBLWrgGphYBls7DysIFCcnWgDz/vce/sY8E=
|
||||||
|
sourcecode.social/reiver/go-erorr v0.0.0-20230922202459-231149d185a1/go.mod h1:NFtd7fzEf0r6A6R7JXYZfayRhPaJy0zt/18VWoLzrxA=
|
||||||
sourcecode.social/reiver/go-rfc2234 v0.0.0-20231004090151-ce553a7c22a5 h1:wCAZmyemJDcwkPVs4rODF+kDtgnvtPLLymwGjdJTGO0=
|
sourcecode.social/reiver/go-rfc2234 v0.0.0-20231004090151-ce553a7c22a5 h1:wCAZmyemJDcwkPVs4rODF+kDtgnvtPLLymwGjdJTGO0=
|
||||||
sourcecode.social/reiver/go-rfc2234 v0.0.0-20231004090151-ce553a7c22a5/go.mod h1:EuJSji3zbYdlUu4hhW8Zs300SMcn7+7z3YqM5ZZNAyo=
|
sourcecode.social/reiver/go-rfc2234 v0.0.0-20231004090151-ce553a7c22a5/go.mod h1:EuJSji3zbYdlUu4hhW8Zs300SMcn7+7z3YqM5ZZNAyo=
|
||||||
sourcecode.social/reiver/go-rfc2234 v0.0.0-20231006162118-904bbffee7e4 h1:9Ky4s8gKOCLZcAZnyd20eg61rcNI24Q3Ez1TuszC9DY=
|
sourcecode.social/reiver/go-rfc2234 v0.0.0-20231006162118-904bbffee7e4 h1:9Ky4s8gKOCLZcAZnyd20eg61rcNI24Q3Ez1TuszC9DY=
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
package rfc3986
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
)
|
||||||
|
|
||||||
|
func WritePctEncodedByte(writer io.Writer, b byte) error {
|
||||||
|
if nil == writer {
|
||||||
|
return errNilWriter
|
||||||
|
}
|
||||||
|
|
||||||
|
var buffer [3]byte = [3]byte{'%','.','.'}
|
||||||
|
|
||||||
|
{
|
||||||
|
var x byte = ((b>>4) % 16)
|
||||||
|
|
||||||
|
if x < 10 {
|
||||||
|
x += '0'
|
||||||
|
} else {
|
||||||
|
x += ('A' - 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer[1] = x
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
var x byte = (b & 0x0f)
|
||||||
|
|
||||||
|
if x < 10 {
|
||||||
|
x += '0'
|
||||||
|
} else {
|
||||||
|
x += ('A' - 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer[2] = x
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := writer.Write(buffer[:])
|
||||||
|
return err
|
||||||
|
}
|
|
@ -0,0 +1,419 @@
|
||||||
|
package rfc3986_test
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"sourcecode.social/reiver/go-rfc3986"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestWritePctEncodedByte(t *testing.T) {
|
||||||
|
|
||||||
|
tests := []struct{
|
||||||
|
Value byte
|
||||||
|
Expected string
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
Value: 0,
|
||||||
|
Expected: "%00",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 1,
|
||||||
|
Expected: "%01",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 2,
|
||||||
|
Expected: "%02",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 3,
|
||||||
|
Expected: "%03",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 4,
|
||||||
|
Expected: "%04",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 5,
|
||||||
|
Expected: "%05",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 6,
|
||||||
|
Expected: "%06",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 7,
|
||||||
|
Expected: "%07",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 8,
|
||||||
|
Expected: "%08",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 9,
|
||||||
|
Expected: "%09",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 10,
|
||||||
|
Expected: "%0A",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 11,
|
||||||
|
Expected: "%0B",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 12,
|
||||||
|
Expected: "%0C",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 13,
|
||||||
|
Expected: "%0D",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 14,
|
||||||
|
Expected: "%0E",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 15,
|
||||||
|
Expected: "%0F",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 16,
|
||||||
|
Expected: "%10",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 17,
|
||||||
|
Expected: "%11",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 18,
|
||||||
|
Expected: "%12",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 19,
|
||||||
|
Expected: "%13",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 20,
|
||||||
|
Expected: "%14",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 21,
|
||||||
|
Expected: "%15",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 22,
|
||||||
|
Expected: "%16",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 23,
|
||||||
|
Expected: "%17",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 24,
|
||||||
|
Expected: "%18",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 25,
|
||||||
|
Expected: "%19",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 26,
|
||||||
|
Expected: "%1A",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 27,
|
||||||
|
Expected: "%1B",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 28,
|
||||||
|
Expected: "%1C",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 29,
|
||||||
|
Expected: "%1D",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 30,
|
||||||
|
Expected: "%1E",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 31,
|
||||||
|
Expected: "%1F",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 32,
|
||||||
|
Expected: "%20",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 33,
|
||||||
|
Expected: "%21",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 34,
|
||||||
|
Expected: "%22",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 35,
|
||||||
|
Expected: "%23",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 36,
|
||||||
|
Expected: "%24",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 37,
|
||||||
|
Expected: "%25",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 38,
|
||||||
|
Expected: "%26",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 39,
|
||||||
|
Expected: "%27",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 40,
|
||||||
|
Expected: "%28",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 41,
|
||||||
|
Expected: "%29",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 42,
|
||||||
|
Expected: "%2A",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 43,
|
||||||
|
Expected: "%2B",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 44,
|
||||||
|
Expected: "%2C",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 45,
|
||||||
|
Expected: "%2D",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 46,
|
||||||
|
Expected: "%2E",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 47,
|
||||||
|
Expected: "%2F",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 48,
|
||||||
|
Expected: "%30",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Value: 143,
|
||||||
|
Expected: "%8F",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 144,
|
||||||
|
Expected: "%90",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 145,
|
||||||
|
Expected: "%91",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 146,
|
||||||
|
Expected: "%92",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 147,
|
||||||
|
Expected: "%93",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 148,
|
||||||
|
Expected: "%94",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 149,
|
||||||
|
Expected: "%95",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 150,
|
||||||
|
Expected: "%96",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 151,
|
||||||
|
Expected: "%97",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 152,
|
||||||
|
Expected: "%98",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 153,
|
||||||
|
Expected: "%99",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 154,
|
||||||
|
Expected: "%9A",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 155,
|
||||||
|
Expected: "%9B",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 156,
|
||||||
|
Expected: "%9C",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 157,
|
||||||
|
Expected: "%9D",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 158,
|
||||||
|
Expected: "%9E",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 159,
|
||||||
|
Expected: "%9F",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 160,
|
||||||
|
Expected: "%A0",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 161,
|
||||||
|
Expected: "%A1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 162,
|
||||||
|
Expected: "%A2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 163,
|
||||||
|
Expected: "%A3",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 164,
|
||||||
|
Expected: "%A4",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 165,
|
||||||
|
Expected: "%A5",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 166,
|
||||||
|
Expected: "%A6",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 167,
|
||||||
|
Expected: "%A7",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 168,
|
||||||
|
Expected: "%A8",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 169,
|
||||||
|
Expected: "%A9",
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
Value: 240,
|
||||||
|
Expected: "%F0",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 241,
|
||||||
|
Expected: "%F1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 242,
|
||||||
|
Expected: "%F2",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 243,
|
||||||
|
Expected: "%F3",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 244,
|
||||||
|
Expected: "%F4",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 245,
|
||||||
|
Expected: "%F5",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 246,
|
||||||
|
Expected: "%F6",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 247,
|
||||||
|
Expected: "%F7",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 248,
|
||||||
|
Expected: "%F8",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 249,
|
||||||
|
Expected: "%F9",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 250,
|
||||||
|
Expected: "%FA",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 251,
|
||||||
|
Expected: "%FB",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 252,
|
||||||
|
Expected: "%FC",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 253,
|
||||||
|
Expected: "%FD",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 254,
|
||||||
|
Expected: "%FE",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Value: 255,
|
||||||
|
Expected: "%FF",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for testNumber, test := range tests {
|
||||||
|
|
||||||
|
var buffer strings.Builder
|
||||||
|
|
||||||
|
err := rfc3986.WritePctEncodedByte(&buffer, test.Value)
|
||||||
|
if nil != err {
|
||||||
|
t.Errorf("For test #%d, did not expect an error but actually got one." , testNumber)
|
||||||
|
t.Logf("ERROR: (%T) %s", err, err)
|
||||||
|
t.Logf("VALUE: %q (%d) (%X)", test.Value, test.Value, test.Value)
|
||||||
|
t.Logf("EXPECTED: %q", test.Expected)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
actual := buffer.String()
|
||||||
|
expected := test.Expected
|
||||||
|
|
||||||
|
if expected != actual {
|
||||||
|
t.Errorf("For test #%d, the actual pct-encoded (i.e., percent-encoded) value is not what was expected.", testNumber)
|
||||||
|
t.Logf("EXPECTED: %q", expected)
|
||||||
|
t.Logf("ACTUAL: %q", actual)
|
||||||
|
t.Logf("VALUE: %q (%d) (%X)", test.Value, test.Value, test.Value)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue