@@ -15,7 +15,6 @@ namespace Http2Client;
1515public sealed class Http2Client : IDisposable
1616{
1717 private readonly Http2ClientOptions _options ;
18- private readonly NativeWrapper _wrapper ;
1918 private bool _disposed ;
2019
2120 /// <summary>
@@ -33,6 +32,11 @@ public sealed class Http2Client : IDisposable
3332 /// </summary>
3433 public bool IsDisposed => _disposed ;
3534
35+ /// <summary>
36+ /// True if native library is loaded and ready to use.
37+ /// </summary>
38+ public static bool IsInitialized => NativeWrapper . IsInitialized ;
39+
3640 /// <summary>
3741 /// Create client with custom options.
3842 /// </summary>
@@ -41,7 +45,6 @@ public Http2Client(Http2ClientOptions options)
4145 {
4246 _options = options ?? throw new ArgumentNullException ( nameof ( options ) ) ;
4347 _options . Validate ( ) ;
44- _wrapper = NativeWrapper . Load ( _options . LibraryPath ) ;
4548 }
4649
4750 /// <summary>
@@ -51,6 +54,23 @@ public Http2Client() : this(new Http2ClientOptions())
5154 {
5255 }
5356
57+ /// <summary>
58+ /// Initialize native library once. Call this before creating any Http2Client instances.
59+ /// </summary>
60+ /// <param name="path">Path to native TLS library</param>
61+ public static void Initialize ( string path )
62+ {
63+ NativeWrapper . Initialize ( path ) ;
64+ }
65+
66+ /// <summary>
67+ /// Cleanup native library resources. Call at application shutdown.
68+ /// </summary>
69+ public static void Cleanup ( )
70+ {
71+ NativeWrapper . Cleanup ( ) ;
72+ }
73+
5474 /// <summary>
5575 /// Send HTTP request. Main method for making requests.
5676 /// </summary>
@@ -67,7 +87,7 @@ public Http2Client() : this(new Http2ClientOptions())
6787
6888 try
6989 {
70- var responseJson = _wrapper . Request ( Serializer . SerializeToBytes ( prepared ) ) ;
90+ var responseJson = NativeWrapper . Request ( Serializer . SerializeToBytes ( prepared ) ) ;
7191 response = Serializer . Deserialize < HttpResponse > ( responseJson ) ;
7292 return response ;
7393 }
@@ -80,7 +100,7 @@ public Http2Client() : this(new Http2ClientOptions())
80100 // Clean up native memory for this response
81101 if ( response != null && ! string . IsNullOrEmpty ( response . Id ) )
82102 {
83- _wrapper . FreeMemory ( response . Id ) ;
103+ NativeWrapper . FreeMemory ( response . Id ) ;
84104 }
85105 }
86106 }
@@ -100,7 +120,7 @@ public Http2Client() : this(new Http2ClientOptions())
100120 SessionId = _options . SessionId ,
101121 } ;
102122
103- var responseJson = _wrapper . GetCookiesFromSession ( Serializer . SerializeToBytes ( payload ) ) ;
123+ var responseJson = NativeWrapper . GetCookiesFromSession ( Serializer . SerializeToBytes ( payload ) ) ;
104124 return Serializer . Deserialize < CookiesResponse > ( responseJson ) ;
105125 }
106126
@@ -122,7 +142,7 @@ public Http2Client() : this(new Http2ClientOptions())
122142 Cookies = [ .. cookies ]
123143 } ;
124144
125- var responseJson = _wrapper . AddCookiesToSession ( Serializer . SerializeToBytes ( payload ) ) ;
145+ var responseJson = NativeWrapper . AddCookiesToSession ( Serializer . SerializeToBytes ( payload ) ) ;
126146 return Serializer . Deserialize < CookiesResponse > ( responseJson ) ;
127147 }
128148
@@ -135,7 +155,7 @@ public bool DestroySession()
135155 try
136156 {
137157 var payload = new { sessionId = _options . SessionId } ;
138- var responseJson = _wrapper . DestroySession ( Serializer . SerializeToBytes ( payload ) ) ;
158+ var responseJson = NativeWrapper . DestroySession ( Serializer . SerializeToBytes ( payload ) ) ;
139159 return ! string . IsNullOrEmpty ( responseJson ) ;
140160 }
141161 catch
@@ -153,7 +173,7 @@ public bool DestroyAllSessions()
153173 {
154174 try
155175 {
156- var responseJson = _wrapper . DestroyAllSessions ( ) ;
176+ var responseJson = NativeWrapper . DestroyAllSessions ( ) ;
157177 return ! string . IsNullOrEmpty ( responseJson ) ;
158178 }
159179 catch
@@ -286,11 +306,9 @@ private void Dispose(bool disposing)
286306 }
287307 catch
288308 {
289- // If session cleanup fails, we still want to dispose the wrapper
309+ // If session cleanup fails, we still want to continue disposal
290310 // Better to leak a session than crash during disposal
291311 }
292-
293- _wrapper ? . Dispose ( ) ;
294312 }
295313
296314 _disposed = true ;
0 commit comments