]> git.ipfire.org Git - thirdparty/squid.git/blame - test-suite/htcp-client.pl
SourceFormat Enforcement
[thirdparty/squid.git] / test-suite / htcp-client.pl
CommitLineData
7eddace0 1#!/usr/bin/perl
4e0938ef 2#
4ac4a490 3## Copyright (C) 1996-2017 The Squid Software Foundation and contributors
4e0938ef
AJ
4##
5## Squid software is distributed under GPLv2+ license and includes
6## contributions from numerous individuals and organizations.
7## Please see the COPYING and CONTRIBUTORS files for details.
8##
7eddace0 9
10# htcp-client.pl
11# by Duane Wessels
12#
13# simple tool to send client HTCP queries
14#
15# only supports TST and CLR so far
16#
17
18use strict;
19use warnings;
20use IO::Socket::INET;
21
22my $op = shift;
23my $url = shift;
24my $server = shift;
25my %opcodes = (
26 NOP => 0,
27 TST => 1,
28 MON => 2,
29 SET => 3,
30 CLR => 4,
31);
32
33print "sending $op $url to $server\n";
34
35my $op_data = op_data($op, $url);
36
37
38my $data = data($op_data, $opcodes{$op}, 0, 1, 0, rand 1<<31);
39my $auth = auth();
40
41my $htcp = packet($data, $auth);
42
43my $sock = IO::Socket::INET->new(PeerAddr => $server,
44 PeerPort => 4827,
45 Proto => 'udp');
46
47die "$server: $!" unless $sock;
48
49$sock->send($htcp, 0) || die "send $server: $!";
50exit 0;
51
52sub packet {
53 my $data = shift;
54 my $auth = shift;
55 my $hdr = header(length($data) + length($auth));
56 printf STDERR "hdr is %d bytes\n", length($hdr);
57 printf STDERR "data is %d bytes\n", length($data);
58 printf STDERR "auth is %d bytes\n", length($auth);
59 $hdr . $data . $auth;
60}
61
62sub header {
63 my $length = 4 + shift;
64 my $major = 0;
65 my $minor = 0;
66 my $buf;
67 pack('nCC', $length, $major, $minor);
68}
69
70sub data {
71 my $op_data = shift;
72 my $opcode = shift;
73 my $response = shift;
74 my $reserved = 0;
75 my $f1 = shift;
76 my $rr = shift;
77 my $trans_id = shift;
78 printf STDERR "op_data is %d bytes\n", length($op_data);
79 printf STDERR "response is %d\n", $response;
80 printf STDERR "F1 is %d\n", $f1;
81 printf STDERR "RR is %d\n", $rr;
82 my $length = 8 + length($op_data);
83 my $x1 = ($opcode & 0xF) | (($response & 0xF) << 4);
84 #my $x2 = ($rr & 0x1) | (($f1 & 0x1) << 1) | (($reserved & 0x3F) << 2);
85 my $x2 = ($reserved & 0x3F) | (($f1 & 0x1) << 6) | (($rr & 0x1) << 7);
86 pack('nCCNa*', $length, $x1, $x2, $trans_id, $op_data);
87}
88
89sub auth {
90 pack('n', 2);
91}
92
93sub countstr {
94 my $str = shift;
95 pack('na*', length($str), $str);
96}
97
98sub specifier {
99 my $method = countstr(shift);
100 my $uri = countstr(shift);
101 my $version = countstr(shift);
102 my $req_hdrs = countstr(shift);
103 $method . $uri . $version . $req_hdrs;
104}
105
106sub clr {
107 my $reason = shift;
108 my $reserved = 0;
109 my $specifier = shift;
110 printf STDERR "CLR specifier is %d bytes\n", length($specifier);
111 my $x1 = ($reason & 0xF) | (($reserved & 0x7F) << 4);
112 pack('na*', $x1, $specifier);
113}
114
115sub tst {
116 my $specifier = shift;
117 printf STDERR "TST specifier is %d bytes\n", length($specifier);
118 pack('a*', $specifier);
119}
120
121sub op_data {
122 my $op = shift;
123 my $url = shift;
124 if ($op eq 'CLR') {
125 return clr(1, specifier('GET', $url, 'HTTP/1.1', "Accept: */*\r\n"));
126 } elsif ($op eq 'TST') {
127 return tst(specifier('GET', $url, 'HTTP/1.1', "Accept: */*\r\n"));
128 } else {
129 print STDERR "unsupported HTCP opcode $op\n";
130 exit 1;
131 }
132}