freessl and trigger the data received callback in more places

This commit is contained in:
Adam D. Ruppe 2025-09-01 19:23:49 -04:00
parent d0b857578c
commit 97e560bcff
1 changed files with 26 additions and 10 deletions

36
http2.d
View File

@ -1361,7 +1361,7 @@ class HttpRequest {
} }
if(advance) if(advance)
HttpRequest.advanceConnections(requestParameters.timeoutFromInactivity); HttpRequest.advanceConnections(0.seconds);//requestParameters.timeoutFromInactivity); // doing async so no block here
} }
@ -1717,7 +1717,6 @@ class HttpRequest {
It should tell the thing if the buffer is reused or not It should tell the thing if the buffer is reused or not
+/ +/
/++ /++
This is made public for rudimentary event loop integration, but is still This is made public for rudimentary event loop integration, but is still
basically an internal detail. Try not to use it if you have another way. basically an internal detail. Try not to use it if you have another way.
@ -1842,8 +1841,10 @@ class HttpRequest {
} }
import std.algorithm : remove; import std.algorithm : remove;
foreach(rp; removeFromPending[0 .. removeFromPendingCount]) foreach(rp; removeFromPending[0 .. removeFromPendingCount]) {
if(rp.onDataReceived) rp.onDataReceived(rp);
pending = pending.remove!((a) => a is rp)(); pending = pending.remove!((a) => a is rp)();
}
tryAgain: tryAgain:
@ -1874,6 +1875,7 @@ class HttpRequest {
sock.close(); sock.close();
loseSocket(request.requestParameters.host, request.requestParameters.port, request.requestParameters.ssl, sock); loseSocket(request.requestParameters.host, request.requestParameters.port, request.requestParameters.ssl, sock);
hadAbortedRequest = true; hadAbortedRequest = true;
if(request.onDataReceived) request.onDataReceived(request);
continue; continue;
} }
@ -1923,6 +1925,8 @@ class HttpRequest {
sock.close(); sock.close();
loseSocket(request.requestParameters.host, request.requestParameters.port, request.requestParameters.ssl, sock); loseSocket(request.requestParameters.host, request.requestParameters.port, request.requestParameters.ssl, sock);
anyWorkDone = true; anyWorkDone = true;
if(request.onDataReceived) request.onDataReceived(request);
} }
} }
killInactives(); killInactives();
@ -1966,6 +1970,7 @@ class HttpRequest {
inactive[inactiveCount++] = s; inactive[inactiveCount++] = s;
s.close(); s.close();
loseSocket(request.requestParameters.host, request.requestParameters.port, request.requestParameters.ssl, s); loseSocket(request.requestParameters.host, request.requestParameters.port, request.requestParameters.ssl, s);
if(request.onDataReceived) request.onDataReceived(request);
} }
} }
@ -1992,6 +1997,7 @@ class HttpRequest {
inactive[inactiveCount++] = sock; inactive[inactiveCount++] = sock;
sock.close(); sock.close();
loseSocket(request.requestParameters.host, request.requestParameters.port, request.requestParameters.ssl, sock); loseSocket(request.requestParameters.host, request.requestParameters.port, request.requestParameters.ssl, sock);
if(request.onDataReceived) request.onDataReceived(request);
continue; continue;
} else { } else {
if(auto s = cast(SslClientSocket) sock) { if(auto s = cast(SslClientSocket) sock) {
@ -2031,6 +2037,7 @@ class HttpRequest {
inactive[inactiveCount++] = sock; inactive[inactiveCount++] = sock;
sock.close(); sock.close();
loseSocket(request.requestParameters.host, request.requestParameters.port, request.requestParameters.ssl, sock); loseSocket(request.requestParameters.host, request.requestParameters.port, request.requestParameters.ssl, sock);
if(request.onDataReceived) request.onDataReceived(request);
continue; continue;
} }
@ -2040,6 +2047,7 @@ class HttpRequest {
debug(arsd_http2_verbose) writeln("all sent"); debug(arsd_http2_verbose) writeln("all sent");
} }
if(request.onDataReceived) request.onDataReceived(request);
} }
@ -2047,7 +2055,7 @@ class HttpRequest {
keep_going: keep_going:
request.timeoutFromInactivity = MonoTime.currTime + request.requestParameters.timeoutFromInactivity; request.timeoutFromInactivity = MonoTime.currTime + request.requestParameters.timeoutFromInactivity;
auto got = sock.receive(buffer); auto got = sock.receive(buffer);
debug(arsd_http2_verbose) { if(got < 0) writeln(lastSocketError); else writeln("====PACKET ",got,"=====",cast(string)buffer[0 .. got],"===/PACKET==="); } debug(arsd_http2_verbose) { if(got < 0) writeln(lastSocketError(sock)); else writeln("====PACKET ",got,"=====",cast(string)buffer[0 .. got],"===/PACKET==="); }
if(got < 0) { if(got < 0) {
if(wouldHaveBlocked()) if(wouldHaveBlocked())
continue; continue;
@ -3623,8 +3631,8 @@ version(use_openssl) {
int function(SSL*, const void*, int) SSL_write; int function(SSL*, const void*, int) SSL_write;
int function(SSL*, void*, int) SSL_read; int function(SSL*, void*, int) SSL_read;
@trusted nothrow @nogc int function(SSL*) SSL_shutdown; @trusted nothrow @nogc int function(SSL*) SSL_shutdown;
void function(SSL*) SSL_free; void function(SSL*) @nogc nothrow SSL_free;
void function(SSL_CTX*) SSL_CTX_free; void function(SSL_CTX*) @nogc nothrow SSL_CTX_free;
int function(const SSL*) SSL_pending; int function(const SSL*) SSL_pending;
int function (const SSL *ssl, int ret) SSL_get_error; int function (const SSL *ssl, int ret) SSL_get_error;
@ -3691,6 +3699,11 @@ version(use_openssl) {
struct OpenSSL { struct OpenSSL {
static: static:
static Error notLoadedError;
static this() {
notLoadedError = new object.Error("will be overwritten");
}
template opDispatch(string name) { template opDispatch(string name) {
auto opDispatch(T...)(T t) { auto opDispatch(T...)(T t) {
static if(__traits(hasMember, ossllib, name)) { static if(__traits(hasMember, ossllib, name)) {
@ -3699,8 +3712,10 @@ version(use_openssl) {
auto ptr = __traits(getMember, eallib, name); auto ptr = __traits(getMember, eallib, name);
} else static assert(0); } else static assert(0);
if(ptr is null) if(ptr is null) {
throw new Exception(name ~ " not loaded"); notLoadedError.msg = name;
throw notLoadedError;//(name ~ " not loaded");
}
return ptr(t); return ptr(t);
} }
} }
@ -4067,9 +4082,10 @@ version(use_openssl) {
initSsl(verifyPeer, hostname); initSsl(verifyPeer, hostname);
} }
override void close() scope { override void close() scope @trusted {
if(ssl) OpenSSL.SSL_shutdown(ssl); if(ssl) OpenSSL.SSL_shutdown(ssl);
super.close(); super.close();
freeSsl();
} }
this(socket_t sock, AddressFamily af, string hostname, bool verifyPeer = true) { this(socket_t sock, AddressFamily af, string hostname, bool verifyPeer = true) {
@ -4077,7 +4093,7 @@ version(use_openssl) {
initSsl(verifyPeer, hostname); initSsl(verifyPeer, hostname);
} }
void freeSsl() { void freeSsl() @nogc nothrow {
if(ssl is null) if(ssl is null)
return; return;
OpenSSL.SSL_free(ssl); OpenSSL.SSL_free(ssl);