.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Net::Proxy 3pm" .TH Net::Proxy 3pm "2021-01-04" "perl v5.32.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Net::Proxy \- Framework for proxying network connections in many ways .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& use Net::Proxy; \& \& # proxy connections from localhost:6789 to remotehost:9876 \& # using standard TCP connections \& my $proxy = Net::Proxy\->new( \& { in => { type => \*(Aqtcp\*(Aq, port => \*(Aq6789\*(Aq }, \& out => { type => \*(Aqtcp\*(Aq, host => \*(Aqremotehost\*(Aq, port => \*(Aq9876\*(Aq }, \& } \& ); \& \& # register the proxy object \& $proxy\->register(); \& \& # and you can setup multiple proxies \& \& # and now proxy connections indefinitely \& Net::Proxy\->mainloop(); .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" A \f(CW\*(C`Net::Proxy\*(C'\fR object represents a proxy that accepts connections and then relays the data transfered between the source and the destination. .PP The goal of this module is to abstract the different methods used to connect from the proxy to the destination. .PP A proxy is a program that transfer data across a network boundary between a client and a server. \f(CW\*(C`Net::Proxy\*(C'\fR introduces the concept of \&\*(L"connectors\*(R" (implemented as \f(CW\*(C`Net::Proxy::Connector\*(C'\fR subclasses), which abstract the server part (connected to the client) and the client part (connected to the server) of the proxy. .PP This architecture makes it easy to implement specific techniques to cross a given network boundary, possibly by using a proxy on one side of the network fence, and a reverse-proxy on the other side of the fence. .PP See \*(L"\s-1AVAILABLE CONNECTORS\*(R"\s0 for details about the existing connectors. .SH "METHODS" .IX Header "METHODS" If you only intend to use \f(CW\*(C`Net::Proxy\*(C'\fR and not write new connectors, you only need to know about \f(CW\*(C`new()\*(C'\fR, \f(CW\*(C`register()\*(C'\fR and \f(CW\*(C`mainloop()\*(C'\fR. .SS "Class methods" .IX Subsection "Class methods" .IP "new( { in => { ... }, { out => { ... } } )" 4 .IX Item "new( { in => { ... }, { out => { ... } } )" Return a new \f(CW\*(C`Net::Proxy\*(C'\fR object, with two connectors configured as described in the hashref. .Sp The connector parameters are described in the table below, as well as in each connector documentation. .ie n .IP "mainloop( $max_connections )" 4 .el .IP "mainloop( \f(CW$max_connections\fR )" 4 .IX Item "mainloop( $max_connections )" This method initialises all the registered \f(CW\*(C`Net::Proxy\*(C'\fR objects and then loops on all the sockets ready for reading, passing the data through the various \f(CW\*(C`Net::Proxy::Connector\*(C'\fR objets to handle the specifics of each connection. .Sp If \f(CW$max_connections\fR is given, the proxy will stop after having fully processed that many connections. Otherwise, this method does not return. .ie n .IP "add_listeners( @sockets )" 4 .el .IP "add_listeners( \f(CW@sockets\fR )" 4 .IX Item "add_listeners( @sockets )" Add the given sockets to the list of listening sockets. .ie n .IP "watch_reader_sockets( @sockets )" 4 .el .IP "watch_reader_sockets( \f(CW@sockets\fR )" 4 .IX Item "watch_reader_sockets( @sockets )" Add the given sockets to the readers watch list. .ie n .IP "watch_writer_sockets( @sockets )" 4 .el .IP "watch_writer_sockets( \f(CW@sockets\fR )" 4 .IX Item "watch_writer_sockets( @sockets )" Add the given sockets to the writers watch list. .ie n .IP "remove_writer_sockets( @sockets )" 4 .el .IP "remove_writer_sockets( \f(CW@sockets\fR )" 4 .IX Item "remove_writer_sockets( @sockets )" Remove the given sockets from the writers watch list. .ie n .IP "close_sockets( @sockets )" 4 .el .IP "close_sockets( \f(CW@sockets\fR )" 4 .IX Item "close_sockets( @sockets )" Close the given sockets and cleanup the related internal structures. .ie n .IP "set_verbosity( $level )" 4 .el .IP "set_verbosity( \f(CW$level\fR )" 4 .IX Item "set_verbosity( $level )" Set the logging level. \f(CW0\fR means not messages except warnings and errors. .ie n .IP "error( $message )" 4 .el .IP "error( \f(CW$message\fR )" 4 .IX Item "error( $message )" Log \f(CW$message\fR to \s-1STDERR,\s0 always. .ie n .IP "notice( $message )" 4 .el .IP "notice( \f(CW$message\fR )" 4 .IX Item "notice( $message )" Log \f(CW$message\fR to \s-1STDERR\s0 if verbosity level is equal to \f(CW1\fR or more. .ie n .IP "info( $message )" 4 .el .IP "info( \f(CW$message\fR )" 4 .IX Item "info( $message )" Log \f(CW$message\fR to \s-1STDERR\s0 if verbosity level is equal to \f(CW2\fR or more. .ie n .IP "debug( $message )" 4 .el .IP "debug( \f(CW$message\fR )" 4 .IX Item "debug( $message )" Log \f(CW$message\fR to \s-1STDERR\s0 if verbosity level is equal to \f(CW3\fR or more. .Sp (Note: throughout the \f(CW\*(C`Net::Proxy\*(C'\fR source code, calls to \f(CW\*(C`debug()\*(C'\fR are commented with \f(CW\*(C`##\*(C'\fR.) .PP Some of the class methods are related to the socket objects that handle the actual connections. .ie n .IP "get_peer( $socket )" 4 .el .IP "get_peer( \f(CW$socket\fR )" 4 .IX Item "get_peer( $socket )" .PD 0 .ie n .IP "set_peer( $socket, $peer )" 4 .el .IP "set_peer( \f(CW$socket\fR, \f(CW$peer\fR )" 4 .IX Item "set_peer( $socket, $peer )" .PD Get or set the socket peer. .ie n .IP "get_connector( $socket )" 4 .el .IP "get_connector( \f(CW$socket\fR )" 4 .IX Item "get_connector( $socket )" .PD 0 .ie n .IP "set_connector( $socket, $connector )" 4 .el .IP "set_connector( \f(CW$socket\fR, \f(CW$connector\fR )" 4 .IX Item "set_connector( $socket, $connector )" .PD Get or set the socket connector (a \f(CW\*(C`Net::Proxy::Connector\*(C'\fR object). .ie n .IP "get_state( $socket )" 4 .el .IP "get_state( \f(CW$socket\fR )" 4 .IX Item "get_state( $socket )" .PD 0 .ie n .IP "set_state( $socket, $state )" 4 .el .IP "set_state( \f(CW$socket\fR, \f(CW$state\fR )" 4 .IX Item "set_state( $socket, $state )" .PD Get or set the socket state. Some \f(CW\*(C`Net::Proxy::Connector\*(C'\fR subclasses may wish to use this to store some internal information about the socket or the connection. .ie n .IP "get_nick( $socket )" 4 .el .IP "get_nick( \f(CW$socket\fR )" 4 .IX Item "get_nick( $socket )" .PD 0 .ie n .IP "set_nick( $socket, $nickname )" 4 .el .IP "set_nick( \f(CW$socket\fR, \f(CW$nickname\fR )" 4 .IX Item "set_nick( $socket, $nickname )" .PD Get or set the socket nickname. Typically used by \f(CW\*(C`Net::Proxy::Connector\*(C'\fR to give informative names to socket (used in the log messages). .ie n .IP "get_buffer( $socket )" 4 .el .IP "get_buffer( \f(CW$socket\fR )" 4 .IX Item "get_buffer( $socket )" .PD 0 .ie n .IP "set_buffer( $socket, $data )" 4 .el .IP "set_buffer( \f(CW$socket\fR, \f(CW$data\fR )" 4 .IX Item "set_buffer( $socket, $data )" .PD Get or set the content of the writing buffer for the socket. Used by \f(CW\*(C`Net::Proxy::Connector\*(C'\fR in \f(CW\*(C`raw_read_from()\*(C'\fR and \&\f(CW\*(C`ranw_write_to()\*(C'\fR. .ie n .IP "get_callback( $socket )" 4 .el .IP "get_callback( \f(CW$socket\fR )" 4 .IX Item "get_callback( $socket )" .PD 0 .ie n .IP "set_callback( $socket, $coderef )" 4 .el .IP "set_callback( \f(CW$socket\fR, \f(CW$coderef\fR )" 4 .IX Item "set_callback( $socket, $coderef )" .PD Get or set the callback currently associated with the socket. .ie n .IP "add_to_buffer( $socket, $data )" 4 .el .IP "add_to_buffer( \f(CW$socket\fR, \f(CW$data\fR )" 4 .IX Item "add_to_buffer( $socket, $data )" Add data to the writing buffer of the socket. .SS "Instance methods" .IX Subsection "Instance methods" .IP "\fBregister()\fR" 4 .IX Item "register()" Register a \f(CW\*(C`Net::Proxy\*(C'\fR object so that it will be included in the \f(CW\*(C`mainloop()\*(C'\fR processing. .IP "\fBunregister()\fR" 4 .IX Item "unregister()" Unregister the \f(CW\*(C`Net::Proxy\*(C'\fR object. .IP "\fBin_connector()\fR" 4 .IX Item "in_connector()" Return the \f(CW\*(C`Net::Proxy::Connector\*(C'\fR objet that handles the incoming connection and handles the data coming from the \*(L"client\*(R" side. .IP "\fBout_connector()\fR" 4 .IX Item "out_connector()" Return the \f(CW\*(C`Net::Proxy::Connector\*(C'\fR objet that creates the outgoing connection and handles the data coming from the \*(L"server\*(R" side. .SS "Statistical methods" .IX Subsection "Statistical methods" The following methods manage some statistical information about the individual proxies: .IP "\fBstat_inc_opened()\fR" 4 .IX Item "stat_inc_opened()" .PD 0 .IP "\fBstat_inc_closed()\fR" 4 .IX Item "stat_inc_closed()" .PD Increment the \*(L"opened\*(R" or \*(L"closed\*(R" connection counter for this proxy. .IP "\fBstat_opened()\fR" 4 .IX Item "stat_opened()" .PD 0 .IP "\fBstat_closed()\fR" 4 .IX Item "stat_closed()" .PD Return the count of \*(L"opened\*(R" or \*(L"closed\*(R" connections for this proxy. .IP "\fBstat_total_opened()\fR" 4 .IX Item "stat_total_opened()" .PD 0 .IP "\fBstat_total_closed()\fR" 4 .IX Item "stat_total_closed()" .PD Return the total count of \*(L"opened\*(R" or \*(L"closed\*(R" connection across all proxy objects. .SH "CONNECTORS" .IX Header "CONNECTORS" All connection types are provided with the help of specialised classes. The logic for protocol \f(CW\*(C`xxx\*(C'\fR is provided by the \f(CW\*(C`Net::Proxy::Connector::xxx\*(C'\fR class. .SS "Connector hooks" .IX Subsection "Connector hooks" There is a single parameter that all connectors accept: \f(CW\*(C`hook\*(C'\fR. Given a code reference, the code reference will be called when data is \fIreceived\fR on the corresponding socket. .PP The code reference should have the following signature: .PP .Vb 4 \& sub callback { \& my ($dataref, $sock, $connector) = @_; \& ... \& } .Ve .PP \&\f(CW$dataref\fR is a reference to the chunk of data received, \&\f(CW$sock\fR is a reference to the socket that received the data, and \&\f(CW$connector\fR is the \f(CW\*(C`Net::Proxy::Connector\*(C'\fR object that created the socket. This allows someone to eventually store data in a stash stored in the connector, so as to share data between sockets. .SS "Available connectors" .IX Subsection "Available connectors" .IP "\(bu" 4 tcp (\f(CW\*(C`Net::Proxy::Connector::tcp\*(C'\fR) .Sp This is the simplest possible proxy connector. On the \*(L"in\*(R" side, it sits waiting for incoming connections, and on the \*(L"out\*(R" side, it connects to the configured host/port. .IP "\(bu" 4 connect (\f(CW\*(C`Net::Proxy::Connector::connect\*(C'\fR) .Sp This proxy connector can connect to a \s-1TCP\s0 server though a web proxy that accepts \s-1HTTP CONNECT\s0 requests. .IP "\(bu" 4 dual (\f(CW\*(C`Net::Proxy::Connector::dual\*(C'\fR) .Sp This proxy connector is a Y\-shaped connector: depending on the client behaviour right after the connection is established, it connects it to one of two services, handled by two distinct connectors. .IP "\(bu" 4 dummy (\f(CW\*(C`Net::Proxy::Connector::dummy\*(C'\fR) .Sp This proxy connector does nothing. You can use it as a template for writing new \f(CW\*(C`Net::Proxy::Connector\*(C'\fR classes. .SS "Summary" .IX Subsection "Summary" This table summarises all the available \f(CW\*(C`Net::Proxy::Connector\*(C'\fR classes and the parameters their constructors recognise. .PP \&\f(CW\*(C`N/A\*(C'\fR means that the given \f(CW\*(C`Net::Proxy::Connector\*(C'\fR cannot be used in that position (either \f(CW\*(C`in\*(C'\fR or \f(CW\*(C`out\*(C'\fR). .PP .Vb 10 \& Connector | in parameters | out parameters \& \-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& tcp | host | host \& | port | port \& \-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& connect | N/A | host \& | | port \& | | proxy_host \& | | proxy_port \& | | proxy_user \& | | proxy_pass \& | | proxy_agent \& \-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& dual | host | N/A \& | port | \& | timeout | \& | server_first | \& | client_first | \& \-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& dummy | N/A | N/A \& \-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& ssl | host | host \& | port | port \& | start_cleartext | start_cleartext \& \-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-+\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\- \& connect_ssl| N/A | host \& | | port \& | | proxy_host \& | | proxy_port \& | | proxy_user \& | | proxy_pass \& | | proxy_agent .Ve .PP \&\f(CW\*(C`Net::Proxy::Connector::dummy\*(C'\fR is used as the \f(CW\*(C`out\*(C'\fR parameter for a \f(CW\*(C`Net::Proxy::Connector::dual\*(C'\fR, since the later is linked to two different connector objects. .SH "AUTHOR" .IX Header "AUTHOR" Philippe 'BooK' Bruhat, \f(CW\*(C`\*(C'\fR. .SH "BUGS" .IX Header "BUGS" Please report any bugs or feature requests to \&\f(CW\*(C`bug\-net\-proxy@rt.cpan.org\*(C'\fR, or through the web interface at . I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. .SH "TODO" .IX Header "TODO" Here's my own wishlist: .IP "\(bu" 4 Write a connector fully compatible with \s-1GNU\s0 httptunnel (). .Sp This one will probably be named \f(CW\*(C`Net::Proxy::Connector::httptunnel\*(C'\fR. .IP "\(bu" 4 Enhance the httptunnel protocol to support multiple connections. .IP "\(bu" 4 Implement \s-1RFC 3093\s0 \- Firewall Enhancement Protocol (\s-1FEP\s0), as \&\f(CW\*(C`Net::Proxy::Connector::FEP\*(C'\fR. This \s-1RFC\s0 was published on April 1, 2001. .Sp This is probably impossible with \f(CW\*(C`Net::Proxy\*(C'\fR, since the \s-1FEP\s0 driver is a rather low-level driver (at the \s-1IP\s0 level of the network stack). .IP "\(bu" 4 Implement \s-1DNS\s0 tunnel connectors. .Sp See , OzymanDNS, . for examples. .IP "\(bu" 4 Implement an \s-1UDP\s0 connector. (Is it feasible?) .IP "\(bu" 4 Implement a connector that can be plugged to the \s-1STDIN/STDOUT\s0 of an external process, like the \f(CW\*(C`ProxyCommand\*(C'\fR option of OpenSSH. .IP "\(bu" 4 Implement \f(CW\*(C`Net::Proxy::Connector::unix\*(C'\fR, for \s-1UNIX\s0 sockets. .IP "\(bu" 4 Implement \s-1ICMP\s0 tunnel connectors. .Sp See , , , for examples. .Sp Since \s-1ICMP\s0 implies low-level packet reading and writing, it may not be possible for \f(CW\*(C`Net::Proxy\*(C'\fR to handle it. .IP "\(bu" 4 Look for inspiration in the \fIFirewall-Piercing \s-1HOWTO\s0\fR, at . .Sp Look also here: .IP "\(bu" 4 Implement a \f(CW\*(C`Net::Proxy::Connector::starttls\*(C'\fR connector that can upgrade upgrade a connection to \s-1SSL\s0 transparently, even if the client or server doesn't support \s-1STARTTLS.\s0 .Sp Martin Werthmo\*:ller provided a full implementation of a connector that can handle \s-1IMAP\s0 connections and upgrade them to \s-1TLS\s0 if the client sends a \f(CW\*(C`STARTTLS\*(C'\fR command. My implementation will split this in two parts \&\f(CW\*(C`Net::Proxy::Connector::ssl\*(C'\fR and \f(CW\*(C`Net::Proxy::Connector::starttls\*(C'\fR, that inherits from the former. .SH "SUPPORT" .IX Header "SUPPORT" You can find documentation for this module with the perldoc command. .PP .Vb 1 \& perldoc Net::Proxy .Ve .PP You can also look for information at: .IP "\(bu" 4 The Net::Proxy mailing-list .Sp .Sp This list receive an email for each commit .IP "\(bu" 4 The public source repository .Sp svn://svn.mongueurs.net/Net\-Proxy/trunk/ .Sp Also available through a web interface at .IP "\(bu" 4 AnnoCPAN: Annotated \s-1CPAN\s0 documentation .Sp .IP "\(bu" 4 \&\s-1CPAN\s0 Ratings .Sp .IP "\(bu" 4 \&\s-1RT: CPAN\s0's request tracker .Sp .IP "\(bu" 4 Search \s-1CPAN\s0 .Sp .SH "COPYRIGHT" .IX Header "COPYRIGHT" Copyright 2006\-2007 Philippe 'BooK' Bruhat, All Rights Reserved. .SH "LICENSE" .IX Header "LICENSE" This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. .SH "POD ERRORS" .IX Header "POD ERRORS" Hey! \fBThe above document had some coding errors, which are explained below:\fR .IP "Around line 719:" 4 .IX Item "Around line 719:" Non-ASCII character seen before =encoding in 'Werthmo\*:ller'. Assuming \s-1CP1252\s0