@ISA
=
qw(LWP::Protocol)
;
sub
request
{
my
(
$self
,
$request
,
$proxy
,
$arg
,
$size
,
$timeout
) =
@_
;
$size
= 4096
unless
$size
;
if
(
defined
$proxy
) {
return
HTTP::Response->new(
&HTTP::Status::RC_BAD_REQUEST
,
'You can not proxy through NNTP'
);
}
my
$url
=
$request
->url;
my
$scheme
=
$url
->scheme;
unless
(
$scheme
eq
'news'
||
$scheme
eq
'nntp'
) {
return
HTTP::Response->new(
&HTTP::Status::RC_INTERNAL_SERVER_ERROR
,
"LWP::Protocol::nntp::request called for '$scheme'"
);
}
my
$method
=
$request
->method;
unless
(
$method
eq
'GET'
||
$method
eq
'HEAD'
||
$method
eq
'POST'
) {
return
HTTP::Response->new(
&HTTP::Status::RC_BAD_REQUEST
,
'Library does not allow method '
.
"$method for '$scheme:' URLs"
);
}
my
$groupart
=
$url
->_group;
my
$is_art
=
$groupart
=~ /@/;
if
(
$is_art
&&
$method
eq
'POST'
) {
return
HTTP::Response->new(
&HTTP::Status::RC_BAD_REQUEST
,
"Can't post to an article <$groupart>"
);
}
my
$nntp
= Net::NNTP->new(
$url
->host,
Timeout
=>
$timeout
,
);
die
"Can't connect to nntp server"
unless
$nntp
;
if
(
$nntp
->status != 2) {
return
HTTP::Response->new(
&HTTP::Status::RC_SERVICE_UNAVAILABLE
,
$nntp
->message);
}
my
$response
= HTTP::Response->new(
&HTTP::Status::RC_OK
,
"OK"
);
my
$mess
=
$nntp
->message;
$mess
=~ s/\s+ready\b.*//;
$mess
=~ s/^\S+\s+//;
$response
->header(
Server
=>
$mess
);
if
(
$method
eq
'POST'
) {
$nntp
->quit;
$nntp
=
undef
;
$response
->code(
&HTTP::Status::RC_NOT_IMPLEMENTED
);
$response
->message(
"POST not implemented yet"
);
return
$response
;
}
if
(!
$is_art
) {
if
(!
$nntp
->group(
$groupart
)) {
$response
->code(
&HTTP::Status::RC_NOT_FOUND
);
$response
->message(
$nntp
->message);
}
$nntp
->quit;
$nntp
=
undef
;
if
(
$method
eq
'GET'
&&
$response
->is_success) {
$response
->code(
&HTTP::Status::RC_NOT_IMPLEMENTED
);
$response
->message(
"GET newsgroup not implemented yet"
);
}
return
$response
;
}
my
$get
=
$method
eq
'HEAD'
?
"head"
:
"article"
;
my
$art
=
$nntp
->
$get
(
"<$groupart>"
);
unless
(
$art
) {
$nntp
->quit;
$nntp
=
undef
;
$response
->code(
&HTTP::Status::RC_NOT_FOUND
);
$response
->message(
$nntp
->message);
return
$response
;
}
my
(
$key
,
$val
);
local
$_
;
while
(
$_
=
shift
@$art
) {
if
(/^\s+$/) {
last
;
}
elsif
(/^(\S+):\s*(.*)/) {
$response
->push_header(
$key
,
$val
)
if
$key
;
(
$key
,
$val
) = ($1, $2);
}
elsif
(/^\s+(.*)/) {
next
unless
$key
;
$val
.= $1;
}
else
{
unshift
(
@$art
,
$_
);
last
;
}
}
$response
->push_header(
$key
,
$val
)
if
$key
;
$response
->header(
"Content-Type"
,
"text/plain"
)
unless
$response
->header(
"Content-Type"
);
$response
=
$self
->collect_once(
$arg
,
$response
,
join
(
""
,
@$art
))
if
@$art
;
$nntp
->quit;
$nntp
=
undef
;
$response
;
}
1;