use Socket; use IO::Select; use XML::Simple; use Data::Dumper; use strict; use warnings; while (1) { print "Business: "; my $business = <>; chomp($business); if ($business) { my $businesses = find($business); display($businesses); } else { last; } } sub display { my $businesses = shift; foreach my $key (keys(%$businesses)) { print "-$key\n"; print "---$businesses->{$key}\n" if(defined($businesses->{$key})); } print "=========================================\n"; } sub find { my $name = shift; socket(UDDI, PF_INET, SOCK_STREAM, getprotobyname('tcp')) || die "socket: $!"; connect(UDDI, sockaddr_in(80, inet_aton("www-3.ibm.com"))) || die "connect: $!"; my $envelope = "" . "" . "" . "" . $name . "" . "" . "" . ""; my $msg = "POST /services/uddi/inquiryapi HTTP/1.1\r\n" . "Content-Type: text/xml; charset=\"utf-8\"\r\n" . "Content-Length: " . length($envelope) . "\r\n" . "SOAPAction: \"\"\r\n" . "Cache-Control: no-cache\r\n" . "Pragma: no-cache\r\n" . "User-Agent: Peter Script\r\n" . "Host: www-3.ibm.com\r\n" . "Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2\r\n" . "Connection: keep-alive\r\n" . "\r\n" . $envelope; syswrite(UDDI, $msg); my $res = ""; my $sel = new IO::Select(*UDDI); while ($sel->can_read) { my $chunk; sysread(UDDI, $chunk, 100000); if (!length($chunk)) { last; } else { $res .= $chunk; } } close(UDDI); $res =~ m/.*?\r\n\r\n(.*)/; $res = $1; my $hash = XMLin($res); my $result = {}; if (ref($hash->{"SOAP:Body"}->{"businessList"}->{"businessInfos"}->{"businessInfo"}) eq "ARRAY") { foreach my $business (@{$hash->{"SOAP:Body"}->{"businessList"}->{"businessInfos"}->{"businessInfo"}}) { $result->{$business->{"name"}->{"content"}} = $business->{"description"}->{"content"}; } } else { #I will add later, as I cannot test now, and I don't want to post untested code in this case } return $result; }