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{