11
11
12
12
namespace PnP . PowerShell . Commands . Base
13
13
{
14
- [ Cmdlet ( VerbsLifecycle . Invoke , "PnPGraphMethod" ) ]
14
+ [ Cmdlet ( VerbsLifecycle . Invoke , "PnPGraphMethod" , DefaultParameterSetName = ParameterSet_TOCONSOLE ) ]
15
15
public class InvokeGraphMethod : PnPGraphCmdlet
16
16
{
17
- [ Parameter ( Mandatory = false ) ]
17
+ private const string ParameterSet_TOFILE = "Out to file" ;
18
+ private const string ParameterSet_TOCONSOLE = "Out to console" ;
19
+
20
+ [ Parameter ( Mandatory = false , ParameterSetName = ParameterSet_TOFILE ) ]
21
+ [ Parameter ( Mandatory = false , ParameterSetName = ParameterSet_TOCONSOLE ) ]
18
22
public HttpRequestMethod Method = HttpRequestMethod . Get ;
19
23
20
24
private string _url ;
21
25
22
- [ Parameter ( Mandatory = true , Position = 0 , ValueFromPipeline = true ) ]
26
+ [ Parameter ( Mandatory = true , Position = 0 , ValueFromPipeline = true , ParameterSetName = ParameterSet_TOFILE ) ]
27
+ [ Parameter ( Mandatory = true , Position = 0 , ValueFromPipeline = true , ParameterSetName = ParameterSet_TOCONSOLE ) ]
23
28
public string Url
24
29
{
25
30
get { return _url ; }
@@ -41,15 +46,18 @@ public string Url
41
46
}
42
47
}
43
48
44
- [ Parameter ( Mandatory = false ) ]
49
+ [ Parameter ( Mandatory = false , ParameterSetName = ParameterSet_TOFILE ) ]
50
+ [ Parameter ( Mandatory = false , ParameterSetName = ParameterSet_TOCONSOLE ) ]
45
51
public object Content ;
46
52
47
- [ Parameter ( Mandatory = false ) ]
53
+ [ Parameter ( Mandatory = false , ParameterSetName = ParameterSet_TOFILE ) ]
54
+ [ Parameter ( Mandatory = false , ParameterSetName = ParameterSet_TOCONSOLE ) ]
48
55
public string ContentType = "application/json" ;
49
56
50
57
IDictionary < string , string > additionalHeaders = null ;
51
58
52
- [ Parameter ( Mandatory = false ) ]
59
+ [ Parameter ( Mandatory = false , ParameterSetName = ParameterSet_TOFILE ) ]
60
+ [ Parameter ( Mandatory = false , ParameterSetName = ParameterSet_TOCONSOLE ) ]
53
61
public IDictionary < string , string > AdditionalHeaders
54
62
{
55
63
get
@@ -71,15 +79,19 @@ public IDictionary<string, string> AdditionalHeaders
71
79
}
72
80
}
73
81
74
- [ Parameter ( Mandatory = false ) ]
82
+ [ Parameter ( Mandatory = false , ParameterSetName = ParameterSet_TOFILE ) ]
83
+ [ Parameter ( Mandatory = false , ParameterSetName = ParameterSet_TOCONSOLE ) ]
75
84
public SwitchParameter ConsistencyLevelEventual ;
76
85
77
- [ Parameter ( Mandatory = false ) ]
78
- public SwitchParameter Raw ;
86
+ [ Parameter ( Mandatory = false , ParameterSetName = ParameterSet_TOCONSOLE ) ]
87
+ public SwitchParameter Raw ;
79
88
80
- [ Parameter ( Mandatory = false ) ]
89
+ [ Parameter ( Mandatory = false , ParameterSetName = ParameterSet_TOCONSOLE ) ]
81
90
public SwitchParameter All ;
82
91
92
+ [ Parameter ( Mandatory = true , ParameterSetName = ParameterSet_TOFILE ) ]
93
+ public string OutFile ;
94
+
83
95
protected override void ExecuteCmdlet ( )
84
96
{
85
97
try
@@ -121,7 +133,14 @@ private void SendRequest()
121
133
switch ( Method )
122
134
{
123
135
case HttpRequestMethod . Get :
124
- GetRequest ( ) ;
136
+ if ( string . IsNullOrWhiteSpace ( OutFile ) )
137
+ {
138
+ GetRequestWithPaging ( ) ;
139
+ }
140
+ else
141
+ {
142
+ GetRequestWithoutPaging ( ) ;
143
+ }
125
144
return ;
126
145
case HttpRequestMethod . Post :
127
146
PostRequest ( ) ;
@@ -178,7 +197,7 @@ private void WriteGraphResult(string result)
178
197
}
179
198
}
180
199
181
- private void GetRequest ( )
200
+ private void GetRequestWithPaging ( )
182
201
{
183
202
var result = GraphHelper . GetAsync ( Connection , Url , AccessToken , AdditionalHeaders ) . GetAwaiter ( ) . GetResult ( ) ;
184
203
if ( Raw . IsPresent )
@@ -226,33 +245,63 @@ private void GetRequest()
226
245
WriteObject ( rootObj ) ;
227
246
}
228
247
}
248
+
249
+ private void GetRequestWithoutPaging ( )
250
+ {
251
+ WriteVerbose ( $ "Sending HTTP GET to { Url } ") ;
252
+ using var response = GraphHelper . GetResponseAsync ( Connection , Url , AccessToken ) . GetAwaiter ( ) . GetResult ( ) ;
253
+ HandleResponse ( response ) ;
254
+ }
229
255
230
256
private void PostRequest ( )
231
257
{
258
+ WriteVerbose ( $ "Sending HTTP POST to { Url } ") ;
232
259
var response = GraphHelper . PostAsync ( Connection , Url , AccessToken , GetHttpContent ( ) , AdditionalHeaders ) . GetAwaiter ( ) . GetResult ( ) ;
233
- var result = response . Content . ReadAsStringAsync ( ) . GetAwaiter ( ) . GetResult ( ) ;
234
- WriteGraphResult ( result ) ;
260
+ HandleResponse ( response ) ;
235
261
}
236
262
237
263
private void PutRequest ( )
238
264
{
265
+ WriteVerbose ( $ "Sending HTTP PUT to { Url } ") ;
239
266
var response = GraphHelper . PutAsync ( Connection , Url , AccessToken , GetHttpContent ( ) , AdditionalHeaders ) . GetAwaiter ( ) . GetResult ( ) ;
240
- var result = response . Content . ReadAsStringAsync ( ) . GetAwaiter ( ) . GetResult ( ) ;
241
- WriteGraphResult ( result ) ;
267
+ HandleResponse ( response ) ;
242
268
}
243
269
244
270
private void PatchRequest ( )
245
271
{
272
+ WriteVerbose ( $ "Sending HTTP PATCH to { Url } ") ;
246
273
var response = GraphHelper . PatchAsync ( Connection , AccessToken , GetHttpContent ( ) , Url , AdditionalHeaders ) . GetAwaiter ( ) . GetResult ( ) ;
247
- var result = response . Content . ReadAsStringAsync ( ) . GetAwaiter ( ) . GetResult ( ) ;
248
- WriteGraphResult ( result ) ;
274
+ HandleResponse ( response ) ;
249
275
}
250
276
251
277
private void DeleteRequest ( )
252
278
{
279
+ WriteVerbose ( $ "Sending HTTP DELETE to { Url } ") ;
253
280
var response = GraphHelper . DeleteAsync ( Connection , Url , AccessToken , AdditionalHeaders ) . GetAwaiter ( ) . GetResult ( ) ;
254
- var result = response . Content . ReadAsStringAsync ( ) . GetAwaiter ( ) . GetResult ( ) ;
255
- WriteGraphResult ( result ) ;
281
+ HandleResponse ( response ) ;
256
282
}
283
+
284
+ private void HandleResponse ( HttpResponseMessage response )
285
+ {
286
+ if ( ParameterSpecified ( nameof ( OutFile ) ) )
287
+ {
288
+ var responseStream = response . Content . ReadAsStreamAsync ( ) . GetAwaiter ( ) . GetResult ( ) ;
289
+
290
+ WriteVerbose ( $ "Writing { responseStream . Length } bytes response to { OutFile } ") ;
291
+
292
+ using var fileStream = new System . IO . FileStream ( OutFile , System . IO . FileMode . Create , System . IO . FileAccess . Write ) ;
293
+ responseStream . CopyTo ( fileStream ) ;
294
+ fileStream . Close ( ) ;
295
+ return ;
296
+ }
297
+ else
298
+ {
299
+ var result = response . Content . ReadAsStringAsync ( ) . GetAwaiter ( ) . GetResult ( ) ;
300
+
301
+ WriteVerbose ( $ "Returning { result . Length } characters response") ;
302
+
303
+ WriteGraphResult ( result ) ;
304
+ }
305
+ }
257
306
}
258
307
}
0 commit comments