1
1
using System ;
2
2
using System . Linq ;
3
+ using System . Text . Json ;
3
4
using System . Reflection ;
4
5
using Mastercard . Developer . ClientEncryption . Core . Encryption ;
5
- using Newtonsoft . Json ;
6
+ using Header = RestSharp . HeaderParameter ;
6
7
using RestSharp ;
8
+ using System . Collections . ObjectModel ;
9
+ using System . Collections . Generic ;
7
10
8
11
namespace Mastercard . Developer . ClientEncryption . RestSharpV2 . Interceptors
9
12
{
@@ -30,7 +33,7 @@ public static RestSharpEncryptionInterceptor From(EncryptionConfig config)
30
33
/// Encrypt RestSharp request payloads.
31
34
/// </summary>
32
35
/// <param name="request">A RestSharp request object</param>
33
- public void InterceptRequest ( IRestRequest request )
36
+ public void InterceptRequest ( RestRequest request )
34
37
{
35
38
if ( request == null ) throw new ArgumentNullException ( nameof ( request ) ) ;
36
39
@@ -50,14 +53,15 @@ public void InterceptRequest(IRestRequest request)
50
53
var payload = bodyParam . Value ;
51
54
if ( ! ( payload is string ) )
52
55
{
53
- payload = request . JsonSerializer . Serialize ( payload ) ;
56
+ payload = JsonSerializer . Serialize ( payload ) ;
54
57
}
55
58
56
59
// Encrypt fields & update headers
57
60
string encryptedPayload = EncryptPayload ( request , payload . ToString ( ) ) ;
58
61
59
62
// Update body and content length
60
- bodyParam . Value = JsonConvert . DeserializeObject ( encryptedPayload ) ;
63
+ request . RemoveParameter ( bodyParam ) ;
64
+ request . AddBody ( encryptedPayload ) ;
61
65
UpdateRequestHeader ( request , "Content-Length" , encryptedPayload . Length ) ;
62
66
}
63
67
catch ( EncryptionException )
@@ -74,7 +78,7 @@ public void InterceptRequest(IRestRequest request)
74
78
/// Decrypt RestSharp response payloads.
75
79
/// </summary>
76
80
/// <param name="response">A RestSharp response object</param>
77
- public void InterceptResponse ( IRestResponse response )
81
+ public void InterceptResponse ( RestResponse response )
78
82
{
79
83
if ( response == null ) throw new ArgumentNullException ( nameof ( response ) ) ;
80
84
@@ -109,17 +113,17 @@ public void InterceptResponse(IRestResponse response)
109
113
/// <param name="request">A RestSharp request object</param>
110
114
/// <param name="payload">The payload to be encrypted</param>
111
115
/// <returns>The encrypted payload</returns>
112
- internal abstract string EncryptPayload ( IRestRequest request , string payload ) ;
116
+ internal abstract string EncryptPayload ( RestRequest request , string payload ) ;
113
117
114
118
/// <summary>
115
119
/// Decrypt a RestSharp response payload
116
120
/// </summary>
117
121
/// <param name="response">A RestSharp response object</param>
118
122
/// <param name="encryptedPayload">The encrypted payload to be decrypted</param>
119
123
/// <returns>The decrypted payload</returns>
120
- internal abstract string DecryptPayload ( IRestResponse response , string encryptedPayload ) ;
124
+ internal abstract string DecryptPayload ( RestResponse response , string encryptedPayload ) ;
121
125
122
- internal static void UpdateResponseHeader ( IRestResponse response , string name , object value )
126
+ internal static void UpdateResponseHeader ( RestResponse response , string name , object value )
123
127
{
124
128
if ( string . IsNullOrEmpty ( name ) )
125
129
{
@@ -128,21 +132,24 @@ internal static void UpdateResponseHeader(IRestResponse response, string name, o
128
132
}
129
133
130
134
// Scan
131
- foreach ( Parameter p in response . Headers )
135
+ List < Header > updatedHeaders = response . Headers . ToList ( ) ;
136
+ foreach ( Header p in response . Headers )
132
137
{
133
138
if ( p . Name . Equals ( name ) )
134
139
{
135
- p . Value = value ;
140
+ updatedHeaders . Remove ( p ) ;
141
+ updatedHeaders . Add ( new Header ( name , value . ToString ( ) ) ) ;
142
+ response . Headers = updatedHeaders ;
136
143
return ;
137
144
}
138
145
}
139
146
140
147
// 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 ;
143
150
}
144
151
145
- internal static void UpdateRequestHeader ( IRestRequest request , string name , object value )
152
+ internal static void UpdateRequestHeader ( RestRequest request , string name , object value )
146
153
{
147
154
if ( string . IsNullOrEmpty ( name ) )
148
155
{
@@ -153,7 +160,7 @@ internal static void UpdateRequestHeader(IRestRequest request, string name, obje
153
160
request . AddHeader ( name , value . ToString ( ) ) ;
154
161
}
155
162
156
- internal static string ReadAndRemoveHeader ( IRestResponse response , string name )
163
+ internal static string ReadAndRemoveHeader ( RestResponse response , string name )
157
164
{
158
165
var header = response . Headers . ToList ( ) . Find ( h => h . Name == name ) ;
159
166
if ( string . IsNullOrEmpty ( name ) || header == null )
@@ -162,15 +169,8 @@ internal static string ReadAndRemoveHeader(IRestResponse response, string name)
162
169
return null ;
163
170
}
164
171
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 ;
174
174
return header . Value ? . ToString ( ) ?? string . Empty ;
175
175
}
176
176
}
0 commit comments