#! /usr/bin/perl
#
#       Name:         ntripclient.pl
#       Authors:      Dirk Stöcker
#       Description:  perl script to access casters using HTTP and HTTPS

use strict;
#use warnings;
#no warnings "uninitialized";
use MIME::Base64;
use Net::HTTP;
use Net::HTTPS;
use Net::SSLeay;
use IO::Handle;
STDOUT->autoflush(1);

my $user = "...";
my $pwd = "...";

#getstream("ntrip.dgpsonline.eu", 80, "http", $user, $pwd, "WILD_RTK");
#getstream("ntrip.dgpsonline.eu", 2101, "http", $user, $pwd, "WILD_RTK");
getstream("ntrip.dgpsonline.eu", 443, "https", $user, $pwd, "WILD_RTK");

sub printcert
{
  my $cert = $_[0];
  return $cert;
};

sub getstream
{
  my ($server, $port, $protocol, $user, $pwd, $mp) = @_;
  eval
  {
    local $SIG{ALRM} = sub { die "alarm"; };
    alarm(20);
    my $s;
    if($protocol eq "https")
    {
      $s = Net::HTTPS->new(Host => "$server:$port", Timeout => 10);
      if($s)
      {
        print "Cipher:  ".$s->get_cipher()."\n";
        my $cert = $s->get_peer_certificate();
        print "Time:    ".$cert->not_before() . " to " . $cert->not_after(). "\n";
        print "Subject: ".printcert($cert->subject_name())."\n";
        print "Issuer:  ".printcert($cert->issuer_name())."\n";
        print "\n";
      }
    }
    else
    {
      $s = Net::HTTP->new(Host => "$server:$port", Timeout => 10);
    }
    if($s)
    {
      $s->write_request(GET => "/$mp", 'Host' => "$server:$port", Timeout => 10,
      'User-Agent' => "NTRIP ssltestclient.pl/1.0",
      "Ntrip-Version" => 'Ntrip/2.0',
      ($user ? ("Authorization" => "Basic " . encode_base64("$user:$pwd")) : ())
      );
      my ($code, $message, %headers) = $s->read_response_headers;
      print "$code $message\n";
      foreach my $s (keys %headers)
      {
        print "$s: $headers{$s}\n";
      }
      print("\n");
      if($code == 200)
      {
        while(1)
        {
          alarm(10);
          my $n;
          my $buf;
          {
            $n = $s->read_entity_body($buf, 1024);
          }
          last unless $n;
          print $buf;
        }
      }
      else
      {
        while(1)
        {
          my $buf;
          my $n = $s->read_entity_body($buf, 1024);
          last unless $n;
          print $buf;
        }
      }
    }
  };
}