Skip to content

Commit 9413f03

Browse files
committed
Fixes to dorszman's SSL async pull request
* verify added test passes * fix for non-SSL connections * make remaining tests pass
1 parent 40adaeb commit 9413f03

File tree

1 file changed

+49
-29
lines changed

1 file changed

+49
-29
lines changed

lib/HTTP/Async.pm

+49-29
Original file line numberDiff line numberDiff line change
@@ -545,19 +545,16 @@ sub DESTROY {
545545

546546
#Handles timeout processing for a given http reguest
547547
#Returns 1 if timeout expipres. Calcultes next timeout_at
548-
sub handle_timeout {
548+
sub _handle_timeout {
549549
my $self = shift;
550550
my $hashref = shift;
551551

552552
my $id = $hashref->{id};
553553
my $s = $hashref->{handle};
554554

555-
556555
# Check that we have not timed-out.
557556
if ( time > $hashref->{timeout_at}
558-
|| time > $hashref->{finish_by} )
559-
{
560-
557+
|| time > $hashref->{finish_by} ) {
561558
# warn sprintf "Timeout: %.3f > %.3f", #
562559
# time, $hashref->{timeout_at};
563560

@@ -569,32 +566,30 @@ sub handle_timeout {
569566
content => 'Timed out',
570567
);
571568

572-
$self->_io_select->remove($s);
569+
$self->_remove_io_select($s);
573570
delete $$self{fileno_to_id}{ $s->fileno };
574571
return 1;
575572
}
576573

577-
# Reset the timeout.
578-
$hashref->{timeout_at} = time + $self->_get_opt( 'timeout', $id );
579-
# warn "recieved - timeout set to '$hashref->{timeout_at}'";
580574

581575
return 0;
582-
583-
584576
}
585577

586578
#Handles async ssl connection. Should be called repeatedly until ssl connection is fully established
587-
sub handle_ssl {
579+
sub _handle_ssl {
588580
my $self = shift;
589581
my $hashref = shift;
590582

591583
my $id = $hashref->{id};
592584
my $s = $hashref->{handle};
585+
my $reset_timeout = 0;
593586

594587
if (defined($s->connect_SSL()))
595588
{
596589
$hashref->{ssl_connected} = 1;
597-
$self->write_request($hashref);
590+
$self->_write_request($hashref);
591+
$reset_timeout = 1;
592+
$self->_io_write_select->remove($s); # remove from write only
598593
}
599594
elsif ($! == EWOULDBLOCK)
600595
{
@@ -610,10 +605,16 @@ sub handle_ssl {
610605
'request' => $hashref->{request},
611606
'previous' => $hashref->{previous}
612607
);
613-
$self->_io_select->remove($s);
608+
$self->_remove_io_select($s);
614609
delete $$self{fileno_to_id}{ $s->fileno };
615610
}
616611

612+
if ( $reset_timeout )
613+
{
614+
# Reset the timeout.
615+
$hashref->{timeout_at} = time + $self->_get_opt( 'timeout', $id );
616+
# warn "recieved - timeout set to '$hashref->{timeout_at}'";
617+
}
617618
}
618619

619620
# Go through all the values on the select list and check to see if
@@ -624,7 +625,7 @@ sub _process_in_progress {
624625
my %seen_ids = ();
625626

626627
HANDLE_WRITE:
627-
foreach my $s ($self->_io_select->can_write(0))
628+
foreach my $s ($self->_io_write_select->can_write(0))
628629
{
629630
my $id = $self->{fileno_to_id}{ $s->fileno }
630631
|| die "INTERNAL ERROR: could not got id for fileno";
@@ -633,17 +634,18 @@ sub _process_in_progress {
633634
my $hashref = $$self{in_progress}{$id};
634635

635636
# only pending ssl connection requires writes
636-
if (!defined($hashref->{ssl_connected}) || $hashref->{ssl_connected} )
637+
if ( !defined($hashref->{ssl_connected}) || $hashref->{ssl_connected} )
637638
{
639+
# FIXME: possible error here?
638640
next HANDLE_WRITE;
639641
}
640642

641-
if ($self->handle_timeout($hashref))
643+
if ($self->_handle_timeout($hashref))
642644
{
643645
next HANDLE_WRITE;
644646
}
645647

646-
$self->handle_ssl($hashref);
648+
$self->_handle_ssl($hashref);
647649
}
648650

649651
HANDLE_READ:
@@ -660,15 +662,15 @@ sub _process_in_progress {
660662

661663
# warn Dumper $hashref;
662664

663-
if ($self->handle_timeout($hashref))
665+
if ($self->_handle_timeout($hashref))
664666
{
665667
next HANDLE_READ;
666668
}
667669

668670
# only pending ssl connection requires writes
669671
if (defined($hashref->{ssl_connected}) && !$hashref->{ssl_connected} )
670672
{
671-
$self->handle_ssl($hashref);
673+
$self->_handle_ssl($hashref);
672674

673675
next HANDLE_READ;
674676
}
@@ -704,7 +706,7 @@ sub _process_in_progress {
704706
'request' => $hashref->{request},
705707
'previous' => $hashref->{previous}
706708
);
707-
$self->_io_select->remove($s);
709+
$self->_remove_io_select($s);
708710
delete $$self{fileno_to_id}{ $s->fileno };
709711
next HANDLE_READ;
710712
}
@@ -721,11 +723,15 @@ sub _process_in_progress {
721723
}
722724
}
723725

726+
# Reset the timeout.
727+
$hashref->{timeout_at} = time + $self->_get_opt( 'timeout', $id );
728+
# warn "recieved - timeout set to '$hashref->{timeout_at}'";
729+
724730
# If the message is complete then create a request and add it
725731
# to 'to_return';
726732
if ( $$tmp{is_complete} ) {
727733
delete $$self{fileno_to_id}{ $s->fileno };
728-
$self->_io_select->remove($s);
734+
$self->_remove_io_select($s);
729735

730736
# warn Dumper $$hashref{content};
731737

@@ -832,7 +838,7 @@ sub _process_in_progress {
832838
);
833839

834840
my $s = $hashref->{handle};
835-
$self->_io_select->remove($s);
841+
$self->_remove_io_select($s);
836842
delete $$self{fileno_to_id}{ $s->fileno };
837843
}
838844
}
@@ -934,10 +940,9 @@ sub _send_request {
934940
);
935941
}
936942
my $s = eval { $net_http_class->new(%args) };
937-
938943
# We could not create a request - fake up a 503 response with
939944
# error as content.
940-
if (!$s || defined($s->connect_SSL()) || $! != EWOULDBLOCK)
945+
if (!$s || ( $ssl_en && ( defined($s->connect_SSL()) || $! != EWOULDBLOCK) ) )
941946
{
942947
$self->_add_error_response_to_return(
943948
id => $id,
@@ -970,7 +975,6 @@ sub _send_request {
970975
# 0: ssl https, conenction is not fully established yet
971976
# 1: ssl https, connection is ready, possible to conitnue with send_request
972977
$entry->{ssl_connected} = $ssl_en ? 0 : undef;
973-
974978

975979
$entry->{timeout_at} = $time + $self->_get_opt( 'timeout', $id );
976980
# warn "sent - timeout set to '$entry->{timeout_at}'";
@@ -981,11 +985,18 @@ sub _send_request {
981985
$entry->{redirects_left} = $self->_get_opt( 'max_redirect', $id )
982986
unless exists $entry->{redirects_left};
983987

988+
if ( $ssl_en ) {
989+
$self->_io_write_select->add($s); # only add SSL requests to the can_write IO select
990+
}
991+
else {
992+
$self->_write_request($entry);
993+
}
994+
984995
return 1;
985996
}
986997

987998
#write_request is called after ssl_connection is fully established to transmit an http request over the ssl
988-
sub write_request {
999+
sub _write_request {
9891000
my $this = shift;
9901001
my $entry = shift;
9911002

@@ -1002,8 +1013,6 @@ sub write_request {
10021013
croak "Could not write request to @{[$request->uri]} '$!'"
10031014
unless $entry->{handle}->write_request( $request->method, $request_uri, %headers,
10041015
$request->content );
1005-
1006-
10071016
}
10081017

10091018
sub _strip_host_from_uri {
@@ -1023,6 +1032,17 @@ sub _io_select {
10231032
return $$self{io_select} ||= IO::Select->new();
10241033
}
10251034

1035+
sub _io_write_select {
1036+
my $self = shift;
1037+
return $$self{io_write_select} ||= IO::Select->new();
1038+
}
1039+
1040+
sub _remove_io_select {
1041+
my ($self,$s) = @_;
1042+
$self->_io_select->remove($s);
1043+
$self->_io_write_select->remove($s);
1044+
}
1045+
10261046
sub _make_url_absolute {
10271047
my %args = @_;
10281048

0 commit comments

Comments
 (0)