2
2
using System . Collections . Generic ;
3
3
using System . IO ;
4
4
using System . Linq ;
5
+ using System . Net ;
6
+ using System . Net . Http ;
5
7
using System . Text ;
6
8
using Microsoft . OpenApi . Extensions ;
7
9
using Microsoft . OpenApi . Models ;
8
10
using Microsoft . OpenApi . Readers ;
11
+ using Microsoft . OpenApi . Services ;
9
12
using Microsoft . OpenApi . Validations ;
10
13
using Microsoft . OpenApi . Writers ;
11
14
@@ -14,48 +17,57 @@ namespace Microsoft.OpenApi.Tool
14
17
static class OpenApiService
15
18
{
16
19
public static void ProcessOpenApiDocument (
17
- FileInfo input ,
20
+ string input ,
18
21
FileInfo output ,
19
22
OpenApiSpecVersion version ,
20
23
OpenApiFormat format ,
21
24
bool inline ,
22
25
bool resolveExternal )
23
26
{
27
+ if ( input == null )
28
+ {
29
+ throw new ArgumentNullException ( "input" ) ;
30
+ }
31
+
32
+ var stream = GetStream ( input ) ;
33
+
24
34
OpenApiDocument document ;
25
- using ( Stream stream = input . OpenRead ( ) )
35
+
36
+ var result = new OpenApiStreamReader ( new OpenApiReaderSettings
37
+ {
38
+ ReferenceResolution = resolveExternal == true ? ReferenceResolutionSetting . ResolveAllReferences : ReferenceResolutionSetting . ResolveLocalReferences ,
39
+ RuleSet = ValidationRuleSet . GetDefaultRuleSet ( )
40
+ }
41
+ ) . ReadAsync ( stream ) . GetAwaiter ( ) . GetResult ( ) ;
42
+
43
+ document = result . OpenApiDocument ;
44
+ var context = result . OpenApiDiagnostic ;
45
+
46
+ if ( context . Errors . Count != 0 )
26
47
{
48
+ var errorReport = new StringBuilder ( ) ;
27
49
28
- document = new OpenApiStreamReader ( new OpenApiReaderSettings
50
+ foreach ( var error in context . Errors )
29
51
{
30
- ReferenceResolution = resolveExternal == true ? ReferenceResolutionSetting . ResolveAllReferences : ReferenceResolutionSetting . ResolveLocalReferences ,
31
- RuleSet = ValidationRuleSet . GetDefaultRuleSet ( )
52
+ errorReport . AppendLine ( error . ToString ( ) ) ;
32
53
}
33
- ) . Read ( stream , out var context ) ;
34
- if ( context . Errors . Count != 0 )
35
- {
36
- var errorReport = new StringBuilder ( ) ;
37
-
38
- foreach ( var error in context . Errors )
39
- {
40
- errorReport . AppendLine ( error . ToString ( ) ) ;
41
- }
42
54
43
- throw new ArgumentException ( String . Join ( Environment . NewLine , context . Errors . Select ( e => e . Message ) . ToArray ( ) ) ) ;
44
- }
55
+ throw new ArgumentException ( String . Join ( Environment . NewLine , context . Errors . Select ( e => e . Message ) . ToArray ( ) ) ) ;
45
56
}
46
57
47
58
using ( var outputStream = output ? . Create ( ) )
48
59
{
49
60
TextWriter textWriter ;
50
61
51
- if ( outputStream != null )
62
+ if ( outputStream != null )
52
63
{
53
64
textWriter = new StreamWriter ( outputStream ) ;
54
- } else
65
+ }
66
+ else
55
67
{
56
68
textWriter = Console . Out ;
57
69
}
58
-
70
+
59
71
var settings = new OpenApiWriterSettings ( )
60
72
{
61
73
ReferenceInline = inline == true ? ReferenceInlineSetting . InlineLocalReferences : ReferenceInlineSetting . DoNotInlineReferences
@@ -72,11 +84,67 @@ public static void ProcessOpenApiDocument(
72
84
default :
73
85
throw new ArgumentException ( "Unknown format" ) ;
74
86
}
75
-
76
- document . Serialize ( writer , version ) ;
87
+
88
+ document . Serialize ( writer , version ) ;
77
89
78
90
textWriter . Flush ( ) ;
79
91
}
80
92
}
81
- }
93
+
94
+ private static Stream GetStream ( string input )
95
+ {
96
+ Stream stream ;
97
+ if ( input . StartsWith ( "http" ) )
98
+ {
99
+ var httpClient = new HttpClient ( new HttpClientHandler ( )
100
+ {
101
+ SslProtocols = System . Security . Authentication . SslProtocols . Tls12 ,
102
+ } )
103
+ {
104
+ DefaultRequestVersion = HttpVersion . Version20
105
+ } ;
106
+ stream = httpClient . GetStreamAsync ( input ) . Result ;
107
+ }
108
+ else
109
+ {
110
+ var fileInput = new FileInfo ( input ) ;
111
+ stream = fileInput . OpenRead ( ) ;
112
+ }
113
+
114
+ return stream ;
115
+ }
116
+
117
+ internal static void ValidateOpenApiDocument ( string input )
118
+ {
119
+ if ( input == null )
120
+ {
121
+ throw new ArgumentNullException ( "input" ) ;
122
+ }
123
+
124
+ var stream = GetStream ( input ) ;
125
+
126
+ OpenApiDocument document ;
127
+
128
+ document = new OpenApiStreamReader ( new OpenApiReaderSettings
129
+ {
130
+ //ReferenceResolution = resolveExternal == true ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences,
131
+ RuleSet = ValidationRuleSet . GetDefaultRuleSet ( )
132
+ }
133
+ ) . Read ( stream , out var context ) ;
134
+
135
+ if ( context . Errors . Count != 0 )
136
+ {
137
+ foreach ( var error in context . Errors )
138
+ {
139
+ Console . WriteLine ( error . ToString ( ) ) ;
140
+ }
141
+ }
142
+
143
+ var statsVisitor = new StatsVisitor ( ) ;
144
+ var walker = new OpenApiWalker ( statsVisitor ) ;
145
+ walker . Walk ( document ) ;
146
+
147
+ Console . WriteLine ( statsVisitor . GetStatisticsReport ( ) ) ;
148
+ }
149
+ }
82
150
}
0 commit comments