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 )