This is an automated email from the ASF dual-hosted git repository.
bcall pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git
The following commit(s) were added to refs/heads/master by this push:
new 789d7a8 traffic_via.pl: Fixed bugs, added tests, and make the output
match more like traffic_via.
789d7a8 is described below
commit 789d7a8b798de5b0dee2c83c7ff27b4b201f8919
Author: Bryan Call <[email protected]>
AuthorDate: Fri Mar 15 13:59:24 2019 -0700
traffic_via.pl: Fixed bugs, added tests, and make the output
match more like traffic_via.
---
tools/traffic_via/test_traffic_via_pl | 47 ++++++
tools/traffic_via/tests/[u c s f p eS;tNc p s ] | 13 ++
tools/traffic_via/tests/[uIcRs f p eN;t cCHp s ] | 13 ++
tools/traffic_via/tests/[uIcRs f p eN;t cCNp s ] | 13 ++
tools/traffic_via/tests/[uScMsSf pSeN;t cCMp sS] | 13 ++
tools/traffic_via/tests/[uScRs f p eN;t cCHp s ] | 13 ++
tools/traffic_via/tests/long rubbish via code2 | 15 ++
tools/traffic_via/tests/rubbish | 6 +
tools/traffic_via/tests/short | 5 +
tools/{ => traffic_via}/traffic_via.pl | 197 +++++++++++++++--------
10 files changed, 265 insertions(+), 70 deletions(-)
diff --git a/tools/traffic_via/test_traffic_via_pl
b/tools/traffic_via/test_traffic_via_pl
new file mode 100755
index 0000000..ed4c6e1
--- /dev/null
+++ b/tools/traffic_via/test_traffic_via_pl
@@ -0,0 +1,47 @@
+#! /usr/bin/env bash
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+set -e # exit on error
+
+TMPDIR=${TMPDIR:-/tmp}
+tmpfile=$(mktemp "$TMPDIR/via.XXXXXX")
+if [ ! -z "$srcdir"]; then
+ srcdir=$(cd $srcdir && pwd)
+else
+ srcdir=$(pwd)
+fi
+
+# test command line option
+echo "Testing the command line option:"
+for f in $srcdir/tests/*; do
+ name=$(basename "$f")
+ echo "testing $name"
+ ./traffic_via.pl -s "$name" > "$tmpfile" 2>&1 || true
+ diff -u "$tmpfile" "$srcdir/tests/$name"
+done
+
+# test stdin
+echo -e "\nTesting stdin:"
+for f in $srcdir/tests/\[*; do
+ name=$(basename "$f")
+ echo "testing $name"
+ echo "$name" | ./traffic_via.pl > "$tmpfile" 2>&1 || true
+ diff -u "$tmpfile" "$srcdir/tests/$name"
+done
+
+rm -f $tmpfile
diff --git a/tools/traffic_via/tests/[u c s f p eS;tNc p s ]
b/tools/traffic_via/tests/[u c s f p eS;tNc p s ]
new file mode 100644
index 0000000..e662dc0
--- /dev/null
+++ b/tools/traffic_via/tests/[u c s f p eS;tNc p s ]
@@ -0,0 +1,13 @@
+Via header is [u c s f p eS;tNc p s ], Length is 22
+Via Header Details:
+Request headers received from client :unknown
+Result of Traffic Server cache lookup for URL :no cache lookup
+Response information received from origin server :no server connection
needed
+Result of document write-to-cache: :no cache write
performed
+Proxy operation result :unknown
+Error codes (if any) :server related error
+Tunnel info :tunneling due to no
forward
+Cache Type :unknown
+Cache Lookup Result :cache miss or no cache
lookup
+Parent proxy connection status :no parent proxy or
unknown
+Origin server connection status :no server connection
needed
diff --git a/tools/traffic_via/tests/[uIcRs f p eN;t cCHp s ]
b/tools/traffic_via/tests/[uIcRs f p eN;t cCHp s ]
new file mode 100644
index 0000000..0755883
--- /dev/null
+++ b/tools/traffic_via/tests/[uIcRs f p eN;t cCHp s ]
@@ -0,0 +1,13 @@
+Via header is [uIcRs f p eN;t cCHp s ], Length is 22
+Via Header Details:
+Request headers received from client :IMS
+Result of Traffic Server cache lookup for URL :in cache, fresh Ram
hit (a cache "HIT")
+Response information received from origin server :no server connection
needed
+Result of document write-to-cache: :no cache write
performed
+Proxy operation result :unknown
+Error codes (if any) :no error
+Tunnel info :no tunneling
+Cache Type :cache
+Cache Lookup Result :cache hit
+Parent proxy connection status :no parent proxy or
unknown
+Origin server connection status :no server connection
needed
diff --git a/tools/traffic_via/tests/[uIcRs f p eN;t cCNp s ]
b/tools/traffic_via/tests/[uIcRs f p eN;t cCNp s ]
new file mode 100644
index 0000000..6ecfc64
--- /dev/null
+++ b/tools/traffic_via/tests/[uIcRs f p eN;t cCNp s ]
@@ -0,0 +1,13 @@
+Via header is [uIcRs f p eN;t cCNp s ], Length is 22
+Via Header Details:
+Request headers received from client :IMS
+Result of Traffic Server cache lookup for URL :in cache, fresh Ram
hit (a cache "HIT")
+Response information received from origin server :no server connection
needed
+Result of document write-to-cache: :no cache write
performed
+Proxy operation result :unknown
+Error codes (if any) :no error
+Tunnel info :no tunneling
+Cache Type :cache
+Cache Lookup Result :conditional hit
(client sent conditional, doc fresh in cache, returned 304)
+Parent proxy connection status :no parent proxy or
unknown
+Origin server connection status :no server connection
needed
diff --git a/tools/traffic_via/tests/[uScMsSf pSeN;t cCMp sS]
b/tools/traffic_via/tests/[uScMsSf pSeN;t cCMp sS]
new file mode 100644
index 0000000..6ee096a
--- /dev/null
+++ b/tools/traffic_via/tests/[uScMsSf pSeN;t cCMp sS]
@@ -0,0 +1,13 @@
+Via header is [uScMsSf pSeN;t cCMp sS], Length is 22
+Via Header Details:
+Request headers received from client :simple request (not
conditional)
+Result of Traffic Server cache lookup for URL :miss (a cache "MISS")
+Response information received from origin server :connection opened
successfully
+Result of document write-to-cache: :no cache write
performed
+Proxy operation result :served or connection
opened successfully
+Error codes (if any) :no error
+Tunnel info :no tunneling
+Cache Type :cache
+Cache Lookup Result :cache miss (url not in
cache)
+Parent proxy connection status :no parent proxy or
unknown
+Origin server connection status :connection opened
successfully
diff --git a/tools/traffic_via/tests/[uScRs f p eN;t cCHp s ]
b/tools/traffic_via/tests/[uScRs f p eN;t cCHp s ]
new file mode 100644
index 0000000..ea96fdb
--- /dev/null
+++ b/tools/traffic_via/tests/[uScRs f p eN;t cCHp s ]
@@ -0,0 +1,13 @@
+Via header is [uScRs f p eN;t cCHp s ], Length is 22
+Via Header Details:
+Request headers received from client :simple request (not
conditional)
+Result of Traffic Server cache lookup for URL :in cache, fresh Ram
hit (a cache "HIT")
+Response information received from origin server :no server connection
needed
+Result of document write-to-cache: :no cache write
performed
+Proxy operation result :unknown
+Error codes (if any) :no error
+Tunnel info :no tunneling
+Cache Type :cache
+Cache Lookup Result :cache hit
+Parent proxy connection status :no parent proxy or
unknown
+Origin server connection status :no server connection
needed
diff --git a/tools/traffic_via/tests/long rubbish via code2
b/tools/traffic_via/tests/long rubbish via code2
new file mode 100644
index 0000000..470c5a1
--- /dev/null
+++ b/tools/traffic_via/tests/long rubbish via code2
@@ -0,0 +1,15 @@
+Via header is [long rubbish via code2], Length is 22
+traffic_via: Invalid VIA header character: l
+traffic_via: Invalid VIA header character: o
+traffic_via: Invalid VIA header character: n
+traffic_via: Invalid VIA header character: g
+traffic_via: Invalid VIA header character: r
+traffic_via: Invalid VIA header character: b
+traffic_via: Invalid VIA header character: b
+traffic_via: Invalid VIA header character: i
+traffic_via: Invalid VIA header character: h
+traffic_via: Invalid VIA header character: v
+traffic_via: Invalid VIA header character: i
+traffic_via: Invalid VIA header character: a
+traffic_via: Invalid VIA header character: o
+traffic_via: Invalid VIA header character: d
diff --git a/tools/traffic_via/tests/rubbish b/tools/traffic_via/tests/rubbish
new file mode 100644
index 0000000..dbeeab0
--- /dev/null
+++ b/tools/traffic_via/tests/rubbish
@@ -0,0 +1,6 @@
+Via header is [rubbish], Length is 7
+traffic_via: Invalid VIA header character: r
+traffic_via: Invalid VIA header character: b
+traffic_via: Invalid VIA header character: b
+traffic_via: Invalid VIA header character: i
+traffic_via: Invalid VIA header character: h
diff --git a/tools/traffic_via/tests/short b/tools/traffic_via/tests/short
new file mode 100644
index 0000000..384a483
--- /dev/null
+++ b/tools/traffic_via/tests/short
@@ -0,0 +1,5 @@
+Via header is [short], Length is 5
+traffic_via: Invalid VIA header character: h
+traffic_via: Invalid VIA header character: o
+traffic_via: Invalid VIA header character: r
+traffic_via: Invalid VIA header character: t
diff --git a/tools/traffic_via.pl b/tools/traffic_via/traffic_via.pl
similarity index 62%
rename from tools/traffic_via.pl
rename to tools/traffic_via/traffic_via.pl
index e5a0f29..a135364 100755
--- a/tools/traffic_via.pl
+++ b/tools/traffic_via/traffic_via.pl
@@ -40,28 +40,28 @@ my $help;
#Proxy request header flags and titles
my @proxy_header_array = (
{
- "Request headers received from client:", {
- 'I' => "If Modified Since (IMS)",
+ "Request headers received from client", {
+ 'I' => "IMS",
'C' => "cookie",
'E' => "error in request",
'S' => "simple request (not conditional)",
'N' => "no-cache",
- ' ' => "unknown?",
+ ' ' => "unknown",
},
}, {
- "Result of Traffic Server cache lookup for URL:", {
+ "Result of Traffic Server cache lookup for URL", {
'A' => "in cache, not acceptable (a cache \"MISS\")",
'H' => "in cache, fresh (a cache \"HIT\")",
'S' => "in cache, stale (a cache \"MISS\")",
'R' => "in cache, fresh Ram hit (a cache \"HIT\")",
'M' => "miss (a cache \"MISS\")",
- ' ' => "unknown?",
+ ' ' => "no cache lookup",
},
}, {
- "Response information received from origin server:", {
+ "Response information received from origin server", {
'E' => "error in response",
' ' => "no server connection needed",
- 'S' => "served",
+ 'S' => "connection opened successfully",
'N' => "not-modified",
}
}, {
@@ -72,14 +72,14 @@ my @proxy_header_array = (
' ' => "no cache write performed",
},
}, {
- "Proxy operation result:", {
+ "Proxy operation result", {
'R' => "origin server revalidated",
- ' ' => "unknown?",
- 'S' => "served",
+ ' ' => "unknown",
+ 'S' => "served or connection opened successfully",
'N' => "not-modified",
},
}, {
- "Error codes (if any):", {
+ "Error codes (if any)", {
'A' => "authorization failure",
'H' => "header syntax unacceptable",
'C' => "connection to server failed",
@@ -90,47 +90,42 @@ my @proxy_header_array = (
'F' => "request forbidden",
},
}, {
- "Tunnel info:", {
+ "Tunnel info", {
' ' => "no tunneling",
'U' => "tunneling because of url (url suggests dynamic content)",
'M' => "tunneling due to a method (e.g. CONNECT)",
'O' => "tunneling because cache is turned off",
'F' => "tunneling due to a header field (such as presence of
If-Range header)",
+ 'N' => "tunneling due to no forward",
},
}, {
- "Cache type:", {
+ "Cache Type", {
+ ' ' => "unknown",
'I' => "icp",
- ' ' => "cache miss or no cache lookup",
'C' => "cache",
},
}, {
- "Cache lookup result:", {
- ' ' => "no cache lookup",
+ "Cache Lookup Result", {
+ ' ' => "cache miss or no cache lookup",
'S' => "cache hit, but expired",
'U' => "cache hit, but client forces revalidate (e.g. Pragma:
no-cache)",
'D' => "cache hit, but method forces revalidated (e.g. ftp, not
anonymous)",
'I' => "conditional miss (client sent conditional, fresh in cache,
returned 412)",
'H' => "cache hit",
'M' => "cache miss (url not in cache)",
- 'C' => "cache hit, but config forces revalidate",
+ 'C' => "cache miss (url not in cache)",
'N' => "conditional hit (client sent conditional, doc fresh in
cache, returned 304)",
},
}, {
- "ICP status:", {
- ' ' => "no icp",
- 'S' => "connection opened successfully",
- 'F' => "connection open failed",
- },
- }, {
- "Parent proxy connection status:", {
- ' ' => "no parent proxy",
+ "Parent proxy connection status", {
+ ' ' => "no parent proxy or unknown",
'S' => "connection opened successfully",
'F' => "connection open failed",
},
}, {
- "Origin server connection status:", {
- ' ' => "no server connection",
+ "Origin server connection status", {
+ ' ' => "no server connection needed",
'S' => "connection opened successfully",
'F' => "connection open failed",
},
@@ -138,7 +133,7 @@ my @proxy_header_array = (
);
##Print script usage
-sub usage
+sub usage()
{
print "\nPass Via Header with -s option \n";
print "Usage: traffic_via [-s viaheader]";
@@ -149,41 +144,10 @@ sub usage
exit;
}
-if (@ARGV == 0) {
- #if passed through standard input
- my @userinput = <STDIN>;
- my $via_string;
-
- for my $element (@userinput) {
- #Pattern matching for Via
- if ($element =~ /Via:(.*)\[(.*)\]/) {
- #Search and grep via header
- $via_string = $2;
- chomp($via_string);
- print "Via Header is [$via_string]";
- decode_via_header($via_string);
- }
- }
-} else {
- usage()
- if (
- !GetOptions(
- 's=s' => \$via_header,
- 'help|?' => \$help
- )
- or defined $help
- );
-
- if (defined $via_header) {
- #if passed through commandline dashed argument
- print "Via Header is [$via_header]";
- decode_via_header($via_header);
- }
-}
#Subroutine to decode via header
-sub decode_via_header
+sub decode_via_header($)
{
my ($header) = @_;
my $hdrLength;
@@ -194,45 +158,98 @@ sub decode_via_header
#Get via header length
$hdrLength = length($header);
- # Valid Via header length is 24 or 6.
- # When Via header length is 24, it will have both proxy request header
result and operational results.
- if ($hdrLength == 24) {
+ # Valid Via header length is 22 or 6.
+ # When Via header length is 22, it will have both proxy request header
result and operational results.
+ if ($hdrLength == 22) {
#Split via header: proxy result and operational result
$newHeader = join('', split(':', $header));
} elsif ($hdrLength == 6) {
$newHeader = $header;
} elsif ($hdrLength == 5) {
# When Via header length is 5, it might be missing last field.
Fill it and decode header.
- my $newHeader = "$header" . " ";
+ $newHeader = $header . " ";
} else {
# Invalid header size, come out.
- print "\nInvalid VIA header. VIA header length should be 6 or 24
characters\n";
+ print "\nInvalid VIA header. VIA header length should be 6 or 22
characters\n";
return;
}
+
convert_header_to_array($newHeader);
}
}
-sub convert_header_to_array
+sub convert_header_to_array($)
{
my ($viaHeader) = @_;
my @ResultArray;
#Convert string header into character array
while ($viaHeader =~ /(.)/g) {
#Only capital letters indicate flags
- if ($1 !~ m/[a-z]+/) {
+ if ($1 !~ m/[a-z;]+/) {
push(@ResultArray, $1);
}
}
- print "\nVia Header details: \n";
+ print "Via Header Details:\n";
for (my $arrayIndex = 0; $arrayIndex < scalar(@ResultArray);
$arrayIndex++) {
get_via_header_flags(\@proxy_header_array, $arrayIndex,
$ResultArray[$arrayIndex]);
}
}
+my %valid_keys = ('main' => {
+ 'u' => 1,
+ 'c' => 1,
+ 's' => 1,
+ 'f' => 1,
+ 'p' => 1,
+ 'e' => 1,
+ },
+ 'detail' => {
+ 't' => 1,
+ 'c' => 1,
+ 'p' => 1,
+ 's' => 1,
+ }
+);
+
+sub valid_char ($$)
+{
+ my($char, $hash) = @_;
+
+ return exists $hash->{$char}
+}
+
+sub validate_keys($)
+{
+ my($viaHeader) = @_;
+ my($main, $detail) = split(';', $viaHeader);
+ my $running_main = 1;
+ my $return_value_valid = 1;
+
+ foreach my $group ($main, $detail) {
+ next if !defined $group;
+
+ while ($group =~ /([a-z])/g) {
+ my $char = $1;
+
+ my $valid = 0;
+ if ($running_main) {
+ $valid = valid_char($char, $valid_keys{main});
+ } else {
+ $valid = valid_char($char, $valid_keys{detail});
+ }
+ if (! $valid) {
+ print "traffic_via: Invalid VIA header character: $char\n";
+ $return_value_valid = 0;
+ }
+ }
+ $running_main = 0;
+ }
+ return $return_value_valid;
+}
+
#Get values from header arrays
-sub get_via_header_flags
+sub get_via_header_flags($$$)
{
my ($arrayName, $inputIndex, $flag) = @_;
@@ -253,9 +270,49 @@ sub get_via_header_flags
foreach my $key (@keys) {
if ($key =~ /$flag/) {
#print $flags{$key};
- printf("%s", $flags{$key});
+ printf(":%s", $flags{$key});
print "\n";
}
}
}
}
+
+# main
+{
+ if (@ARGV == 0) {
+ #if passed through standard input
+ my @userinput = <STDIN>;
+
+ for my $element (@userinput) {
+ #Pattern matching for Via
+ if ($element =~ /Via:\s+\[(.+)\]/i || $element =~ /\[(.+)\]/ ) {
+ #Search and grep via header
+ my $via_string = $1;
+ chomp($via_string);
+ print "Via header is [$via_string], Length is ",
length($via_string), "\n";
+ last unless validate_keys($via_string);
+ decode_via_header($via_string);
+ }
+ }
+ } else {
+ usage()
+ if (
+ !GetOptions(
+ 's=s' => \$via_header,
+ 'help|?' => \$help
+ )
+ or defined $help
+ );
+
+ if (defined $via_header) {
+ if ($via_header =~ /Via:\s+\[(.+)\]/i || $via_header =~ /\[(.+)\]/
|| $via_header =~ /(.+)/) {
+ #if passed through commandline dashed argument
+ my $via_string = $1;
+ print "Via header is [$via_string], Length is ",
length($via_string), "\n";
+ last unless validate_keys($via_string);
+ decode_via_header($via_string);
+ }
+ }
+
+ }
+}
\ No newline at end of file