| 76 | | if ($service_role eq "reverse_proxy") { |
|---|
| 77 | | Perlbal::ClientProxy->new($self->{service}, $psock); |
|---|
| 78 | | } elsif ($service_role eq "management") { |
|---|
| 79 | | Perlbal::ClientManage->new($self->{service}, $psock); |
|---|
| 80 | | } elsif ($service_role eq "web_server") { |
|---|
| 81 | | Perlbal::ClientHTTP->new($self->{service}, $psock); |
|---|
| 82 | | } elsif ($service_role eq "selector") { |
|---|
| 83 | | # will be cast to a more specific class later... |
|---|
| 84 | | Perlbal::ClientHTTPBase->new($self->{service}, $psock, $self->{service}); |
|---|
| 85 | | } elsif (my $creator = Perlbal::Service::get_role_creator($service_role)) { |
|---|
| 86 | | # was defined by a plugin, so we want to return one of these |
|---|
| 87 | | $creator->($self->{service}, $psock); |
|---|
| | 66 | if (Perlbal::DEBUG >= 1) { |
|---|
| | 67 | my ($pport, $pipr) = Socket::sockaddr_in($peeraddr); |
|---|
| | 68 | my $pip = Socket::inet_ntoa($pipr); |
|---|
| | 69 | print "Got new conn: $psock ($pip:$pport) for " . $self->{service}->role . "\n"; |
|---|
| | 72 | # SSL promotion if necessary |
|---|
| | 73 | if ($self->{sslopts}) { |
|---|
| | 74 | # try to upgrade to SSL, this does no IO it just reblesses |
|---|
| | 75 | # and prepares the SSL engine for handling us later |
|---|
| | 76 | IO::Socket::SSL->start_SSL( |
|---|
| | 77 | $psock, |
|---|
| | 78 | SSL_server => 1, |
|---|
| | 79 | SSL_startHandshake => 0, |
|---|
| | 80 | %{ $self->{sslopts} }, |
|---|
| | 81 | ); |
|---|
| | 82 | print " .. socket upgraded to SSL!\n" if Perlbal::DEBUG >= 1; |
|---|
| | 83 | |
|---|
| | 84 | # safety checking to ensure we got upgraded |
|---|
| | 85 | return $psock->close |
|---|
| | 86 | unless ref $psock eq 'IO::Socket::SSL'; |
|---|
| | 87 | |
|---|
| | 88 | # class into new package and run with it |
|---|
| | 89 | my $sslsock = new Perlbal::SocketSSL($psock, $self); |
|---|
| | 90 | $sslsock->try_accept; |
|---|
| | 91 | |
|---|
| | 92 | # all done from our point of view |
|---|
| | 93 | next; |
|---|
| | 94 | } |
|---|
| | 95 | |
|---|
| | 96 | # puts this socket into the right class |
|---|
| | 97 | $self->class_new_socket($psock); |
|---|
| | 98 | } |
|---|
| | 99 | } |
|---|
| | 100 | |
|---|
| | 101 | sub class_new_socket { |
|---|
| | 102 | my Perlbal::TCPListener $self = shift; |
|---|
| | 103 | my $psock = shift; |
|---|
| | 104 | |
|---|
| | 105 | my $service_role = $self->{service}->role; |
|---|
| | 106 | if ($service_role eq "reverse_proxy") { |
|---|
| | 107 | Perlbal::ClientProxy->new($self->{service}, $psock); |
|---|
| | 108 | } elsif ($service_role eq "management") { |
|---|
| | 109 | Perlbal::ClientManage->new($self->{service}, $psock); |
|---|
| | 110 | } elsif ($service_role eq "web_server") { |
|---|
| | 111 | Perlbal::ClientHTTP->new($self->{service}, $psock); |
|---|
| | 112 | } elsif ($service_role eq "selector") { |
|---|
| | 113 | # will be cast to a more specific class later... |
|---|
| | 114 | Perlbal::ClientHTTPBase->new($self->{service}, $psock, $self->{service}); |
|---|
| | 115 | } elsif (my $creator = Perlbal::Service::get_role_creator($service_role)) { |
|---|
| | 116 | # was defined by a plugin, so we want to return one of these |
|---|
| | 117 | $creator->($self->{service}, $psock); |
|---|