now allow updated request
diff --git a/authorization.go b/authorization.go
index 548f9c8..af3cc76 100644
--- a/authorization.go
+++ b/authorization.go
@@ -29,19 +29,19 @@
Username_ string // quoted
}
-func newAuthorization(dr *DigestRequest) *authorization {
+func newAuthorization(dr *DigestRequest) (*authorization, error) {
ah := authorization{
- Algorithm: wa.Algorithm,
+ Algorithm: dr.Wa.Algorithm,
Cnonce: "",
Nc: 0,
- Nonce: wa.Nonce,
- Opaque: wa.Opaque,
+ Nonce: dr.Wa.Nonce,
+ Opaque: dr.Wa.Opaque,
Qop: "",
- Realm: wa.Realm,
+ Realm: dr.Wa.Realm,
Response: "",
Uri: "",
- Userhash: wa.Userhash,
+ Userhash: dr.Wa.Userhash,
Username: dr.Username,
Username_: "", // TODO
}
@@ -50,9 +50,7 @@
ah.Username = ah.hash(fmt.Sprintf("%s:%s", ah.Username, ah.Realm))
}
- ah.refreshAuthorization(dr)
-
- return &ah
+ return ah.refreshAuthorization(dr)
}
func (ah *authorization) refreshAuthorization(dr *DigestRequest) (*authorization, error) {
@@ -96,12 +94,12 @@
func (ah *authorization) computeA2(dr *DigestRequest) string {
- if matched, _ := regexp.MatchString("auth-int", wa.Qop); matched {
+ if matched, _ := regexp.MatchString("auth-int", dr.Wa.Qop); matched {
ah.Qop = "auth-int"
return fmt.Sprintf("%s:%s:%s", dr.Method, ah.Uri, ah.hash(dr.Body))
}
- if wa.Qop == "auth" || wa.Qop == "" {
+ if dr.Wa.Qop == "auth" || dr.Wa.Qop == "" {
ah.Qop = "auth"
return fmt.Sprintf("%s:%s", dr.Method, ah.Uri)
}
diff --git a/digest_auth_client.go b/digest_auth_client.go
index 1ed9652..b608ce0 100644
--- a/digest_auth_client.go
+++ b/digest_auth_client.go
@@ -7,35 +7,37 @@
"time"
)
-var (
- auth *authorization
- wa *wwwAuthenticate
-)
-
type DigestRequest struct {
Body string
Method string
Password string
Uri string
Username string
+ Auth *authorization
+ Wa *wwwAuthenticate
}
func NewRequest(username string, password string, method string, uri string, body string) DigestRequest {
dr := DigestRequest{}
+ dr.UpdateRequest(username, password, method, uri, body)
+ return dr
+}
+
+func (dr *DigestRequest) UpdateRequest(username string,
+ password string, method string, uri string, body string) *DigestRequest {
dr.Body = body
dr.Method = method
dr.Password = password
dr.Uri = uri
dr.Username = username
-
return dr
}
func (dr *DigestRequest) Execute() (resp *http.Response, err error) {
- if auth == nil {
+ if dr.Auth == nil {
var req *http.Request
if req, err = http.NewRequest(dr.Method, dr.Uri, bytes.NewReader([]byte(dr.Body))); err != nil {
return nil, err
@@ -56,26 +58,44 @@
}
func (dr *DigestRequest) executeNewDigest(resp *http.Response) (*http.Response, error) {
+ var (
+ auth *authorization
+ err error
+ wa *wwwAuthenticate
+ )
waString := resp.Header.Get("WWW-Authenticate")
if waString == "" {
return nil, fmt.Errorf("Failed to get WWW-Authenticate header, please check your server configuration.")
}
wa = newWwwAuthenticate(waString)
+ dr.Wa = wa
- authString := newAuthorization(dr).toString()
+ if auth, err = newAuthorization(dr); err != nil {
+ return nil, err
+ }
+ authString := auth.toString()
- return dr.executeRequest(authString)
+ if resp, err := dr.executeRequest(authString); err != nil {
+ return nil, err
+ } else {
+ dr.Auth = auth
+ return resp, nil
+ }
}
func (dr *DigestRequest) executeExistingDigest() (*http.Response, error) {
- var err error
+ var (
+ auth *authorization
+ err error
+ )
- if auth, err = auth.refreshAuthorization(dr); err != nil {
+ if auth, err = dr.Auth.refreshAuthorization(dr); err != nil {
return nil, err
}
+ dr.Auth = auth
- authString := auth.toString()
+ authString := dr.Auth.toString()
return dr.executeRequest(authString)
}
@@ -89,7 +109,7 @@
return nil, err
}
- fmt.Printf("AUTHSTRING: %s\n\n", authString)
+ // fmt.Printf("AUTHSTRING: %s\n\n", authString)
req.Header.Add("Authorization", authString)
client := &http.Client{