SPVM-Mojolicious

 view release on metacpan or  search on metacpan

lib/SPVM/Mojo/Transaction.spvm  view on Meta::CPAN

# Copyright (c) 2025 Yuki Kimoto
# MIT License

class Mojo::Transaction {
  version_from Mojolicious;
  
  use Mojo::Message::Request;
  use Mojo::Message::Response;
  use Mojo::Util;
  use Hash;
  use IO::Socket;
  use Mojo::Connection;
  
  # Fields
  has kept_alive : rw byte;
  
  has local_address : rw string;
  
  has local_port : rw int;
  
  has original_remote_address : rw string;
  
  has remote_address : virtual rw string
    get {
      
      unless ($self->req->reverse_proxy) {
        return $self->original_remote_address;
      }
      
      my $x_forwarded_for = $self->req->headers->header("X-Forwarded-For");
      unless ($x_forwarded_for) {
        $x_forwarded_for = "";
      }
      
      my $addrs   = Re->split("\s*,\s*", $x_forwarded_for);
      my $trusted = $self->req->trusted_proxies;
      
      unless (@$trusted) {
        if (@$addrs) {
          return $addrs->[@$addrs - 1];
        }
        else {
          return $self->original_remote_address;
        }
      }
      
      $addrs = Array->merge_string($addrs, [$self->original_remote_address]);
      
      Fn->reverse_inplace($addrs);
      
      for my $addr (@$addrs) {
        my $matches = Fn->grep([$addr : string] method : int ($_ : string) { return Mojo::Util->network_contains($_, $addr); }, $trusted);
        
        unless (@$matches) {
          return $addr ;
        }
      }
      
      return $addrs->[0];
    }
    
    set {
      
      $self->{original_remote_address} = $_;
    }
  ;
  
  has remote_port : rw int;
  
  has req : rw Mojo::Message::Request;
  
  has res : rw Mojo::Message::Response;
  
  has connection : rw Mojo::Connection;
  
  # Undocumented Fields
  has completed : byte;
  
  # Class Methods
  static method new : Mojo::Transaction () {
    
    my $self = new Mojo::Transaction;
    
    $self->init;
    
    return $self;
  }
  
  protected method init : void ($options : object[] = undef) {
    



( run in 0.629 second using v1.01-cache-2.11-cpan-ceb78f64989 )