File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -47,6 +47,11 @@ internal class DigestAuthenticatorManager
4747 /// </summary>
4848 private string ? _realm ;
4949
50+ /// <summary>
51+ /// The opaque that is returned by the first digest request (without the data).
52+ /// </summary>
53+ private string ? _opaque ;
54+
5055 static DigestAuthenticatorManager ( )
5156 {
5257 _assemblyVersion = Assembly . GetAssembly ( typeof ( DigestAuthenticatorManager ) ) . GetName ( ) . Version ;
@@ -130,6 +135,7 @@ public string GetDigestHeader(string digestUri, Method method)
130135 $ "uri=\" { digestUri } \" ," +
131136 "algorithm=MD5," +
132137 $ "response=\" { digestResponse } \" ," +
138+ ( ! string . IsNullOrWhiteSpace ( _opaque ) ? $ "opaque=\" { _opaque } \" ," : string . Empty ) +
133139 $ "qop={ _qop } ," +
134140 $ "nc={ DigestHeader . NONCE_COUNT : 00000000} ," +
135141 $ "cnonce=\" { _cnonce } \" ";
@@ -184,5 +190,14 @@ private void GetDigestDataFromFailResponse(RestResponse response)
184190 _realm = digestHeader . Realm ;
185191 _nonce = digestHeader . Nonce ;
186192 _qop = digestHeader . Qop ;
193+ if ( ! string . IsNullOrWhiteSpace ( _qop ) && _qop ! . Contains ( ',' ) )
194+ {
195+ _qop = _qop !
196+ . Split ( ',' )
197+ . Select ( q => q . Trim ( ) )
198+ . FirstOrDefault ( q => q . Equals ( "auth" , StringComparison . OrdinalIgnoreCase ) ) // prefer "auth" if the server offered several
199+ ?? _qop . Split ( ',' ) [ 0 ] . Trim ( ) ;
200+ }
201+ _opaque = digestHeader . Opaque ;
187202 }
188203}
Original file line number Diff line number Diff line change @@ -14,9 +14,11 @@ internal class DigestHeader
1414
1515 public const string REALM = "realm" ;
1616
17+ public const string OPAQUE = "opaque" ;
18+
1719 public const string REGEX_PATTERN =
1820 "realm=\" (?<realm>.*?)\" |qop=(?:\" (?<qop>.*?)\" |(?<qop>[^\" ,\\ s]+))|nonce=\" (?<nonce>.*?)\" |stale=\" (?<stale>.*?)\" |opaque=\" (?<opaque>.*?)\" |domain=\" (?<domain>.*?)\" " ;
19-
21+
2022 private static readonly Regex _regex ;
2123
2224 static DigestHeader ( )
@@ -50,6 +52,11 @@ public DigestHeader(string authenticateHeader, ILogger logger)
5052 {
5153 Nonce = m . Groups [ NONCE ] . Value ;
5254 }
55+
56+ if ( m . Groups [ OPAQUE ] . Success )
57+ {
58+ Opaque = m . Groups [ OPAQUE ] . Value ;
59+ }
5360 }
5461
5562 if ( AllDataCorrectFilled ( ) )
@@ -65,10 +72,11 @@ public DigestHeader(string authenticateHeader, ILogger logger)
6572 public string ? Nonce { get ; }
6673 public string ? Qop { get ; }
6774 public string ? Realm { get ; }
75+ public string ? Opaque { get ; }
6876
6977 public override string ToString ( )
7078 {
71- return $ "{ nameof ( Realm ) } =\" { Realm } \" &{ nameof ( Nonce ) } =\" { Nonce } \" &{ nameof ( Qop ) } =\" { Qop } \" ";
79+ return $ "{ nameof ( Realm ) } =\" { Realm } \" &{ nameof ( Nonce ) } =\" { Nonce } \" &{ nameof ( Qop ) } =\" { Qop } \" & { nameof ( Opaque ) } = \" { Opaque } \" ";
7280 }
7381
7482 private bool AllDataCorrectFilled ( )
You can’t perform that action at this time.
0 commit comments