unofficial mirror of meta@public-inbox.org
 help / color / mirror / Atom feed
* [PATCH 0/2] daemon updates
@ 2016-03-03  9:32 Eric Wong
  2016-03-03  9:32 ` [PATCH 1/2] daemon: avoid polluting the main package Eric Wong
  2016-03-03  9:32 ` [PATCH 2/2] daemon: introduce host_with_port for identifying sockets Eric Wong
  0 siblings, 2 replies; 3+ messages in thread
From: Eric Wong @ 2016-03-03  9:32 UTC (permalink / raw)
  To: meta

Preparation work for Unix socket listeners.

Eric Wong (2):
      daemon: avoid polluting the main package
      daemon: introduce host_with_port for identifying sockets

 lib/PublicInbox/Daemon.pm | 31 ++++++++++++++++---------------
 lib/PublicInbox/HTTP.pm   |  8 +++++---
 script/public-inbox-httpd | 14 +++-----------
 script/public-inbox-nntpd |  2 +-
 t/httpd-corner.psgi       |  3 +++
 t/httpd-corner.t          | 10 ++++++++++
 6 files changed, 38 insertions(+), 30 deletions(-)

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] daemon: avoid polluting the main package
  2016-03-03  9:32 [PATCH 0/2] daemon updates Eric Wong
@ 2016-03-03  9:32 ` Eric Wong
  2016-03-03  9:32 ` [PATCH 2/2] daemon: introduce host_with_port for identifying sockets Eric Wong
  1 sibling, 0 replies; 3+ messages in thread
From: Eric Wong @ 2016-03-03  9:32 UTC (permalink / raw)
  To: meta

We've distilled the daemon code into one public function ("run"),
so avoid polluting the main namespace and just have users
prefix with the full package name for this rarely-used class.
---
 lib/PublicInbox/Daemon.pm | 6 ++----
 script/public-inbox-httpd | 2 +-
 script/public-inbox-nntpd | 2 +-
 3 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/lib/PublicInbox/Daemon.pm b/lib/PublicInbox/Daemon.pm
index 45c1563..77ab2a7 100644
--- a/lib/PublicInbox/Daemon.pm
+++ b/lib/PublicInbox/Daemon.pm
@@ -1,10 +1,8 @@
 # Copyright (C) 2015 all contributors <meta@public-inbox.org>
 # License: AGPLv3 or later (https://www.gnu.org/licenses/agpl-3.0.txt)
-package PublicInbox::Daemon; # empty class :p
-
 # contains common daemon code for the nntpd and httpd servers.
 # This may be used for read-only IMAP server if we decide to implement it.
-package main;
+package PublicInbox::Daemon;
 use strict;
 use warnings;
 use Getopt::Long qw/:config gnu_getopt no_ignore_case auto_abbrev/;
@@ -383,7 +381,7 @@ sub daemon_loop ($$) {
 }
 
 
-sub daemon_run ($$$) {
+sub run ($$$) {
 	my ($default, $refresh, $post_accept) = @_;
 	daemon_prepare($default);
 	daemonize();
diff --git a/script/public-inbox-httpd b/script/public-inbox-httpd
index 2157962..d867b47 100755
--- a/script/public-inbox-httpd
+++ b/script/public-inbox-httpd
@@ -49,7 +49,7 @@ my $refresh = sub {
 	}
 };
 
-daemon_run('0.0.0.0:8080', $refresh,
+PublicInbox::Daemon::run('0.0.0.0:8080', $refresh,
 	sub ($$$) { # post_accept
 		my ($client, $addr, $srv) = @_;
 		my $fd = fileno($srv);
diff --git a/script/public-inbox-nntpd b/script/public-inbox-nntpd
index 23d269d..cea8816 100755
--- a/script/public-inbox-nntpd
+++ b/script/public-inbox-nntpd
@@ -10,7 +10,7 @@ require PublicInbox::NewsGroup;
 require PublicInbox::NNTP;
 require PublicInbox::Config;
 my $nntpd = PublicInbox::NNTPD->new;
-daemon_run('0.0.0.0:119',
+PublicInbox::Daemon::run('0.0.0.0:119',
 	sub { $nntpd->refresh_groups }, # refresh
 	sub ($$$) { PublicInbox::NNTP->new($_[0], $nntpd) }); # post_accept
 
-- 
EW


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] daemon: introduce host_with_port for identifying sockets
  2016-03-03  9:32 [PATCH 0/2] daemon updates Eric Wong
  2016-03-03  9:32 ` [PATCH 1/2] daemon: avoid polluting the main package Eric Wong
@ 2016-03-03  9:32 ` Eric Wong
  1 sibling, 0 replies; 3+ messages in thread
From: Eric Wong @ 2016-03-03  9:32 UTC (permalink / raw)
  To: meta

This allows us to share more code between daemons and avoids
having to make additional syscalls for preparing REMOTE_HOST
and REMOTE_PORT in the PSGI env in -httpd.

This will also make supporting HTTP (and NNTP) over Unix sockets
easier in a future commit.
---
 lib/PublicInbox/Daemon.pm | 25 ++++++++++++++-----------
 lib/PublicInbox/HTTP.pm   |  8 +++++---
 script/public-inbox-httpd | 12 ++----------
 t/httpd-corner.psgi       |  3 +++
 t/httpd-corner.t          | 10 ++++++++++
 5 files changed, 34 insertions(+), 24 deletions(-)

diff --git a/lib/PublicInbox/Daemon.pm b/lib/PublicInbox/Daemon.pm
index 77ab2a7..c101ecb 100644
--- a/lib/PublicInbox/Daemon.pm
+++ b/lib/PublicInbox/Daemon.pm
@@ -157,20 +157,23 @@ sub reopen_logs {
 
 sub sockname ($) {
 	my ($s) = @_;
-	my $n = getsockname($s) or return;
-	my ($port, $addr);
-	if (length($n) >= 28) {
+	my $addr = getsockname($s) or return;
+	my ($host, $port) = host_with_port($addr);
+	"$host:$port";
+}
+
+sub host_with_port ($) {
+	my ($addr) = @_;
+	my ($port, $host);
+	if (length($addr) >= 28) {
 		require Socket6;
-		($port, $addr) = Socket6::unpack_sockaddr_in6($n);
-	} else {
-		($port, $addr) = Socket::sockaddr_in($n);
-	}
-	if (length($addr) == 4) {
-		$n = Socket::inet_ntoa($addr)
+		($port, $host) = Socket6::unpack_sockaddr_in6($addr);
+		$host = '['.Socket6::inet_ntop(Socket6::AF_INET6(), $host).']';
 	} else {
-		$n = '['.Socket6::inet_ntop(Socket6::AF_INET6(), $addr).']';
+		($port, $host) = Socket::sockaddr_in($addr);
+		$host = Socket::inet_ntoa($host);
 	}
-	$n .= ":$port";
+	($host, $port);
 }
 
 sub inherit () {
diff --git a/lib/PublicInbox/HTTP.pm b/lib/PublicInbox/HTTP.pm
index 17e7447..6c4c20d 100644
--- a/lib/PublicInbox/HTTP.pm
+++ b/lib/PublicInbox/HTTP.pm
@@ -11,7 +11,7 @@ package PublicInbox::HTTP;
 use strict;
 use warnings;
 use base qw(Danga::Socket);
-use fields qw(httpd env rbuf input_left);
+use fields qw(httpd env rbuf input_left remote_addr remote_port);
 use Fcntl qw(:seek);
 use HTTP::Parser::XS qw(parse_http_request); # supports pure Perl fallback
 use HTTP::Status qw(status_message);
@@ -38,6 +38,8 @@ sub new ($$$) {
 	$self->SUPER::new($sock);
 	$self->{httpd} = $httpd;
 	$self->{rbuf} = '';
+	($self->{remote_addr}, $self->{remote_port}) =
+		PublicInbox::Daemon::host_with_port($addr);
 	$self->watch_read(1);
 	$self;
 }
@@ -113,8 +115,8 @@ sub app_dispatch ($) {
 	my ($self) = @_;
 	$self->watch_read(0);
 	my $env = $self->{env};
-	$env->{REMOTE_ADDR} = $self->peer_ip_string; # Danga::Socket
-	$env->{REMOTE_PORT} = $self->{peer_port}; # set by peer_ip_string
+	$env->{REMOTE_ADDR} = $self->{remote_addr};
+	$env->{REMOTE_PORT} = $self->{remote_port};
 	if (my $host = $env->{HTTP_HOST}) {
 		$host =~ s/:(\d+)\z// and $env->{SERVER_PORT} = $1;
 		$env->{SERVER_NAME} = $host;
diff --git a/script/public-inbox-httpd b/script/public-inbox-httpd
index d867b47..b6c4e67 100755
--- a/script/public-inbox-httpd
+++ b/script/public-inbox-httpd
@@ -99,18 +99,10 @@ sub pi_httpd_async {
 sub new {
 	my ($class, $sock, $app) = @_;
 	my $n = getsockname($sock) or die "not a socket: $sock $!\n";
-	my ($port, $addr);
-	if (length($n) >= 28) {
-		require Socket6;
-		($port, $addr) = Socket6::unpack_sockaddr_in6($n);
-	} else {
-		($port, $addr) = Socket::unpack_sockaddr_in($n);
-	}
+	my ($host, $port) = PublicInbox::Daemon::host_with_port($n);
 
 	my %env = (
-		REMOTE_HOST => '',
-		REMOTE_PORT => 0,
-		SERVER_NAME => $addr,
+		SERVER_NAME => $host,
 		SERVER_PORT => $port,
 		SCRIPT_NAME => '',
 		'psgi.version' => [ 1, 1 ],
diff --git a/t/httpd-corner.psgi b/t/httpd-corner.psgi
index c3bf523..349b35d 100644
--- a/t/httpd-corner.psgi
+++ b/t/httpd-corner.psgi
@@ -44,6 +44,9 @@ my $app = sub {
 				$fh->close;
 			};
 		}
+	} elsif ($path eq '/host-port') {
+		$code = 200;
+		push @$body, "$env->{REMOTE_ADDR}:$env->{REMOTE_PORT}";
 	}
 
 	[ $code, $h, $body ]
diff --git a/t/httpd-corner.t b/t/httpd-corner.t
index e73ebd5..198a7e9 100644
--- a/t/httpd-corner.t
+++ b/t/httpd-corner.t
@@ -76,6 +76,16 @@ sub conn_for {
 	return $conn;
 }
 
+{
+	my $conn = conn_for($sock, 'host-port');
+	$conn->write("GET /host-port HTTP/1.0\r\n\r\n");
+	$conn->read(my $buf, 4096);
+	my ($head, $body) = split(/\r\n\r\n/, $buf);
+	my ($addr, $port) = split(/:/, $body);
+	is($addr, $conn->sockhost, 'host matches addr');
+	is($port, $conn->sockport, 'port matches');
+}
+
 # graceful termination
 {
 	my $conn = conn_for($sock, 'graceful termination via slow header');
-- 
EW


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-03-03  9:32 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-03  9:32 [PATCH 0/2] daemon updates Eric Wong
2016-03-03  9:32 ` [PATCH 1/2] daemon: avoid polluting the main package Eric Wong
2016-03-03  9:32 ` [PATCH 2/2] daemon: introduce host_with_port for identifying sockets Eric Wong

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).