Apache-AppCluster

 view release on metacpan or  search on metacpan

Server/t/lib/Apache/AppCluster/Client.pm  view on Meta::CPAN

			my $href = {
				method => $self->{_requests}->{$index}->{method},
				params => $self->{_requests}->{$index}->{params},
				};

			my $data = freeze($href);
			my $digest = md5_hex($data);
			my $send_data = '<frozen>' . $digest . $data . '</frozen>';
			my $content_length = length($send_data);
			my $uri = $self->{_requests}->{$index}->{uri};
			my $host = $self->{_requests}->{$index}->{server};

#I'm guessing that octet-stream is the correct mime type for this sort of thing.
			print {$self->{_requests}->{$index}->{sock}} <<"EOF";
POST $uri HTTP/1.0
Accept: application/octet-stream
Accept: */*
Host: $host
Connection: close
User-Agent: Apache::AppCluster::Client v0.1
Content-Length: $content_length
Content-Type: application/octet-stream;

$send_data
EOF

			$self->{_requests}->{$index}->{sock}->flush();
		}
	}





	my $cutoff_time = Time::HiRes::time() + $timeout;

	my $sockets_pending = $connected_sockets;

	while((Time::HiRes::time() < $cutoff_time) && $sockets_pending)
	{
		my $sockets_finished = 0;
		foreach my $index (keys %{$self->{_requests}})
		{
			if($self->{_requests}->{$index}->{status} == REQ_INCOMPLETE) 
			{
				my $buf;
				my $bytes_read = sysread($self->{_requests}->{$index}->{sock}, $buf, 1024);
				if(defined($bytes_read) )
				{
					if($bytes_read == 0)
					{
						close($self->{_requests}->{$index}->{sock});
						$self->{_requests}->{$index}->{status} = REQ_SUCCESS; #finished
						$sockets_pending--;
					} else
					{
						$self->{_requests}->{$index}->{data} .= $buf;
					}
				} else #no data to read yet
				{
					if($! == EAGAIN()) #socket would have blocked
					{
						#keep going until there is more data on the socket
					} else
					{
						$self->{_requests}->{$index}->{status} = REQ_SUCCESS;
						$sockets_pending--;
					}
				}
			} 
		}
		
	}

	foreach my $index (keys %{$self->{_requests}})
	{
		if($self->{_requests}->{$index}->{status} == REQ_SUCCESS)
		{
			if($self->{_requests}->{$index}->{data} =~ m/<frozen>(.*)<\/frozen>/s)
			{
				my $input = $1;
				my $digest = substr($input, 0, 32);
				my $data = substr($input, 32);
				my $response;
				if($digest eq md5_hex($data))
				{
					$response = thaw($data);
					if($response->{status} == SRV_SUCCESS) #remote success
					{
						$self->{_requests}->{$index}->{data} = $response->{data};
						$self->{_total_success}++;
					} else
					{
						$self->{_requests}->{$index}->{data} = undef;
						$self->{_requests}->{$index}->{status} = $response->{status};
						$self->{_requests}->{$index}->{method_error} = $response->{method_error};
						$self->{_total_failed}++;
					}
				} else
				{
					warn "Digest failed." if($VERBOSE);
					$self->{_requests}->{$index}->{data} = undef;
					$self->{_requests}->{$index}->{status} = REQ_RESPONSE_NOT_UNDERSTOOD;
					$self->{_total_failed}++;
				}

			} else
			{
				warn "Regex not matched." if($VERBOSE);
				$self->{_requests}->{$index}->{data} = undef;
				$self->{_requests}->{$index}->{status} = REQ_RESPONSE_NOT_UNDERSTOOD;
				$self->{_total_failed}++;
			}
		} else
		{
			if($self->{_requests}->{$index}->{status} == REQ_INCOMPLETE)
			{
				$self->{_requests}->{$index}->{status} = REQ_REMOTE_TIMEOUT;
			}
			$self->{_total_failed}++;
		}



( run in 0.711 second using v1.01-cache-2.11-cpan-437f7b0c052 )