xref: /aosp_15_r20/external/curl/tests/serverhelp.pm (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
2*6236dae4SAndroid Build Coastguard Worker#                                  _   _ ____  _
3*6236dae4SAndroid Build Coastguard Worker#  Project                     ___| | | |  _ \| |
4*6236dae4SAndroid Build Coastguard Worker#                             / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker#                            | (__| |_| |  _ <| |___
6*6236dae4SAndroid Build Coastguard Worker#                             \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker#
8*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al.
9*6236dae4SAndroid Build Coastguard Worker#
10*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker#
14*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker#
18*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker#
21*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker#
23*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
24*6236dae4SAndroid Build Coastguard Worker
25*6236dae4SAndroid Build Coastguard Worker# This perl module contains functions useful in writing test servers.
26*6236dae4SAndroid Build Coastguard Worker
27*6236dae4SAndroid Build Coastguard Workerpackage serverhelp;
28*6236dae4SAndroid Build Coastguard Worker
29*6236dae4SAndroid Build Coastguard Workeruse strict;
30*6236dae4SAndroid Build Coastguard Workeruse warnings;
31*6236dae4SAndroid Build Coastguard Worker
32*6236dae4SAndroid Build Coastguard WorkerBEGIN {
33*6236dae4SAndroid Build Coastguard Worker    use base qw(Exporter);
34*6236dae4SAndroid Build Coastguard Worker
35*6236dae4SAndroid Build Coastguard Worker    our @EXPORT_OK = qw(
36*6236dae4SAndroid Build Coastguard Worker        logmsg
37*6236dae4SAndroid Build Coastguard Worker        $logfile
38*6236dae4SAndroid Build Coastguard Worker        serverfactors
39*6236dae4SAndroid Build Coastguard Worker        servername_id
40*6236dae4SAndroid Build Coastguard Worker        servername_str
41*6236dae4SAndroid Build Coastguard Worker        servername_canon
42*6236dae4SAndroid Build Coastguard Worker        server_pidfilename
43*6236dae4SAndroid Build Coastguard Worker        server_portfilename
44*6236dae4SAndroid Build Coastguard Worker        server_logfilename
45*6236dae4SAndroid Build Coastguard Worker        server_cmdfilename
46*6236dae4SAndroid Build Coastguard Worker        server_inputfilename
47*6236dae4SAndroid Build Coastguard Worker        server_outputfilename
48*6236dae4SAndroid Build Coastguard Worker        mainsockf_pidfilename
49*6236dae4SAndroid Build Coastguard Worker        mainsockf_logfilename
50*6236dae4SAndroid Build Coastguard Worker        datasockf_pidfilename
51*6236dae4SAndroid Build Coastguard Worker        datasockf_logfilename
52*6236dae4SAndroid Build Coastguard Worker    );
53*6236dae4SAndroid Build Coastguard Worker
54*6236dae4SAndroid Build Coastguard Worker    # sub second timestamping needs Time::HiRes
55*6236dae4SAndroid Build Coastguard Worker    eval {
56*6236dae4SAndroid Build Coastguard Worker        no warnings "all";
57*6236dae4SAndroid Build Coastguard Worker        require Time::HiRes;
58*6236dae4SAndroid Build Coastguard Worker        import  Time::HiRes qw( gettimeofday );
59*6236dae4SAndroid Build Coastguard Worker    }
60*6236dae4SAndroid Build Coastguard Worker}
61*6236dae4SAndroid Build Coastguard Worker
62*6236dae4SAndroid Build Coastguard Worker
63*6236dae4SAndroid Build Coastguard Workerour $logfile;  # server log file name, for logmsg
64*6236dae4SAndroid Build Coastguard Worker
65*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
66*6236dae4SAndroid Build Coastguard Worker# Just for convenience, test harness uses 'https' and 'httptls' literals as
67*6236dae4SAndroid Build Coastguard Worker# values for 'proto' variable in order to differentiate different servers.
68*6236dae4SAndroid Build Coastguard Worker# 'https' literal is used for stunnel based https test servers, and 'httptls'
69*6236dae4SAndroid Build Coastguard Worker# is used for non-stunnel https test servers.
70*6236dae4SAndroid Build Coastguard Worker
71*6236dae4SAndroid Build Coastguard Worker#**********************************************************************
72*6236dae4SAndroid Build Coastguard Worker# logmsg is general message logging subroutine for our test servers.
73*6236dae4SAndroid Build Coastguard Worker#
74*6236dae4SAndroid Build Coastguard Workersub logmsg {
75*6236dae4SAndroid Build Coastguard Worker    my $now;
76*6236dae4SAndroid Build Coastguard Worker    # sub second timestamping needs Time::HiRes
77*6236dae4SAndroid Build Coastguard Worker    if($Time::HiRes::VERSION) {
78*6236dae4SAndroid Build Coastguard Worker        my ($seconds, $usec) = gettimeofday();
79*6236dae4SAndroid Build Coastguard Worker        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
80*6236dae4SAndroid Build Coastguard Worker            localtime($seconds);
81*6236dae4SAndroid Build Coastguard Worker        $now = sprintf("%02d:%02d:%02d.%06d ", $hour, $min, $sec, $usec);
82*6236dae4SAndroid Build Coastguard Worker    }
83*6236dae4SAndroid Build Coastguard Worker    else {
84*6236dae4SAndroid Build Coastguard Worker        my $seconds = time();
85*6236dae4SAndroid Build Coastguard Worker        my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
86*6236dae4SAndroid Build Coastguard Worker            localtime($seconds);
87*6236dae4SAndroid Build Coastguard Worker        $now = sprintf("%02d:%02d:%02d ", $hour, $min, $sec);
88*6236dae4SAndroid Build Coastguard Worker    }
89*6236dae4SAndroid Build Coastguard Worker    # we see warnings on Windows run that $logfile is used uninitialized
90*6236dae4SAndroid Build Coastguard Worker    # TODO: not found yet where this comes from
91*6236dae4SAndroid Build Coastguard Worker    $logfile = "serverhelp_uninitialized.log" if(!$logfile);
92*6236dae4SAndroid Build Coastguard Worker    if(open(my $logfilefh, ">>", "$logfile")) {
93*6236dae4SAndroid Build Coastguard Worker        print $logfilefh $now;
94*6236dae4SAndroid Build Coastguard Worker        print $logfilefh @_;
95*6236dae4SAndroid Build Coastguard Worker        close($logfilefh);
96*6236dae4SAndroid Build Coastguard Worker    }
97*6236dae4SAndroid Build Coastguard Worker}
98*6236dae4SAndroid Build Coastguard Worker
99*6236dae4SAndroid Build Coastguard Worker
100*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
101*6236dae4SAndroid Build Coastguard Worker# Return server characterization factors given a server id string.
102*6236dae4SAndroid Build Coastguard Worker#
103*6236dae4SAndroid Build Coastguard Workersub serverfactors {
104*6236dae4SAndroid Build Coastguard Worker    my $server = $_[0];
105*6236dae4SAndroid Build Coastguard Worker    my $proto;
106*6236dae4SAndroid Build Coastguard Worker    my $ipvnum;
107*6236dae4SAndroid Build Coastguard Worker    my $idnum;
108*6236dae4SAndroid Build Coastguard Worker
109*6236dae4SAndroid Build Coastguard Worker    if($server =~
110*6236dae4SAndroid Build Coastguard Worker        /^((ftp|http|imap|pop3|smtp|http-pipe)s?)(\d*)(-ipv6|)$/) {
111*6236dae4SAndroid Build Coastguard Worker        $proto  = $1;
112*6236dae4SAndroid Build Coastguard Worker        $idnum  = ($3 && ($3 > 1)) ? $3 : 1;
113*6236dae4SAndroid Build Coastguard Worker        $ipvnum = ($4 && ($4 =~ /6$/)) ? 6 : 4;
114*6236dae4SAndroid Build Coastguard Worker    }
115*6236dae4SAndroid Build Coastguard Worker    elsif($server =~
116*6236dae4SAndroid Build Coastguard Worker        /^(tftp|sftp|socks|ssh|rtsp|gopher|httptls)(\d*)(-ipv6|)$/) {
117*6236dae4SAndroid Build Coastguard Worker        $proto  = $1;
118*6236dae4SAndroid Build Coastguard Worker        $idnum  = ($2 && ($2 > 1)) ? $2 : 1;
119*6236dae4SAndroid Build Coastguard Worker        $ipvnum = ($3 && ($3 =~ /6$/)) ? 6 : 4;
120*6236dae4SAndroid Build Coastguard Worker    }
121*6236dae4SAndroid Build Coastguard Worker    else {
122*6236dae4SAndroid Build Coastguard Worker        die "invalid server id: '$server'"
123*6236dae4SAndroid Build Coastguard Worker    }
124*6236dae4SAndroid Build Coastguard Worker    return($proto, $ipvnum, $idnum);
125*6236dae4SAndroid Build Coastguard Worker}
126*6236dae4SAndroid Build Coastguard Worker
127*6236dae4SAndroid Build Coastguard Worker
128*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
129*6236dae4SAndroid Build Coastguard Worker# Return server name string formatted for presentation purposes
130*6236dae4SAndroid Build Coastguard Worker#
131*6236dae4SAndroid Build Coastguard Workersub servername_str {
132*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipver, $idnum) = @_;
133*6236dae4SAndroid Build Coastguard Worker
134*6236dae4SAndroid Build Coastguard Worker    $proto = uc($proto) if($proto);
135*6236dae4SAndroid Build Coastguard Worker    die "unsupported protocol: '$proto'" unless($proto &&
136*6236dae4SAndroid Build Coastguard Worker        ($proto =~ /^(((FTP|HTTP|HTTP\/2|HTTP\/3|IMAP|POP3|GOPHER|SMTP|HTTP-PIPE)S?)|(TFTP|SFTP|SOCKS|SSH|RTSP|HTTPTLS|DICT|SMB|SMBS|TELNET|MQTT))$/));
137*6236dae4SAndroid Build Coastguard Worker
138*6236dae4SAndroid Build Coastguard Worker    $ipver = (not $ipver) ? 'ipv4' : lc($ipver);
139*6236dae4SAndroid Build Coastguard Worker    die "unsupported IP version: '$ipver'" unless($ipver &&
140*6236dae4SAndroid Build Coastguard Worker        ($ipver =~ /^(4|6|ipv4|ipv6|-ipv4|-ipv6|unix)$/));
141*6236dae4SAndroid Build Coastguard Worker    $ipver = ($ipver =~ /6$/) ? '-IPv6' : (($ipver =~ /unix$/) ? '-unix' : '');
142*6236dae4SAndroid Build Coastguard Worker
143*6236dae4SAndroid Build Coastguard Worker    $idnum = 1 if(not $idnum);
144*6236dae4SAndroid Build Coastguard Worker    die "unsupported ID number: '$idnum'" unless($idnum &&
145*6236dae4SAndroid Build Coastguard Worker        ($idnum =~ /^(\d+)$/));
146*6236dae4SAndroid Build Coastguard Worker    $idnum = '' if($idnum <= 1);
147*6236dae4SAndroid Build Coastguard Worker
148*6236dae4SAndroid Build Coastguard Worker    return "${proto}${idnum}${ipver}";
149*6236dae4SAndroid Build Coastguard Worker}
150*6236dae4SAndroid Build Coastguard Worker
151*6236dae4SAndroid Build Coastguard Worker
152*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
153*6236dae4SAndroid Build Coastguard Worker# Return server name string formatted for identification purposes
154*6236dae4SAndroid Build Coastguard Worker#
155*6236dae4SAndroid Build Coastguard Workersub servername_id {
156*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipver, $idnum) = @_;
157*6236dae4SAndroid Build Coastguard Worker    return lc(servername_str($proto, $ipver, $idnum));
158*6236dae4SAndroid Build Coastguard Worker}
159*6236dae4SAndroid Build Coastguard Worker
160*6236dae4SAndroid Build Coastguard Worker
161*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
162*6236dae4SAndroid Build Coastguard Worker# Return server name string formatted for file name purposes
163*6236dae4SAndroid Build Coastguard Worker#
164*6236dae4SAndroid Build Coastguard Workersub servername_canon {
165*6236dae4SAndroid Build Coastguard Worker    my ($proto, $ipver, $idnum) = @_;
166*6236dae4SAndroid Build Coastguard Worker    my $string = lc(servername_str($proto, $ipver, $idnum));
167*6236dae4SAndroid Build Coastguard Worker    $string =~ tr/-/_/;
168*6236dae4SAndroid Build Coastguard Worker    $string =~ s/\//_v/;
169*6236dae4SAndroid Build Coastguard Worker    return $string;
170*6236dae4SAndroid Build Coastguard Worker}
171*6236dae4SAndroid Build Coastguard Worker
172*6236dae4SAndroid Build Coastguard Worker
173*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
174*6236dae4SAndroid Build Coastguard Worker# Return file name for server pid file.
175*6236dae4SAndroid Build Coastguard Worker#
176*6236dae4SAndroid Build Coastguard Workersub server_pidfilename {
177*6236dae4SAndroid Build Coastguard Worker    my ($piddir, $proto, $ipver, $idnum) = @_;
178*6236dae4SAndroid Build Coastguard Worker    my $trailer = '_server.pid';
179*6236dae4SAndroid Build Coastguard Worker    return "${piddir}/". servername_canon($proto, $ipver, $idnum) ."$trailer";
180*6236dae4SAndroid Build Coastguard Worker}
181*6236dae4SAndroid Build Coastguard Worker
182*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
183*6236dae4SAndroid Build Coastguard Worker# Return file name for server port file.
184*6236dae4SAndroid Build Coastguard Worker#
185*6236dae4SAndroid Build Coastguard Workersub server_portfilename {
186*6236dae4SAndroid Build Coastguard Worker    my ($piddir, $proto, $ipver, $idnum) = @_;
187*6236dae4SAndroid Build Coastguard Worker    my $trailer = '_server.port';
188*6236dae4SAndroid Build Coastguard Worker    return "${piddir}/". servername_canon($proto, $ipver, $idnum) ."$trailer";
189*6236dae4SAndroid Build Coastguard Worker}
190*6236dae4SAndroid Build Coastguard Worker
191*6236dae4SAndroid Build Coastguard Worker
192*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
193*6236dae4SAndroid Build Coastguard Worker# Return file name for server log file.
194*6236dae4SAndroid Build Coastguard Worker#
195*6236dae4SAndroid Build Coastguard Workersub server_logfilename {
196*6236dae4SAndroid Build Coastguard Worker    my ($logdir, $proto, $ipver, $idnum) = @_;
197*6236dae4SAndroid Build Coastguard Worker    my $trailer = '_server.log';
198*6236dae4SAndroid Build Coastguard Worker    $trailer = '_stunnel.log' if(lc($proto) =~ /^(ftp|http|imap|pop3|smtp)s$/);
199*6236dae4SAndroid Build Coastguard Worker    return "${logdir}/". servername_canon($proto, $ipver, $idnum) ."$trailer";
200*6236dae4SAndroid Build Coastguard Worker}
201*6236dae4SAndroid Build Coastguard Worker
202*6236dae4SAndroid Build Coastguard Worker
203*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
204*6236dae4SAndroid Build Coastguard Worker# Return file name for server commands file.
205*6236dae4SAndroid Build Coastguard Worker#
206*6236dae4SAndroid Build Coastguard Workersub server_cmdfilename {
207*6236dae4SAndroid Build Coastguard Worker    my ($logdir, $proto, $ipver, $idnum) = @_;
208*6236dae4SAndroid Build Coastguard Worker    my $trailer = '_server.cmd';
209*6236dae4SAndroid Build Coastguard Worker    return "${logdir}/". servername_canon($proto, $ipver, $idnum) ."$trailer";
210*6236dae4SAndroid Build Coastguard Worker}
211*6236dae4SAndroid Build Coastguard Worker
212*6236dae4SAndroid Build Coastguard Worker
213*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
214*6236dae4SAndroid Build Coastguard Worker# Return file name for server input file.
215*6236dae4SAndroid Build Coastguard Worker#
216*6236dae4SAndroid Build Coastguard Workersub server_inputfilename {
217*6236dae4SAndroid Build Coastguard Worker    my ($logdir, $proto, $ipver, $idnum) = @_;
218*6236dae4SAndroid Build Coastguard Worker    my $trailer = '_server.input';
219*6236dae4SAndroid Build Coastguard Worker    return "${logdir}/". servername_canon($proto, $ipver, $idnum) ."$trailer";
220*6236dae4SAndroid Build Coastguard Worker}
221*6236dae4SAndroid Build Coastguard Worker
222*6236dae4SAndroid Build Coastguard Worker
223*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
224*6236dae4SAndroid Build Coastguard Worker# Return file name for server output file.
225*6236dae4SAndroid Build Coastguard Worker#
226*6236dae4SAndroid Build Coastguard Workersub server_outputfilename {
227*6236dae4SAndroid Build Coastguard Worker    my ($logdir, $proto, $ipver, $idnum) = @_;
228*6236dae4SAndroid Build Coastguard Worker    my $trailer = '_server.output';
229*6236dae4SAndroid Build Coastguard Worker    return "${logdir}/". servername_canon($proto, $ipver, $idnum) ."$trailer";
230*6236dae4SAndroid Build Coastguard Worker}
231*6236dae4SAndroid Build Coastguard Worker
232*6236dae4SAndroid Build Coastguard Worker
233*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
234*6236dae4SAndroid Build Coastguard Worker# Return file name for main or primary sockfilter pid file.
235*6236dae4SAndroid Build Coastguard Worker#
236*6236dae4SAndroid Build Coastguard Workersub mainsockf_pidfilename {
237*6236dae4SAndroid Build Coastguard Worker    my ($piddir, $proto, $ipver, $idnum) = @_;
238*6236dae4SAndroid Build Coastguard Worker    die "unsupported protocol: '$proto'" unless($proto &&
239*6236dae4SAndroid Build Coastguard Worker        (lc($proto) =~ /^(ftp|imap|pop3|smtp)s?$/));
240*6236dae4SAndroid Build Coastguard Worker    my $trailer = (lc($proto) =~ /^ftps?$/) ? '_sockctrl.pid':'_sockfilt.pid';
241*6236dae4SAndroid Build Coastguard Worker    return "${piddir}/". servername_canon($proto, $ipver, $idnum) ."$trailer";
242*6236dae4SAndroid Build Coastguard Worker}
243*6236dae4SAndroid Build Coastguard Worker
244*6236dae4SAndroid Build Coastguard Worker
245*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
246*6236dae4SAndroid Build Coastguard Worker# Return file name for main or primary sockfilter log file.
247*6236dae4SAndroid Build Coastguard Worker#
248*6236dae4SAndroid Build Coastguard Workersub mainsockf_logfilename {
249*6236dae4SAndroid Build Coastguard Worker    my ($logdir, $proto, $ipver, $idnum) = @_;
250*6236dae4SAndroid Build Coastguard Worker    die "unsupported protocol: '$proto'" unless($proto &&
251*6236dae4SAndroid Build Coastguard Worker        (lc($proto) =~ /^(ftp|imap|pop3|smtp)s?$/));
252*6236dae4SAndroid Build Coastguard Worker    my $trailer = (lc($proto) =~ /^ftps?$/) ? '_sockctrl.log':'_sockfilt.log';
253*6236dae4SAndroid Build Coastguard Worker    return "${logdir}/". servername_canon($proto, $ipver, $idnum) ."$trailer";
254*6236dae4SAndroid Build Coastguard Worker}
255*6236dae4SAndroid Build Coastguard Worker
256*6236dae4SAndroid Build Coastguard Worker
257*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
258*6236dae4SAndroid Build Coastguard Worker# Return file name for data or secondary sockfilter pid file.
259*6236dae4SAndroid Build Coastguard Worker#
260*6236dae4SAndroid Build Coastguard Workersub datasockf_pidfilename {
261*6236dae4SAndroid Build Coastguard Worker    my ($piddir, $proto, $ipver, $idnum) = @_;
262*6236dae4SAndroid Build Coastguard Worker    die "unsupported protocol: '$proto'" unless($proto &&
263*6236dae4SAndroid Build Coastguard Worker        (lc($proto) =~ /^ftps?$/));
264*6236dae4SAndroid Build Coastguard Worker    my $trailer = '_sockdata.pid';
265*6236dae4SAndroid Build Coastguard Worker    return "${piddir}/". servername_canon($proto, $ipver, $idnum) ."$trailer";
266*6236dae4SAndroid Build Coastguard Worker}
267*6236dae4SAndroid Build Coastguard Worker
268*6236dae4SAndroid Build Coastguard Worker
269*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
270*6236dae4SAndroid Build Coastguard Worker# Return file name for data or secondary sockfilter log file.
271*6236dae4SAndroid Build Coastguard Worker#
272*6236dae4SAndroid Build Coastguard Workersub datasockf_logfilename {
273*6236dae4SAndroid Build Coastguard Worker    my ($logdir, $proto, $ipver, $idnum) = @_;
274*6236dae4SAndroid Build Coastguard Worker    die "unsupported protocol: '$proto'" unless($proto &&
275*6236dae4SAndroid Build Coastguard Worker        (lc($proto) =~ /^ftps?$/));
276*6236dae4SAndroid Build Coastguard Worker    my $trailer = '_sockdata.log';
277*6236dae4SAndroid Build Coastguard Worker    return "${logdir}/". servername_canon($proto, $ipver, $idnum) ."$trailer";
278*6236dae4SAndroid Build Coastguard Worker}
279*6236dae4SAndroid Build Coastguard Worker
280*6236dae4SAndroid Build Coastguard Worker
281*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
282*6236dae4SAndroid Build Coastguard Worker# End of library
283*6236dae4SAndroid Build Coastguard Worker1;
284