44using System . Net ;
55using System . Text ;
66using System . Text . RegularExpressions ;
7+ using System . Threading ;
78using System . Threading . Tasks ;
89using System . Xml ;
910using System . Xml . Linq ;
@@ -18,33 +19,36 @@ internal class JenkinsHttpCommand
1819 public JenkinsCrumb Crumb { get ; set ; }
1920 public Action < HttpWebRequest > OnWrite { get ; set ; }
2021 public Action < HttpWebResponse > OnRead { get ; set ; }
21- public Func < HttpWebRequest , Task > OnWriteAsync { get ; set ; }
22- public Func < HttpWebResponse , Task > OnReadAsync { get ; set ; }
22+ public Func < HttpWebRequest , CancellationToken , Task > OnWriteAsync { get ; set ; }
23+ public Func < HttpWebResponse , CancellationToken , Task > OnReadAsync { get ; set ; }
2324
2425
2526 public void Run ( )
2627 {
2728 var request = CreateRequest ( ) ;
2829
2930 if ( OnWrite != null ) OnWrite . Invoke ( request ) ;
30- else if ( OnWriteAsync != null ) OnWriteAsync . Invoke ( request ) . GetAwaiter ( ) . GetResult ( ) ;
31+ else OnWriteAsync ? . Invoke ( request , CancellationToken . None ) . GetAwaiter ( ) . GetResult ( ) ;
3132
3233 using ( var response = ( HttpWebResponse ) request . GetResponse ( ) ) {
3334 if ( OnRead != null ) OnRead ? . Invoke ( response ) ;
34- else if ( OnReadAsync != null ) OnReadAsync . Invoke ( response ) . GetAwaiter ( ) . GetResult ( ) ;
35+ else OnReadAsync ? . Invoke ( response , CancellationToken . None ) . GetAwaiter ( ) . GetResult ( ) ;
3536 }
3637 }
3738
38- public async Task RunAsync ( )
39+ public async Task RunAsync ( CancellationToken token = default ( CancellationToken ) )
3940 {
4041 var request = CreateRequest ( ) ;
4142
42- if ( OnWriteAsync != null ) await OnWriteAsync . Invoke ( request ) ;
43- else if ( OnWrite != null ) OnWrite . Invoke ( request ) ;
43+ if ( OnWriteAsync != null ) await OnWriteAsync . Invoke ( request , token ) ;
44+ else OnWrite ? . Invoke ( request ) ;
4445
46+ using ( token . Register ( ( ) => request . Abort ( ) , false ) )
4547 using ( var response = ( HttpWebResponse ) await request . GetResponseAsync ( ) ) {
46- if ( OnReadAsync != null ) await OnReadAsync . Invoke ( response ) ;
47- else if ( OnRead != null ) OnRead ? . Invoke ( response ) ;
48+ token . ThrowIfCancellationRequested ( ) ;
49+
50+ if ( OnReadAsync != null ) await OnReadAsync . Invoke ( response , token ) ;
51+ else OnRead ? . Invoke ( response ) ;
4852 }
4953 }
5054
@@ -77,9 +81,12 @@ private HttpWebRequest CreateRequest()
7781 protected async Task < XDocument > ReadXmlAsync ( HttpWebResponse response )
7882 {
7983 string xml ;
80- using ( var stream = response . GetResponseStream ( ) )
81- using ( var reader = new StreamReader ( stream ) ) {
82- xml = await reader . ReadToEndAsync ( ) ;
84+ using ( var stream = response . GetResponseStream ( ) ) {
85+ if ( stream == null ) return null ;
86+
87+ using ( var reader = new StreamReader ( stream ) ) {
88+ xml = await reader . ReadToEndAsync ( ) ;
89+ }
8390 }
8491
8592 // Remove Decleration
@@ -89,17 +96,30 @@ protected async Task<XDocument> ReadXmlAsync(HttpWebResponse response)
8996 return XDocument . Parse ( xml ) ;
9097 }
9198
92- protected async Task WriteXmlAsync ( HttpWebRequest request , XNode node )
99+ protected async Task WriteXmlAsync ( HttpWebRequest request , XNode node , CancellationToken token = default ( CancellationToken ) )
93100 {
94101 var xmlSettings = new XmlWriterSettings {
95102 ConformanceLevel = ConformanceLevel . Fragment ,
96103 Indent = false ,
97104 } ;
98105
106+ using ( token . Register ( request . Abort , false ) )
99107 using ( var stream = await request . GetRequestStreamAsync ( ) )
100108 using ( var writer = XmlWriter . Create ( stream , xmlSettings ) ) {
109+ token . ThrowIfCancellationRequested ( ) ;
110+
101111 node . WriteTo ( writer ) ;
102112 }
103113 }
114+
115+ protected static Encoding TryGetEncoding ( string name , Encoding fallback )
116+ {
117+ try {
118+ return Encoding . GetEncoding ( name ) ;
119+ }
120+ catch {
121+ return fallback ;
122+ }
123+ }
104124 }
105125}
0 commit comments