11using System ;
22using System . Linq ;
3+ using System . Text . Json ;
34using System . Reflection ;
45using Mastercard . Developer . ClientEncryption . Core . Encryption ;
5- using Newtonsoft . Json ;
6+ using Header = RestSharp . HeaderParameter ;
67using RestSharp ;
8+ using System . Collections . ObjectModel ;
9+ using System . Collections . Generic ;
710
811namespace Mastercard . Developer . ClientEncryption . RestSharpV2 . Interceptors
912{
@@ -30,7 +33,7 @@ public static RestSharpEncryptionInterceptor From(EncryptionConfig config)
3033 /// Encrypt RestSharp request payloads.
3134 /// </summary>
3235 /// <param name="request">A RestSharp request object</param>
33- public void InterceptRequest ( IRestRequest request )
36+ public void InterceptRequest ( RestRequest request )
3437 {
3538 if ( request == null ) throw new ArgumentNullException ( nameof ( request ) ) ;
3639
@@ -50,14 +53,15 @@ public void InterceptRequest(IRestRequest request)
5053 var payload = bodyParam . Value ;
5154 if ( ! ( payload is string ) )
5255 {
53- payload = request . JsonSerializer . Serialize ( payload ) ;
56+ payload = JsonSerializer . Serialize ( payload ) ;
5457 }
5558
5659 // Encrypt fields & update headers
5760 string encryptedPayload = EncryptPayload ( request , payload . ToString ( ) ) ;
5861
5962 // Update body and content length
60- bodyParam . Value = JsonConvert . DeserializeObject ( encryptedPayload ) ;
63+ request . RemoveParameter ( bodyParam ) ;
64+ request . AddBody ( encryptedPayload ) ;
6165 UpdateRequestHeader ( request , "Content-Length" , encryptedPayload . Length ) ;
6266 }
6367 catch ( EncryptionException )
@@ -74,7 +78,7 @@ public void InterceptRequest(IRestRequest request)
7478 /// Decrypt RestSharp response payloads.
7579 /// </summary>
7680 /// <param name="response">A RestSharp response object</param>
77- public void InterceptResponse ( IRestResponse response )
81+ public void InterceptResponse ( RestResponse response )
7882 {
7983 if ( response == null ) throw new ArgumentNullException ( nameof ( response ) ) ;
8084
@@ -109,17 +113,17 @@ public void InterceptResponse(IRestResponse response)
109113 /// <param name="request">A RestSharp request object</param>
110114 /// <param name="payload">The payload to be encrypted</param>
111115 /// <returns>The encrypted payload</returns>
112- internal abstract string EncryptPayload ( IRestRequest request , string payload ) ;
116+ internal abstract string EncryptPayload ( RestRequest request , string payload ) ;
113117
114118 /// <summary>
115119 /// Decrypt a RestSharp response payload
116120 /// </summary>
117121 /// <param name="response">A RestSharp response object</param>
118122 /// <param name="encryptedPayload">The encrypted payload to be decrypted</param>
119123 /// <returns>The decrypted payload</returns>
120- internal abstract string DecryptPayload ( IRestResponse response , string encryptedPayload ) ;
124+ internal abstract string DecryptPayload ( RestResponse response , string encryptedPayload ) ;
121125
122- internal static void UpdateResponseHeader ( IRestResponse response , string name , object value )
126+ internal static void UpdateResponseHeader ( RestResponse response , string name , object value )
123127 {
124128 if ( string . IsNullOrEmpty ( name ) )
125129 {
@@ -128,21 +132,24 @@ internal static void UpdateResponseHeader(IRestResponse response, string name, o
128132 }
129133
130134 // Scan
131- foreach ( Parameter p in response . Headers )
135+ List < Header > updatedHeaders = response . Headers . ToList ( ) ;
136+ foreach ( Header p in response . Headers )
132137 {
133138 if ( p . Name . Equals ( name ) )
134139 {
135- p . Value = value ;
140+ updatedHeaders . Remove ( p ) ;
141+ updatedHeaders . Add ( new Header ( name , value . ToString ( ) ) ) ;
142+ response . Headers = updatedHeaders ;
136143 return ;
137144 }
138145 }
139146
140147 // If we get here, there is no such header, so add one
141- var header = new Parameter ( name , value . ToString ( ) , ParameterType . HttpHeader ) ;
142- response . Headers . Add ( header ) ;
148+ updatedHeaders . Add ( new Header ( name , value . ToString ( ) ) ) ;
149+ response . Headers = updatedHeaders ;
143150 }
144151
145- internal static void UpdateRequestHeader ( IRestRequest request , string name , object value )
152+ internal static void UpdateRequestHeader ( RestRequest request , string name , object value )
146153 {
147154 if ( string . IsNullOrEmpty ( name ) )
148155 {
@@ -153,7 +160,7 @@ internal static void UpdateRequestHeader(IRestRequest request, string name, obje
153160 request . AddHeader ( name , value . ToString ( ) ) ;
154161 }
155162
156- internal static string ReadAndRemoveHeader ( IRestResponse response , string name )
163+ internal static string ReadAndRemoveHeader ( RestResponse response , string name )
157164 {
158165 var header = response . Headers . ToList ( ) . Find ( h => h . Name == name ) ;
159166 if ( string . IsNullOrEmpty ( name ) || header == null )
@@ -162,15 +169,8 @@ internal static string ReadAndRemoveHeader(IRestResponse response, string name)
162169 return null ;
163170 }
164171
165- // The "Headers" collection has been made read only, but we try to remove
166- // the header from the response anyway.
167- var headersField = response . GetType ( ) . GetTypeInfo ( ) . GetDeclaredField ( "<Headers>k__BackingField" ) ;
168- if ( headersField != null )
169- {
170- var updatedHeaders = response . Headers . ToList ( ) . FindAll ( h => h . Name != name ) ;
171- headersField . SetValue ( response , updatedHeaders ) ;
172- }
173-
172+ var updatedHeaders = response . Headers . ToList ( ) . FindAll ( h => h . Name != name ) ;
173+ response . Headers = updatedHeaders ;
174174 return header . Value ? . ToString ( ) ?? string . Empty ;
175175 }
176176 }
0 commit comments