Changeset: 3dfbde27efd4 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/3dfbde27efd4
Modified Files:
clients/mapilib/connect.c
Branch: monetdburl
Log Message:
Always send the leader bytes
It also helps (depending on the server) to force a quick error when
connecting to an https server
We will actually use this in a test.
diffs (69 lines):
diff --git a/clients/mapilib/connect.c b/clients/mapilib/connect.c
--- a/clients/mapilib/connect.c
+++ b/clients/mapilib/connect.c
@@ -181,7 +181,6 @@ wrap_socket(Mapi mid, SOCKET sock)
msg = mapi_set_streams(mid, rstream, wstream);
if (msg != MOK)
goto bailout;
- mapi_log_record(mid, "CONN", "Network connection established");
return MOK;
bailout:
@@ -271,28 +270,37 @@ connect_socket_tcp(Mapi mid)
return mapi_setError(mid, "connected to self", __func__,
MERROR);
}
- if (use_tls) {
- mapi_log_record(mid, "CONN", "Network connection established");
- return wrap_tls(mid, s);
- } else {
- // Some TLS servers hang if we accidentally make a non-TLS
- // connection to a TLS server. Sending a bunch of NULs causes
- // some of them to close the connection instead of hanging.
- // Also, surprisingly, it seems to make connection setup
- // slightly faster with non-TLS servers.
- static const char zeroes[8] = { 0 };
- ssize_t to_write = sizeof(zeroes);
- while (to_write > 0) {
- ssize_t n = send(s, zeroes, (int)to_write, 0);
- if (n < 0) {
- closesocket(s);
- return mapi_printError(mid, __func__, MERROR,
"could not send leader block: %s", SOCKET_STRERROR());
- }
- to_write -= (size_t)n;
+ mapi_log_record(mid, "CONN", "Network connection established");
+ MapiMsg msg = use_tls ? wrap_tls(mid, s) : wrap_socket(mid, s);
+ if (msg != MOK)
+ return msg;
+
+ // Send some NUL bytes. If we're accidentally connecting to the wrong
+ // port or protocol this may cause the remote server to close the
+ // connection. If we don't do this, the connection will often hang
+ // because the server expects us to speak first and we expect the server
+ // to speak first.
+ //
+ // Note that a pair of NUL bytes is a no-op message in MAPI.
+ //
+ // Surprisingly, it seems sending these NUL bytes makes non-TLS
+ // connection setup a little faster rather than slower!
+ static const char zeroes[8] = { 0 };
+ ssize_t to_write = sizeof(zeroes);
+ while (to_write > 0) {
+ ssize_t n = mnstr_write(mid->to, zeroes, 1, to_write);
+ if (n < 0) {
+ close_connection(mid);
+ return mapi_printError(mid, __func__, MERROR, "could
not send leader block: %s", mnstr_peek_error(mid->to));
}
- return wrap_socket(mid, s);
+ to_write -= (size_t)n;
}
- assert(0 && "unreachable");
+ if (mnstr_flush(mid->to, MNSTR_FLUSH_DATA) != 0) {
+ close_connection(mid);
+ return mapi_printError(mid, __func__, MERROR, "could not flush
leader block: %s", mnstr_peek_error(mid->to));
+ }
+
+ return msg;
}
static SOCKET
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]