http.pm 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package BotHttp;
  2. use Carp;
  3. use common::sense;
  4. use HTTP::Request::Common;
  5. use HTTP::Status;
  6. use POE;
  7. my %requests = ();
  8. my $reqid = 1;
  9. sub init() {
  10. $BotIrc::kernel->state('http_response', sub {
  11. my ($request_packet, $response_packet) = @_[ARG0, ARG1];
  12. my $request = $request_packet->[0];
  13. my $tag = $request_packet->[1];
  14. my $response = $response_packet->[0];
  15. croak("Received HTTP response for unknown tag '$tag'") if (!exists $requests{$tag});
  16. my $r = delete $requests{$tag};
  17. if (my $err = $response->header('X-PCCH-Errmsg')) {
  18. $r->{err_cb}($err, $response);
  19. return;
  20. }
  21. if (HTTP::Status::is_error($response->code)) {
  22. my $content = substr($response->decoded_content .'...', 0, 350);
  23. $content =~ s#[\r\n]+# // #sg;
  24. $r->{err_cb}($response->status_line .' // '. $content, $response);
  25. return;
  26. }
  27. $r->{ok_cb}($response->decoded_content, $response);
  28. });
  29. }
  30. sub request($$$) {
  31. my ($req, $ok_cb, $err_cb) = @_;
  32. my $tag = "request$reqid";
  33. $reqid++;
  34. $requests{$tag} = {
  35. ok_cb => $ok_cb,
  36. err_cb => $err_cb,
  37. };
  38. $BotIrc::kernel->post('http', 'request', 'http_response', $req, $tag);
  39. }
  40. sub get($$$) {
  41. my ($url, $ok_cb, $err_cb) = @_;
  42. my $req = GET($url);
  43. request($req, $ok_cb, $err_cb);
  44. }