Skip to content

Commit c1b9b63

Browse files
authored
Merge pull request #40 from libwww-perl/skaji/url
prefer ip address for host in $d->url
2 parents 9022b88 + ec34824 commit c1b9b63

2 files changed

Lines changed: 70 additions & 46 deletions

File tree

lib/HTTP/Daemon.pm

Lines changed: 8 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@ use warnings;
77

88
our $VERSION = '6.07';
99

10-
use Socket qw(
11-
AF_INET AF_INET6 INADDR_ANY IN6ADDR_ANY INADDR_LOOPBACK IN6ADDR_LOOPBACK
12-
inet_ntop sockaddr_family
13-
);
10+
use Socket ();
1411
use IO::Socket::IP;
1512
our @ISA = qw(IO::Socket::IP);
1613

@@ -48,48 +45,13 @@ sub accept {
4845

4946
sub url {
5047
my $self = shift;
51-
my $url = $self->_default_scheme . "://";
52-
my $addr = $self->sockaddr;
53-
if (!$addr || $addr eq INADDR_ANY || $addr eq IN6ADDR_ANY) {
54-
require Sys::Hostname;
55-
$url .= lc Sys::Hostname::hostname();
56-
}
57-
elsif ($addr eq INADDR_LOOPBACK) {
58-
$url .= inet_ntop(AF_INET, $addr);
59-
}
60-
elsif ($addr eq IN6ADDR_LOOPBACK) {
61-
$url .= '[' . inet_ntop(AF_INET6, $addr) . ']';
62-
}
63-
else {
64-
my $host = $self->sockhostname;
65-
66-
# sockhostname() seems to return a stringified IP address if not
67-
# resolvable. Then quote it for a port separator and an IPv6 zone
68-
# separator. But be paranoid for a case when it already contains
69-
# a bracket.
70-
if (defined $host and $host =~ /:/) {
71-
if ($host =~ /[\[\]]/) {
72-
$host = undef;
73-
}
74-
else {
75-
$host =~ s/%/%25/g;
76-
$host = '[' . $host . ']';
77-
}
78-
}
79-
if (!defined $host) {
80-
my $family = sockaddr_family($self->sockname);
81-
if ($family && $family == AF_INET6) {
82-
$host = '[' . inet_ntop(AF_INET6, $addr) . ']';
83-
}
84-
elsif ($family && $family == AF_INET) {
85-
$host = inet_ntop(AF_INET, $addr);
86-
}
87-
else {
88-
die "Unknown family";
89-
}
90-
}
91-
$url .= $host;
92-
}
48+
49+
my $host = $self->sockhost;
50+
$host = "127.0.0.1" if $host eq "0.0.0.0";
51+
$host = "::1" if $host eq "::";
52+
$host = "[$host]" if $self->sockdomain == Socket::AF_INET6;
53+
54+
my $url = $self->_default_scheme . "://" . $host;
9355
my $port = $self->sockport;
9456
$url .= ":$port" if $port != $self->_default_port;
9557
$url .= "/";

t/url.t

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
use strict;
2+
use warnings;
3+
4+
use Test::More 0.98;
5+
6+
use Config;
7+
use HTTP::Daemon;
8+
use HTTP::Response;
9+
use HTTP::Tiny;
10+
11+
my $can_fork
12+
= $Config{d_fork}
13+
|| (($^O eq 'MSWin32' || $^O eq 'NetWare')
14+
and $Config{useithreads}
15+
and $Config{ccflags} =~ /-DPERL_IMPLICIT_SYS/);
16+
17+
plan skip_all => "This system cannot fork" if !$can_fork;
18+
19+
my $d = HTTP::Daemon->new or die "HTTP::Daemon->new: $!";
20+
21+
my $url = $d->url;
22+
note "url: $url";
23+
24+
my $pid = fork;
25+
die "fork: $!" if !defined $pid;
26+
27+
if ($pid == 0) {
28+
my $http = HTTP::Tiny->new(
29+
timeout => 3,
30+
proxy => undef,
31+
http_proxy => undef,
32+
https_proxy => undef,
33+
);
34+
my $res;
35+
eval {
36+
local $SIG{ALRM} = sub { die "alarm\n" };
37+
alarm 4;
38+
$res = $http->get($url);
39+
};
40+
my $err = $@;
41+
alarm 0;
42+
exit if $res && $res->{success};
43+
if ($err) {
44+
diag $err;
45+
}
46+
if ($res) {
47+
diag "$res->{status} $res->{reason}";
48+
diag $res->{content} if $res->{status} == 599;
49+
}
50+
exit 1;
51+
}
52+
53+
my $c = $d->accept or die "accept: $!";
54+
my $req = $c->get_request;
55+
$c->send_response(HTTP::Response->new(200));
56+
$c->close;
57+
$d->close;
58+
59+
wait;
60+
is $?, 0;
61+
62+
done_testing;

0 commit comments

Comments
 (0)