sub
new {
my
$self
=
shift
->SUPER::new(
@_
);
$self
->_set_url(
$self
->{url})
if
defined
$self
->{url};
if
(
my
$version
=
$self
->{version}) {
$self
->req->version(
$version
);
$self
->res->version(
$version
);
}
return
$self
;
}
sub
url {
my
$self
=
shift
;
my
$url
=
shift
;
return
$self
->{url}
unless
$url
;
$self
->_set_url(
$url
);
return
$self
;
}
sub
parse {
my
$self
=
shift
;
my
$req
=
$self
->req;
my
$res
=
$self
->res;
unless
(
$res
->is_done) {
unless
(
$res
->parse(
$_
[0])) {
$self
->error(
$res
->error);
return
;
}
if
(
$res
->is_done) {
if
(
$req
->version eq
'draft-ietf-hybi-00'
&&
$req
->checksum ne
$res
->checksum)
{
$self
->error(
'Checksum is wrong.'
);
return
;
}
}
}
return
1;
}
sub
is_done {
shift
->res->is_done }
sub
to_string {
shift
->req->to_string }
sub
build_frame {
my
$self
=
shift
;
return
Protocol::WebSocket::Frame->new(
masked
=> 1,
version
=>
$self
->version,
@_
);
}
sub
_build_url { Protocol::WebSocket::URL->new }
sub
_set_url {
my
$self
=
shift
;
my
$url
=
shift
;
$url
=
$self
->_build_url->parse(
$url
)
unless
ref
$url
;
$self
->req->secure(1)
if
$url
->secure;
my
$req
=
$self
->req;
my
$host
=
$url
->host;
$host
.=
':'
.
$url
->port
if
defined
$url
->port
&& (
$url
->secure ?
$url
->port ne
'443'
:
$url
->port ne
'80'
);
$req
->host(
$host
);
$req
->resource_name(
$url
->resource_name);
return
$self
;
}
1;