diff --git a/headerauth.go b/headerauth.go index baa56b3c..dd50e6de 100644 --- a/headerauth.go +++ b/headerauth.go @@ -20,19 +20,21 @@ func ReadHeaderAuth(in string) (*HeaderAuth, error) { i := strings.IndexByte(in, ' ') if i < 0 { - return nil, fmt.Errorf("parse error") + return nil, fmt.Errorf("unable to find prefix (%s)", in) } a.Prefix, in = in[:i], in[i+1:] - r := regexp.MustCompile("^([a-z]+)=\"(.+?)\"(, )?") + r := regexp.MustCompile("^([a-z]+)=(\"(.+?)\"|([a-zA-Z0-9]+))(, )?") for len(in) > 0 { m := r.FindStringSubmatch(in) if m == nil { - return nil, fmt.Errorf("parse error") + return nil, fmt.Errorf("unable to parse key-value (%s)", in) } in = in[len(m[0]):] + m[2] = strings.TrimPrefix(m[2], "\"") + m[2] = strings.TrimSuffix(m[2], "\"") a.Values[m[1]] = m[2] } diff --git a/headerauth_test.go b/headerauth_test.go index 47ce756c..46c83b59 100644 --- a/headerauth_test.go +++ b/headerauth_test.go @@ -22,7 +22,7 @@ var casesHeaderAuth = []struct { }, }, { - "digest request", + "digest request 1", `Digest realm="4419b63f5e51", nonce="8b84a3b789283a8bea8da7fa7d41f08b", stale="FALSE"`, &HeaderAuth{ Prefix: "Digest", @@ -33,6 +33,18 @@ var casesHeaderAuth = []struct { }, }, }, + { + "digest request 2", + `Digest realm="4419b63f5e51", nonce="8b84a3b789283a8bea8da7fa7d41f08b", stale=FALSE`, + &HeaderAuth{ + Prefix: "Digest", + Values: map[string]string{ + "realm": "4419b63f5e51", + "nonce": "8b84a3b789283a8bea8da7fa7d41f08b", + "stale": "FALSE", + }, + }, + }, { "digest response", `Digest username="aa", realm="bb", nonce="cc", uri="dd", response="ee"`,