mwrap (Perl version) user+dev discussion/patches/pulls/bugs/help
 help / color / mirror / code / Atom feed
From: Eric Wong <e@80x24.org>
To: mwrap-perl@80x24.org
Cc: Eric Wong <normalperson@yhbt.net>
Subject: [PATCH 2/4] t/mwrap-httpd: better errors for local socket failures
Date: Sat, 10 Dec 2022 10:01:42 +0000	[thread overview]
Message-ID: <20221210100144.19796-3-e@80x24.org> (raw)
In-Reply-To: <20221210100144.19796-1-e@80x24.org>

From: Eric Wong <normalperson@yhbt.net>

The syswrite() needs to be replaced by send(.*MSG_NOSIGNAL),
but I'm ignoring SIGPIPE anyways in case connect() somehow
triggers it.  In any case, I'm noticing the local socket
created in Perl (not curl) sometimes fails the first send/write
and/or fails the second send/write syscall.  Maybe this can
help diagnose things...
---
 t/mwrap-httpd.t | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)

diff --git a/t/mwrap-httpd.t b/t/mwrap-httpd.t
index a1bf333..b7076de 100644
--- a/t/mwrap-httpd.t
+++ b/t/mwrap-httpd.t
@@ -37,16 +37,16 @@ my $cleanup = sub {
 END { $cleanup->() }
 
 my $sock = "$mwrap_tmp/$pid.sock";
-my $n = 10000;
-my $c;
 my %o = (Peer => $sock , Type => SOCK_STREAM);
-while (!$c && --$n > 0) {
-	$c = IO::Socket::UNIX->new(%o) or
-		select undef, undef, undef, 0.011;
+local $SIG{PIPE} = 'IGNORE';
+my $c;
+for (1..10000) {
+	last if -S $sock && ($c = IO::Socket::UNIX->new(%o));
+	select undef, undef, undef, 0.011;
 }
 ok(-S $sock, 'socket created');
 ok($c, 'socket connected');
-is(syswrite($c, 'GET'), 3, 'trickled 3 bytes');
+is(send($c, 'GET', MSG_NOSIGNAL), 3, 'trickled 3 bytes') or diag "send: $!";
 
 my $cout = "$mwrap_tmp/cout";
 my $rc = system(qw(curl -vsSf --unix-socket), $sock, '-o', $cout,
@@ -67,12 +67,11 @@ SKIP: {
 	is($rc, 0, 'curl /reset');
 };
 
-local $SIG{PIPE} = 'IGNORE';
 {
 	my $req = " /$pid/each/20000 HTTP/1.0\r\n\r\n";
-	is(syswrite($c, $req), length($req), 'wrote rest of response') or
-		diag "syswrite: $!";
-	my $x = do { local $/; <$c> } or diag "read: $!";
+	is(send($c, $req, MSG_NOSIGNAL), length($req),
+		'wrote rest of response') or diag "send: $!";
+	my $x = do { local $/; <$c> } or diag "readline: $!";
 	like($x, qr!</html>\n?\z!s, 'got complete HTML response');
 }
 

  parent reply	other threads:[~2022-12-10 10:01 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-10 10:01 [PATCH 0/4] httpd fixes Eric Wong
2022-12-10 10:01 ` [PATCH 1/4] t/httpd-unit: extra test for fencepost errors Eric Wong
2022-12-10 20:45   ` Eric Wong
2022-12-10 10:01 ` Eric Wong [this message]
2022-12-10 10:01 ` [PATCH 3/4] rproxy: fix for `plackup --path=/$PREFIX/' mounts Eric Wong
2022-12-10 10:01 ` [PATCH 4/4] httpd: fix leaks when using persistent connections Eric Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221210100144.19796-3-e@80x24.org \
    --to=e@80x24.org \
    --cc=mwrap-perl@80x24.org \
    --cc=normalperson@yhbt.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mwrap-perl.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).