# HG changeset patch # User Mahlon E. Smith # Date 1319435999 25200 # Node ID 191b3c25974aaf116b7f4239a1b5a5f3772dff06 # Parent 9aa5114326e8eebd403ea2465d704cf6a28c548e Clean up redundant parser actions via preprocessor macros, add a hostname->tld extractor for doing tld "wildcard" queries. Stop tracking 'parser.c' completely. diff -r 9aa5114326e8 -r 191b3c25974a .hgignore --- a/.hgignore Mon Oct 17 09:12:00 2011 -0700 +++ b/.hgignore Sun Oct 23 22:59:59 2011 -0700 @@ -5,3 +5,4 @@ .*debug .*.o ^misc +^parser.c diff -r 9aa5114326e8 -r 191b3c25974a parser.c --- a/parser.c Mon Oct 17 09:12:00 2011 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2146 +0,0 @@ - -#line 1 "parser.rl" -/* vim: set noet nosta sw=4 ts=4 ft=ragel : */ -/* -Copyright (c) 2011, Mahlon E. Smith -All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - * Neither the name of Mahlon E. Smith nor the names of his - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -#include "volta.h" - - -#line 141 "parser.rl" - - -#line 40 "parser.c" -static const int redirector_start = 1; -static const int redirector_first_final = 85; -static const int redirector_error = 0; - -static const int redirector_en_main = 1; - - -#line 143 "parser.rl" - -/* - * Tokenize an incoming line from squid, returning a parsed and populated - * structure to make redirection decisions against. This pointer should - * be freed using cleanup_request() after use. - * - * Squid documentation about redirectors: - * --------------------------------------------------------------------------- - * TAG: url_rewrite_program - * Specify the location of the executable for the URL rewriter. - * Since they can perform almost any function there isn't one included. - * - * For each requested URL rewriter will receive on line with the format - * - * URL client_ip "/" fqdn user method [ kvpairs] - * - * In the future, the rewriter interface will be extended with - * key=value pairs ("kvpairs" shown above). Rewriter programs - * should be prepared to receive and possibly ignore additional - * whitespace-separated tokens on each input line. - * - * And the rewriter may return a rewritten URL. The other components of - * the request line does not need to be returned (ignored if they are). - * - * The rewriter can also indicate that a client-side redirect should - * be performed to the new URL. This is done by prefixing the returned - * URL with "301:" (moved permanently) or 302: (moved temporarily). - * - * By default, a URL rewriter is not used. - * --------------------------------------------------------------------------- -*/ -request * -parse( char *line ) -{ - /* machine required vars */ - int cs = 0; - char *p = line; - char *pe = p + strlen(p); - char *eof = NULL; - - /* the client request pointer */ - unsigned char valid = 0; - request *p_request = init_request(); - - /* enter state machine */ - -#line 95 "parser.c" - { - cs = redirector_start; - } - -#line 189 "parser.rl" - -#line 102 "parser.c" - { - if ( p == pe ) - goto _test_eof; - switch ( cs ) - { -case 1: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr1; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr2; - } else - goto tr2; - goto tr0; -tr0: -#line 46 "parser.rl" - { debug( 3, LOC, "Unable to parse scheme.\n" ); } -#line 50 "parser.rl" - { debug( 3, LOC, "Unable to parse hostname.\n" ); } -#line 37 "parser.rl" - { valid = 0; } - goto st0; -tr3: -#line 37 "parser.rl" - { valid = 0; } - goto st0; -tr11: -#line 46 "parser.rl" - { debug( 3, LOC, "Unable to parse scheme.\n" ); } -#line 50 "parser.rl" - { debug( 3, LOC, "Unable to parse hostname.\n" ); } -#line 64 "parser.rl" - { debug( 3, LOC, "Unable to parse the client IP address.\n" ); } -#line 37 "parser.rl" - { valid = 0; } - goto st0; -tr14: -#line 64 "parser.rl" - { debug( 3, LOC, "Unable to parse the client IP address.\n" ); } -#line 37 "parser.rl" - { valid = 0; } - goto st0; -tr35: -#line 60 "parser.rl" - { debug( 3, LOC, "Unable to parse method.\n" ); } -#line 37 "parser.rl" - { valid = 0; } - goto st0; -tr49: -#line 50 "parser.rl" - { debug( 3, LOC, "Unable to parse hostname.\n" ); } -#line 37 "parser.rl" - { valid = 0; } - goto st0; -tr92: -#line 46 "parser.rl" - { debug( 3, LOC, "Unable to parse scheme.\n" ); } -#line 37 "parser.rl" - { valid = 0; } - goto st0; -#line 164 "parser.c" -st0: -cs = 0; - goto _out; -tr1: -#line 48 "parser.rl" - { p_request->tokens.host_start = p; } - goto st2; -st2: - if ( ++p == pe ) - goto _test_eof2; -case 2: -#line 176 "parser.c" - switch( (*p) ) { - case 32: goto tr4; - case 45: goto st32; - case 46: goto st34; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr4; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st2; - goto tr3; -tr4: -#line 49 "parser.rl" - { p_request->tokens.host_length = p - ( *pe + p_request->tokens.host_start ); } -#line 55 "parser.rl" - { p_request->tokens.path_start = p; } -#line 56 "parser.rl" - { p_request->tokens.path_length = p - ( *pe + p_request->tokens.path_start ); } - goto st3; -st3: - if ( ++p == pe ) - goto _test_eof3; -case 3: -#line 209 "parser.c" - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr12; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr13; - } else - goto tr13; - goto tr11; -tr12: -#line 39 "parser.rl" - { - debug( 1, LOC, "Channel ID found in redirector input. Set 'url_rewrite_concurrency' to '0' in squid.\n" ); - {p++; cs = 4; goto _out;} - } -#line 48 "parser.rl" - { p_request->tokens.host_start = p; } -#line 62 "parser.rl" - { p_request->tokens.c_ip_start = p; } - goto st4; -st4: - if ( ++p == pe ) - goto _test_eof4; -case 4: -#line 234 "parser.c" - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st42; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st75; - goto tr14; -tr15: -#line 49 "parser.rl" - { p_request->tokens.host_length = p - ( *pe + p_request->tokens.host_start ); } -#line 55 "parser.rl" - { p_request->tokens.path_start = p; } -#line 56 "parser.rl" - { p_request->tokens.path_length = p - ( *pe + p_request->tokens.path_start ); } - goto st5; -tr51: -#line 56 "parser.rl" - { p_request->tokens.path_length = p - ( *pe + p_request->tokens.path_start ); } - goto st5; -tr53: -#line 53 "parser.rl" - { p_request->tokens.port_length = p - ( *pe + p_request->tokens.port_start ); } -#line 55 "parser.rl" - { p_request->tokens.path_start = p; } -#line 56 "parser.rl" - { p_request->tokens.path_length = p - ( *pe + p_request->tokens.path_start ); } - goto st5; -st5: - if ( ++p == pe ) - goto _test_eof5; -case 5: -#line 279 "parser.c" - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr18; - goto tr14; -tr18: -#line 62 "parser.rl" - { p_request->tokens.c_ip_start = p; } - goto st6; -st6: - if ( ++p == pe ) - goto _test_eof6; -case 6: -#line 291 "parser.c" - if ( (*p) == 46 ) - goto st7; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st30; - goto tr14; -st7: - if ( ++p == pe ) - goto _test_eof7; -case 7: - if ( 48 <= (*p) && (*p) <= 57 ) - goto st8; - goto tr14; -st8: - if ( ++p == pe ) - goto _test_eof8; -case 8: - if ( (*p) == 46 ) - goto st9; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st28; - goto tr14; -st9: - if ( ++p == pe ) - goto _test_eof9; -case 9: - if ( 48 <= (*p) && (*p) <= 57 ) - goto st10; - goto tr14; -st10: - if ( ++p == pe ) - goto _test_eof10; -case 10: - if ( (*p) == 46 ) - goto st11; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st26; - goto tr14; -st11: - if ( ++p == pe ) - goto _test_eof11; -case 11: - if ( 48 <= (*p) && (*p) <= 57 ) - goto st12; - goto tr14; -st12: - if ( ++p == pe ) - goto _test_eof12; -case 12: - if ( (*p) == 47 ) - goto tr28; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st24; - goto tr3; -tr28: -#line 63 "parser.rl" - { p_request->tokens.c_ip_length = p - ( *pe + p_request->tokens.c_ip_start ); } - goto st13; -st13: - if ( ++p == pe ) - goto _test_eof13; -case 13: -#line 353 "parser.c" - if ( (*p) == 45 ) - goto st14; - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st21; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st21; - } else - goto st21; - goto tr3; -st14: - if ( ++p == pe ) - goto _test_eof14; -case 14: - if ( (*p) == 32 ) - goto st15; - if ( 9 <= (*p) && (*p) <= 13 ) - goto st15; - goto tr3; -st15: - if ( ++p == pe ) - goto _test_eof15; -case 15: - switch( (*p) ) { - case 33: goto st16; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( 36 <= (*p) && (*p) <= 46 ) - goto st16; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st16; - goto tr3; -st16: - if ( ++p == pe ) - goto _test_eof16; -case 16: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 46 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st16; - goto tr3; -st17: - if ( ++p == pe ) - goto _test_eof17; -case 17: - if ( 65 <= (*p) && (*p) <= 90 ) - goto tr36; - goto tr35; -tr36: -#line 58 "parser.rl" - { p_request->tokens.meth_start = p; } - goto st18; -st18: - if ( ++p == pe ) - goto _test_eof18; -case 18: -#line 439 "parser.c" - switch( (*p) ) { - case 10: goto tr39; - case 32: goto tr37; - } - if ( (*p) > 13 ) { - if ( 65 <= (*p) && (*p) <= 90 ) - goto st18; - } else if ( (*p) >= 9 ) - goto tr37; - goto st0; -tr37: -#line 59 "parser.rl" - { p_request->tokens.meth_length = p - ( *pe + p_request->tokens.meth_start ); } - goto st19; -st19: - if ( ++p == pe ) - goto _test_eof19; -case 19: -#line 458 "parser.c" - goto st20; -st20: - if ( ++p == pe ) - goto _test_eof20; -case 20: - if ( (*p) == 10 ) - goto tr42; - goto st20; -tr42: -#line 36 "parser.rl" - { valid = 1; } - goto st85; -st85: - if ( ++p == pe ) - goto _test_eof85; -case 85: -#line 475 "parser.c" - if ( (*p) == 10 ) - goto tr42; - goto st20; -tr39: -#line 59 "parser.rl" - { p_request->tokens.meth_length = p - ( *pe + p_request->tokens.meth_start ); } -#line 36 "parser.rl" - { valid = 1; } - goto st86; -st86: - if ( ++p == pe ) - goto _test_eof86; -case 86: -#line 489 "parser.c" - goto st20; -st21: - if ( ++p == pe ) - goto _test_eof21; -case 21: - switch( (*p) ) { - case 32: goto st15; - case 45: goto st22; - case 46: goto st23; - case 95: goto st22; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto st15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st21; - } else if ( (*p) >= 65 ) - goto st21; - } else - goto st21; - goto tr3; -st22: - if ( ++p == pe ) - goto _test_eof22; -case 22: - switch( (*p) ) { - case 45: goto st22; - case 95: goto st22; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st21; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st21; - } else - goto st21; - goto tr3; -st23: - if ( ++p == pe ) - goto _test_eof23; -case 23: - if ( (*p) == 32 ) - goto st15; - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto st15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st21; - } else if ( (*p) >= 65 ) - goto st21; - } else - goto st21; - goto tr3; -st24: - if ( ++p == pe ) - goto _test_eof24; -case 24: - if ( (*p) == 47 ) - goto tr28; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st25; - goto tr3; -st25: - if ( ++p == pe ) - goto _test_eof25; -case 25: - if ( (*p) == 47 ) - goto tr28; - goto tr3; -st26: - if ( ++p == pe ) - goto _test_eof26; -case 26: - if ( (*p) == 46 ) - goto st11; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st27; - goto tr14; -st27: - if ( ++p == pe ) - goto _test_eof27; -case 27: - if ( (*p) == 46 ) - goto st11; - goto tr14; -st28: - if ( ++p == pe ) - goto _test_eof28; -case 28: - if ( (*p) == 46 ) - goto st9; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st29; - goto tr14; -st29: - if ( ++p == pe ) - goto _test_eof29; -case 29: - if ( (*p) == 46 ) - goto st9; - goto tr14; -st30: - if ( ++p == pe ) - goto _test_eof30; -case 30: - if ( (*p) == 46 ) - goto st7; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st31; - goto tr14; -st31: - if ( ++p == pe ) - goto _test_eof31; -case 31: - if ( (*p) == 46 ) - goto st7; - goto tr14; -st32: - if ( ++p == pe ) - goto _test_eof32; -case 32: - switch( (*p) ) { - case 45: goto st32; - case 95: goto st32; - } - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st33; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else - goto st33; - goto tr49; -tr99: -#line 45 "parser.rl" - { p_request->tokens.scheme_length = p - ( *pe + p_request->tokens.scheme_start ); } -#line 48 "parser.rl" - { p_request->tokens.host_start = p; } - goto st33; -st33: - if ( ++p == pe ) - goto _test_eof33; -case 33: -#line 639 "parser.c" - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st34; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st33; - goto tr3; -st34: - if ( ++p == pe ) - goto _test_eof34; -case 34: - switch( (*p) ) { - case 32: goto tr15; - case 47: goto tr7; - case 58: goto tr9; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st33; - goto tr3; -tr7: -#line 49 "parser.rl" - { p_request->tokens.host_length = p - ( *pe + p_request->tokens.host_start ); } -#line 55 "parser.rl" - { p_request->tokens.path_start = p; } - goto st35; -tr54: -#line 53 "parser.rl" - { p_request->tokens.port_length = p - ( *pe + p_request->tokens.port_start ); } -#line 55 "parser.rl" - { p_request->tokens.path_start = p; } - goto st35; -st35: - if ( ++p == pe ) - goto _test_eof35; -case 35: -#line 697 "parser.c" - if ( (*p) == 32 ) - goto tr51; - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr51; - goto st35; -tr9: -#line 49 "parser.rl" - { p_request->tokens.host_length = p - ( *pe + p_request->tokens.host_start ); } -#line 52 "parser.rl" - { p_request->tokens.port_start = p; } - goto st36; -st36: - if ( ++p == pe ) - goto _test_eof36; -case 36: -#line 713 "parser.c" - if ( 48 <= (*p) && (*p) <= 57 ) - goto st37; - goto tr3; -st37: - if ( ++p == pe ) - goto _test_eof37; -case 37: - switch( (*p) ) { - case 32: goto tr53; - case 47: goto tr54; - } - if ( (*p) > 13 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st38; - } else if ( (*p) >= 9 ) - goto tr53; - goto tr3; -st38: - if ( ++p == pe ) - goto _test_eof38; -case 38: - switch( (*p) ) { - case 32: goto tr53; - case 47: goto tr54; - } - if ( (*p) > 13 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st39; - } else if ( (*p) >= 9 ) - goto tr53; - goto tr3; -st39: - if ( ++p == pe ) - goto _test_eof39; -case 39: - switch( (*p) ) { - case 32: goto tr53; - case 47: goto tr54; - } - if ( (*p) > 13 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st40; - } else if ( (*p) >= 9 ) - goto tr53; - goto tr3; -st40: - if ( ++p == pe ) - goto _test_eof40; -case 40: - switch( (*p) ) { - case 32: goto tr53; - case 47: goto tr54; - } - if ( (*p) > 13 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto st41; - } else if ( (*p) >= 9 ) - goto tr53; - goto tr3; -st41: - if ( ++p == pe ) - goto _test_eof41; -case 41: - switch( (*p) ) { - case 32: goto tr53; - case 47: goto tr54; - } - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr53; - goto tr3; -st42: - if ( ++p == pe ) - goto _test_eof42; -case 42: - switch( (*p) ) { - case 32: goto tr15; - case 47: goto tr7; - case 58: goto tr9; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st43; - goto tr14; -st43: - if ( ++p == pe ) - goto _test_eof43; -case 43: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st44; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st73; - goto tr14; -st44: - if ( ++p == pe ) - goto _test_eof44; -case 44: - switch( (*p) ) { - case 32: goto tr15; - case 47: goto tr7; - case 58: goto tr9; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st45; - goto tr14; -st45: - if ( ++p == pe ) - goto _test_eof45; -case 45: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st46; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st71; - goto tr14; -st46: - if ( ++p == pe ) - goto _test_eof46; -case 46: - switch( (*p) ) { - case 32: goto tr15; - case 47: goto tr7; - case 58: goto tr9; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st47; - goto tr14; -st47: - if ( ++p == pe ) - goto _test_eof47; -case 47: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st34; - case 47: goto tr66; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st69; - goto tr3; -tr66: -#line 49 "parser.rl" - { p_request->tokens.host_length = p - ( *pe + p_request->tokens.host_start ); } -#line 55 "parser.rl" - { p_request->tokens.path_start = p; } -#line 63 "parser.rl" - { p_request->tokens.c_ip_length = p - ( *pe + p_request->tokens.c_ip_start ); } - goto st48; -st48: - if ( ++p == pe ) - goto _test_eof48; -case 48: -#line 931 "parser.c" - switch( (*p) ) { - case 32: goto tr51; - case 45: goto st49; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr51; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st66; - } else if ( (*p) >= 65 ) - goto st66; - } else - goto st66; - goto st35; -st49: - if ( ++p == pe ) - goto _test_eof49; -case 49: - if ( (*p) == 32 ) - goto tr70; - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr70; - goto st35; -tr70: -#line 56 "parser.rl" - { p_request->tokens.path_length = p - ( *pe + p_request->tokens.path_start ); } - goto st50; -st50: - if ( ++p == pe ) - goto _test_eof50; -case 50: -#line 965 "parser.c" - switch( (*p) ) { - case 33: goto st16; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( 36 <= (*p) && (*p) <= 46 ) - goto st16; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto tr71; - goto tr14; -tr71: -#line 62 "parser.rl" - { p_request->tokens.c_ip_start = p; } - goto st51; -st51: - if ( ++p == pe ) - goto _test_eof51; -case 51: -#line 993 "parser.c" - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 46: goto st52; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 45 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st64; - goto tr14; -st52: - if ( ++p == pe ) - goto _test_eof52; -case 52: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 46 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st53; - goto tr14; -st53: - if ( ++p == pe ) - goto _test_eof53; -case 53: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 46: goto st54; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 45 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st62; - goto tr14; -st54: - if ( ++p == pe ) - goto _test_eof54; -case 54: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 46 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st55; - goto tr14; -st55: - if ( ++p == pe ) - goto _test_eof55; -case 55: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 46: goto st56; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 45 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st60; - goto tr14; -st56: - if ( ++p == pe ) - goto _test_eof56; -case 56: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 46 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st57; - goto tr14; -st57: - if ( ++p == pe ) - goto _test_eof57; -case 57: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 47: goto tr28; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 46 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st58; - goto tr3; -st58: - if ( ++p == pe ) - goto _test_eof58; -case 58: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 47: goto tr28; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 46 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st59; - goto tr3; -st59: - if ( ++p == pe ) - goto _test_eof59; -case 59: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 47: goto tr28; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 36 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st16; - goto tr3; -st60: - if ( ++p == pe ) - goto _test_eof60; -case 60: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 46: goto st56; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 45 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st61; - goto tr14; -st61: - if ( ++p == pe ) - goto _test_eof61; -case 61: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 46: goto st56; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 45 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st16; - goto tr14; -st62: - if ( ++p == pe ) - goto _test_eof62; -case 62: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 46: goto st54; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 45 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st63; - goto tr14; -st63: - if ( ++p == pe ) - goto _test_eof63; -case 63: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 46: goto st54; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 45 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st16; - goto tr14; -st64: - if ( ++p == pe ) - goto _test_eof64; -case 64: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 46: goto st52; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 45 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st65; - goto tr14; -st65: - if ( ++p == pe ) - goto _test_eof65; -case 65: - switch( (*p) ) { - case 32: goto st17; - case 33: goto st16; - case 46: goto st52; - case 59: goto st16; - case 61: goto st16; - case 95: goto st16; - case 126: goto st16; - } - if ( (*p) < 48 ) { - if ( (*p) > 13 ) { - if ( 36 <= (*p) && (*p) <= 45 ) - goto st16; - } else if ( (*p) >= 9 ) - goto st17; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st16; - } else if ( (*p) >= 65 ) - goto st16; - } else - goto st16; - goto tr14; -st66: - if ( ++p == pe ) - goto _test_eof66; -case 66: - switch( (*p) ) { - case 32: goto tr70; - case 45: goto st67; - case 46: goto st68; - case 95: goto st67; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr70; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st66; - } else if ( (*p) >= 65 ) - goto st66; - } else - goto st66; - goto st35; -st67: - if ( ++p == pe ) - goto _test_eof67; -case 67: - switch( (*p) ) { - case 32: goto tr51; - case 45: goto st67; - case 95: goto st67; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr51; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st66; - } else if ( (*p) >= 65 ) - goto st66; - } else - goto st66; - goto st35; -st68: - if ( ++p == pe ) - goto _test_eof68; -case 68: - if ( (*p) == 32 ) - goto tr70; - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr70; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st66; - } else if ( (*p) >= 65 ) - goto st66; - } else - goto st66; - goto st35; -st69: - if ( ++p == pe ) - goto _test_eof69; -case 69: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st34; - case 47: goto tr66; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st70; - goto tr3; -st70: - if ( ++p == pe ) - goto _test_eof70; -case 70: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st34; - case 47: goto tr66; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st33; - goto tr3; -st71: - if ( ++p == pe ) - goto _test_eof71; -case 71: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st46; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st72; - goto tr14; -st72: - if ( ++p == pe ) - goto _test_eof72; -case 72: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st46; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st33; - goto tr14; -st73: - if ( ++p == pe ) - goto _test_eof73; -case 73: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st44; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st74; - goto tr14; -st74: - if ( ++p == pe ) - goto _test_eof74; -case 74: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st44; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st33; - goto tr14; -st75: - if ( ++p == pe ) - goto _test_eof75; -case 75: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st42; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st76; - goto tr14; -st76: - if ( ++p == pe ) - goto _test_eof76; -case 76: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st42; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st33; - goto tr14; -tr2: -#line 44 "parser.rl" - { p_request->tokens.scheme_start = p; } -#line 48 "parser.rl" - { p_request->tokens.host_start = p; } - goto st77; -tr13: -#line 39 "parser.rl" - { - debug( 1, LOC, "Channel ID found in redirector input. Set 'url_rewrite_concurrency' to '0' in squid.\n" ); - {p++; cs = 77; goto _out;} - } -#line 44 "parser.rl" - { p_request->tokens.scheme_start = p; } -#line 48 "parser.rl" - { p_request->tokens.host_start = p; } - goto st77; -st77: - if ( ++p == pe ) - goto _test_eof77; -case 77: -#line 1678 "parser.c" - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st34; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st78; - } else if ( (*p) >= 65 ) - goto st78; - } else - goto st33; - goto tr92; -st78: - if ( ++p == pe ) - goto _test_eof78; -case 78: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st34; - case 47: goto tr7; - case 58: goto tr9; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st79; - } else if ( (*p) >= 65 ) - goto st79; - } else - goto st33; - goto tr92; -st79: - if ( ++p == pe ) - goto _test_eof79; -case 79: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st34; - case 47: goto tr7; - case 58: goto tr95; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st83; - } else if ( (*p) >= 65 ) - goto st83; - } else - goto st33; - goto tr92; -tr95: -#line 49 "parser.rl" - { p_request->tokens.host_length = p - ( *pe + p_request->tokens.host_start ); } -#line 52 "parser.rl" - { p_request->tokens.port_start = p; } - goto st80; -st80: - if ( ++p == pe ) - goto _test_eof80; -case 80: -#line 1757 "parser.c" - if ( (*p) == 47 ) - goto st81; - if ( 48 <= (*p) && (*p) <= 57 ) - goto st37; - goto tr92; -st81: - if ( ++p == pe ) - goto _test_eof81; -case 81: - if ( (*p) == 47 ) - goto st82; - goto tr92; -st82: - if ( ++p == pe ) - goto _test_eof82; -case 82: - if ( (*p) < 65 ) { - if ( 48 <= (*p) && (*p) <= 57 ) - goto tr99; - } else if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto tr99; - } else - goto tr99; - goto tr49; -st83: - if ( ++p == pe ) - goto _test_eof83; -case 83: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st34; - case 47: goto tr7; - case 58: goto tr95; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st84; - } else if ( (*p) >= 65 ) - goto st84; - } else - goto st33; - goto tr92; -st84: - if ( ++p == pe ) - goto _test_eof84; -case 84: - switch( (*p) ) { - case 32: goto tr15; - case 45: goto st32; - case 46: goto st34; - case 47: goto tr7; - case 58: goto tr95; - case 95: goto st32; - } - if ( (*p) < 48 ) { - if ( 9 <= (*p) && (*p) <= 13 ) - goto tr15; - } else if ( (*p) > 57 ) { - if ( (*p) > 90 ) { - if ( 97 <= (*p) && (*p) <= 122 ) - goto st33; - } else if ( (*p) >= 65 ) - goto st33; - } else - goto st33; - goto tr92; - } - _test_eof2: cs = 2; goto _test_eof; - _test_eof3: cs = 3; goto _test_eof; - _test_eof4: cs = 4; goto _test_eof; - _test_eof5: cs = 5; goto _test_eof; - _test_eof6: cs = 6; goto _test_eof; - _test_eof7: cs = 7; goto _test_eof; - _test_eof8: cs = 8; goto _test_eof; - _test_eof9: cs = 9; goto _test_eof; - _test_eof10: cs = 10; goto _test_eof; - _test_eof11: cs = 11; goto _test_eof; - _test_eof12: cs = 12; goto _test_eof; - _test_eof13: cs = 13; goto _test_eof; - _test_eof14: cs = 14; goto _test_eof; - _test_eof15: cs = 15; goto _test_eof; - _test_eof16: cs = 16; goto _test_eof; - _test_eof17: cs = 17; goto _test_eof; - _test_eof18: cs = 18; goto _test_eof; - _test_eof19: cs = 19; goto _test_eof; - _test_eof20: cs = 20; goto _test_eof; - _test_eof85: cs = 85; goto _test_eof; - _test_eof86: cs = 86; goto _test_eof; - _test_eof21: cs = 21; goto _test_eof; - _test_eof22: cs = 22; goto _test_eof; - _test_eof23: cs = 23; goto _test_eof; - _test_eof24: cs = 24; goto _test_eof; - _test_eof25: cs = 25; goto _test_eof; - _test_eof26: cs = 26; goto _test_eof; - _test_eof27: cs = 27; goto _test_eof; - _test_eof28: cs = 28; goto _test_eof; - _test_eof29: cs = 29; goto _test_eof; - _test_eof30: cs = 30; goto _test_eof; - _test_eof31: cs = 31; goto _test_eof; - _test_eof32: cs = 32; goto _test_eof; - _test_eof33: cs = 33; goto _test_eof; - _test_eof34: cs = 34; goto _test_eof; - _test_eof35: cs = 35; goto _test_eof; - _test_eof36: cs = 36; goto _test_eof; - _test_eof37: cs = 37; goto _test_eof; - _test_eof38: cs = 38; goto _test_eof; - _test_eof39: cs = 39; goto _test_eof; - _test_eof40: cs = 40; goto _test_eof; - _test_eof41: cs = 41; goto _test_eof; - _test_eof42: cs = 42; goto _test_eof; - _test_eof43: cs = 43; goto _test_eof; - _test_eof44: cs = 44; goto _test_eof; - _test_eof45: cs = 45; goto _test_eof; - _test_eof46: cs = 46; goto _test_eof; - _test_eof47: cs = 47; goto _test_eof; - _test_eof48: cs = 48; goto _test_eof; - _test_eof49: cs = 49; goto _test_eof; - _test_eof50: cs = 50; goto _test_eof; - _test_eof51: cs = 51; goto _test_eof; - _test_eof52: cs = 52; goto _test_eof; - _test_eof53: cs = 53; goto _test_eof; - _test_eof54: cs = 54; goto _test_eof; - _test_eof55: cs = 55; goto _test_eof; - _test_eof56: cs = 56; goto _test_eof; - _test_eof57: cs = 57; goto _test_eof; - _test_eof58: cs = 58; goto _test_eof; - _test_eof59: cs = 59; goto _test_eof; - _test_eof60: cs = 60; goto _test_eof; - _test_eof61: cs = 61; goto _test_eof; - _test_eof62: cs = 62; goto _test_eof; - _test_eof63: cs = 63; goto _test_eof; - _test_eof64: cs = 64; goto _test_eof; - _test_eof65: cs = 65; goto _test_eof; - _test_eof66: cs = 66; goto _test_eof; - _test_eof67: cs = 67; goto _test_eof; - _test_eof68: cs = 68; goto _test_eof; - _test_eof69: cs = 69; goto _test_eof; - _test_eof70: cs = 70; goto _test_eof; - _test_eof71: cs = 71; goto _test_eof; - _test_eof72: cs = 72; goto _test_eof; - _test_eof73: cs = 73; goto _test_eof; - _test_eof74: cs = 74; goto _test_eof; - _test_eof75: cs = 75; goto _test_eof; - _test_eof76: cs = 76; goto _test_eof; - _test_eof77: cs = 77; goto _test_eof; - _test_eof78: cs = 78; goto _test_eof; - _test_eof79: cs = 79; goto _test_eof; - _test_eof80: cs = 80; goto _test_eof; - _test_eof81: cs = 81; goto _test_eof; - _test_eof82: cs = 82; goto _test_eof; - _test_eof83: cs = 83; goto _test_eof; - _test_eof84: cs = 84; goto _test_eof; - - _test_eof: {} - if ( p == eof ) - { - switch ( cs ) { - case 2: - case 12: - case 13: - case 14: - case 15: - case 16: - case 19: - case 21: - case 22: - case 23: - case 24: - case 25: - case 33: - case 34: - case 35: - case 36: - case 37: - case 38: - case 39: - case 40: - case 41: - case 47: - case 48: - case 49: - case 57: - case 58: - case 59: - case 66: - case 67: - case 68: - case 69: - case 70: -#line 37 "parser.rl" - { valid = 0; } - break; - case 77: - case 78: - case 79: - case 80: - case 81: - case 83: - case 84: -#line 46 "parser.rl" - { debug( 3, LOC, "Unable to parse scheme.\n" ); } -#line 37 "parser.rl" - { valid = 0; } - break; - case 32: - case 82: -#line 50 "parser.rl" - { debug( 3, LOC, "Unable to parse hostname.\n" ); } -#line 37 "parser.rl" - { valid = 0; } - break; - case 17: -#line 60 "parser.rl" - { debug( 3, LOC, "Unable to parse method.\n" ); } -#line 37 "parser.rl" - { valid = 0; } - break; - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 10: - case 11: - case 26: - case 27: - case 28: - case 29: - case 30: - case 31: - case 42: - case 43: - case 44: - case 45: - case 46: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: - case 56: - case 60: - case 61: - case 62: - case 63: - case 64: - case 65: - case 71: - case 72: - case 73: - case 74: - case 75: - case 76: -#line 64 "parser.rl" - { debug( 3, LOC, "Unable to parse the client IP address.\n" ); } -#line 37 "parser.rl" - { valid = 0; } - break; - case 1: -#line 46 "parser.rl" - { debug( 3, LOC, "Unable to parse scheme.\n" ); } -#line 50 "parser.rl" - { debug( 3, LOC, "Unable to parse hostname.\n" ); } -#line 37 "parser.rl" - { valid = 0; } - break; - case 3: -#line 46 "parser.rl" - { debug( 3, LOC, "Unable to parse scheme.\n" ); } -#line 50 "parser.rl" - { debug( 3, LOC, "Unable to parse hostname.\n" ); } -#line 64 "parser.rl" - { debug( 3, LOC, "Unable to parse the client IP address.\n" ); } -#line 37 "parser.rl" - { valid = 0; } - break; -#line 2043 "parser.c" - } - } - - _out: {} - } - -#line 190 "parser.rl" - - /* If we were given an invalid line, bail early */ - if ( valid == 0 ) { - free( p_request ), p_request = NULL; - debug( 3, LOC, "Invalid line (%d), skipped\n", v.timer.lines + 1 ); - debug( 4, LOC, "%s", line ); - return( NULL ); - } - - (void)populate_request( p_request ); - return( p_request ); -} - - -/* - * Initialize and return a pointer to a new request object. - * - */ -request * -init_request( void ) -{ - request *p_request = NULL; - if ( (p_request = malloc( sizeof(request) )) == NULL ) { - debug( 1, LOC, "Unable to allocate memory for request struct: %s\n", strerror(errno) ); - return( NULL ); - } - p_request->scheme = NULL; - p_request->host = NULL; - p_request->port = NULL; - p_request->path = NULL; - p_request->user = NULL; - p_request->method = NULL; - p_request->client_ip = NULL; - - p_request->tokens.scheme_start = NULL; - p_request->tokens.host_start = NULL; - p_request->tokens.port_start = NULL; - p_request->tokens.path_start = NULL; - p_request->tokens.meth_start = NULL; - p_request->tokens.c_ip_start = NULL; - - p_request->tokens.scheme_length = 0; - p_request->tokens.host_length = 0; - p_request->tokens.port_length = 0; - p_request->tokens.path_length = 0; - p_request->tokens.meth_length = 0; - p_request->tokens.c_ip_length = 0; - - return p_request; -} - - -/* - * Take the previously parsed token locations and copy them into the request struct. - * - */ -void -populate_request( struct request *p_request ) -{ - p_request->scheme = - copy_string_token( p_request->tokens.scheme_start, p_request->tokens.scheme_length ); - p_request->host = - copy_string_token( p_request->tokens.host_start, p_request->tokens.host_length ); - p_request->port = - copy_string_token( p_request->tokens.port_start, p_request->tokens.port_length ); - p_request->path = - copy_string_token( p_request->tokens.path_start, p_request->tokens.path_length ); - p_request->method = - copy_string_token( p_request->tokens.meth_start, p_request->tokens.meth_length ); - p_request->client_ip = - copy_ipv4_token( p_request->tokens.c_ip_start, p_request->tokens.c_ip_length ); - - return; -} - - -/* - * Release memory used by request struct. - * - */ -void -cleanup_request( struct request *p_request ) -{ - if ( p_request == NULL ) return; - - free( p_request->scheme ); - free( p_request->host ); - free( p_request->port ); - free( p_request->path ); - free( p_request->method ); - free( p_request->client_ip ); - - free( p_request ), p_request = NULL; - - return; -} - diff -r 9aa5114326e8 -r 191b3c25974a parser.rl --- a/parser.rl Mon Oct 17 09:12:00 2011 -0700 +++ b/parser.rl Sun Oct 23 22:59:59 2011 -0700 @@ -30,116 +30,8 @@ #include "volta.h" -%%{ - machine redirector; - - action success { valid = 1; } - action error { valid = 0; } - - action channel_id_found { - debug( 1, LOC, "Channel ID found in redirector input. Set 'url_rewrite_concurrency' to '0' in squid.\n" ); - fbreak; - } - - action scheme_start { p_request->tokens.scheme_start = fpc; } - action scheme_finish { p_request->tokens.scheme_length = fpc - ( *pe + p_request->tokens.scheme_start ); } - action scheme_error { debug( 3, LOC, "Unable to parse scheme.\n" ); } - - action host_start { p_request->tokens.host_start = fpc; } - action host_finish { p_request->tokens.host_length = fpc - ( *pe + p_request->tokens.host_start ); } - action host_error { debug( 3, LOC, "Unable to parse hostname.\n" ); } - - action port_start { p_request->tokens.port_start = fpc; } - action port_finish { p_request->tokens.port_length = fpc - ( *pe + p_request->tokens.port_start ); } - - action path_start { p_request->tokens.path_start = fpc; } - action path_finish { p_request->tokens.path_length = fpc - ( *pe + p_request->tokens.path_start ); } - - action meth_start { p_request->tokens.meth_start = fpc; } - action meth_finish { p_request->tokens.meth_length = fpc - ( *pe + p_request->tokens.meth_start ); } - action meth_error { debug( 3, LOC, "Unable to parse method.\n" ); } - - action c_ip_start { p_request->tokens.c_ip_start = fpc; } - action c_ip_finish { p_request->tokens.c_ip_length = fpc - ( *pe + p_request->tokens.c_ip_start ); } - action c_ip_error { debug( 3, LOC, "Unable to parse the client IP address.\n" ); } - - # - # Squid line: URL client_ip "/" fqdn user method [ kvpairs] - # - # URI Syntax (RFC 3986) misc notes: - # - # - Scheme isn't passed to redirectors on CONNECT method requests - # - # - Hostname segments aren't supposed to be individually greater than 63 chars, - # and the hostname in total shouldn't exceed 255. They also shouldn't be entirely - # made up of digits, or contain underscores. In practice, these rules appear to - # be violated constantly by some pretty big sites. I'm looking at you, facebook. - # (( alnum ) | ( alnum . [a-zA-Z0-9\-]{0,63} . alnum )) & !( digit+ ); - # - # - ipv6 has some utterly insane rules (RFC 5952) in the name of "shortcuts", which - # only seem like shortcuts to someone writing IP addresses by hand. Anyone that - # has to parse (or even just read) them has a bunch of seemingly arbitrary work - # dumped in their lap. Heck, it's impossible to even search for an ipv6 address - # that contains zeros in a text editor, because you have no idea what how it might - # be represented. Rad! - # - # The parser just trusts any ipv6 squid hands us as being valid, without - # any real parsing/validation, other than it consists of hex digits and colons. - # - # - This parser originally validated path/query/fragment as well, but there were - # enough inconsistencies with unescaped chars and other real-life RFC deviations - # that I opted to just accept what we get from squid. - # - # - Redirectors aren't handed any userinfo (http://mahlon:password@example.com), - # so no need to check for that. - # - - host_component = alnum | ( alnum [a-zA-Z0-9\-_]* alnum ); - pchar = ( alnum | [\-._~!$%&'()*+,;=] ); - path_segment = '/' ( any - space )*; - - hostname = host_component ( '.' host_component )* '.'?; - ipv4 = digit{1,3} '.' digit{1,3} '.' digit{1,3} '.' digit{1,3}; - ipv6 = ( xdigit | ':' )+; - - channel_id = ( digit+ space ) %channel_id_found; - scheme = ( alpha{3,5} '://' ) >scheme_start %scheme_finish @!scheme_error; - host = ( hostname | ipv4 ) >host_start %host_finish @!host_error; - port = ( ':' digit{1,5} ) >port_start %port_finish; - path = path_segment* >path_start %path_finish; - client_ip = ipv4 >c_ip_start %c_ip_finish @!c_ip_error; - method = upper+ >meth_start %meth_finish @!meth_error; - - Line = ( - start: ( - channel_id? -> Url - ), - - Url: ( - scheme? host port? path? space -> Client - ), - - Client: ( - client_ip '/' ( hostname | '-' ) space -> User - ), - - User: ( - pchar+ space -> Method - ), - - Method: ( - method -> KVPairs - ), - - KVPairs: ( - ( space any+ )? -> final - ) - ) %success @!error; - - - main := Line '\n'; -}%% -%% write data; +#define MARK_S( LBL ) p_request->tokens.LBL ## _start = p; +#define MARK_E( LBL ) p_request->tokens.LBL ## _length = p - ( *pe + p_request->tokens.LBL ## _start ); /* * Tokenize an incoming line from squid, returning a parsed and populated @@ -175,21 +67,104 @@ parse( char *line ) { /* machine required vars */ - int cs = 0; + unsigned short int cs = 1; char *p = line; char *pe = p + strlen(p); char *eof = NULL; /* the client request pointer */ - unsigned char valid = 0; request *p_request = init_request(); - /* enter state machine */ - %% write init; +%%{ + machine input_parser; + + action channel_id_found { + debug( 1, LOC, "Channel ID found in redirector input. Set 'url_rewrite_concurrency' to '0' in squid.\n" ); + fbreak; + } + + action scheme_start { MARK_S(scheme) } + action scheme_finish { MARK_E(scheme) } + action host_start { MARK_S(host) } + action host_finish { MARK_E(host) } + action port_start { MARK_S(port) } + action port_finish { MARK_E(port) } + action path_start { MARK_S(path) } + action path_finish { MARK_E(path) } + action meth_start { MARK_S(meth) } + action meth_finish { MARK_E(meth) } + action c_ip_start { MARK_S(c_ip) } + action c_ip_finish { MARK_E(c_ip) } + + action host_error { debug( 3, LOC, "Unable to parse hostname.\n" ); } + action scheme_error { debug( 3, LOC, "Unable to parse scheme.\n" ); } + action meth_error { debug( 3, LOC, "Unable to parse method.\n" ); } + action c_ip_error { debug( 3, LOC, "Unable to parse the client IP address.\n" ); } + + # + # Squid line: URL client_ip "/" fqdn user method [ kvpairs] + # + # URI Syntax (RFC 3986) misc notes: + # + # - Scheme isn't passed to redirectors on CONNECT method requests + # + # - Hostname segments aren't supposed to be individually greater than 63 chars, + # and the hostname in total shouldn't exceed 255. They also shouldn't be entirely + # made up of digits, or contain underscores. In practice, these rules appear to + # be violated constantly by some pretty big sites. + # (( alnum ) | ( alnum . [a-zA-Z0-9\-]{0,63} . alnum )) & !( digit+ ); + # + # - ipv6 has some utterly insane rules (RFC 5952) in the name of "shortcuts", which + # only seem like shortcuts to someone writing IP addresses by hand. Anyone that + # has to parse (or even just read) them has a bunch of seemingly arbitrary work + # dumped in their lap. Heck, it's impossible to even search for an ipv6 address + # that contains zeros in a text editor, because you have no idea what how it might + # be represented. Rad! + # + # The parser just trusts any ipv6 squid hands us as being valid, without + # any real parsing/validation, other than it consists of hex digits and colons. + # + # - This parser originally validated path/query/fragment as well, but there were + # enough inconsistencies with unescaped chars and other real-life RFC deviations + # that I opted to just accept what we get from squid. + # + # - Redirectors aren't handed any userinfo (http://mahlon:password@example.com), + # so no need to check for that. + # + + host_component = alnum | ( alnum [a-zA-Z0-9\-_]* alnum ); + pchar = ( alnum | [\-._~!$%&'()*+,;=] ); + path_segment = '/' ( any - space )*; + + hostname = host_component ( '.' host_component )* '.'?; + ipv4 = digit{1,3} '.' digit{1,3} '.' digit{1,3} '.' digit{1,3}; + ipv6 = ( xdigit | ':' )+; + + channel_id = ( digit+ space ) %channel_id_found; + scheme = ( alpha{3,5} '://' ) >scheme_start %scheme_finish @!scheme_error; + host = ( hostname | ipv4 ) >host_start %host_finish @!host_error; + port = ( ':' digit{1,5} ) >port_start %port_finish; + path = path_segment* >path_start %path_finish; + client_ip = ipv4 >c_ip_start %c_ip_finish @!c_ip_error; + method = upper+ >meth_start %meth_finish @!meth_error; + + SquidLine = ( + start: channel_id? -> Url, + Url: scheme? host port? path? space -> Client, + Client: client_ip '/' ( hostname | '-' ) space -> User, + User: pchar+ space -> Method, + Method: method -> KVPairs, + KVPairs: ( space any+ )? -> final + ); + + main := SquidLine '\n'; +}%% + + /* state machine */ %% write exec; /* If we were given an invalid line, bail early */ - if ( valid == 0 ) { + if ( cs < %%{ write first_final; }%% ) { free( p_request ), p_request = NULL; debug( 3, LOC, "Invalid line (%d), skipped\n", v.timer.lines + 1 ); debug( 4, LOC, "%s", line ); @@ -210,11 +185,13 @@ { request *p_request = NULL; if ( (p_request = malloc( sizeof(request) )) == NULL ) { - debug( 1, LOC, "Unable to allocate memory for request struct: %s\n", strerror(errno) ); + debug( 5, LOC, "Unable to allocate memory for request struct: %s\n", strerror(errno) ); return( NULL ); } + p_request->scheme = NULL; p_request->host = NULL; + p_request->tld = NULL; p_request->port = NULL; p_request->path = NULL; p_request->user = NULL; @@ -222,48 +199,95 @@ p_request->client_ip = NULL; p_request->tokens.scheme_start = NULL; + p_request->tokens.scheme_length = 0; p_request->tokens.host_start = NULL; + p_request->tokens.host_length = 0; p_request->tokens.port_start = NULL; + p_request->tokens.port_length = 0; p_request->tokens.path_start = NULL; + p_request->tokens.path_length = 0; p_request->tokens.meth_start = NULL; + p_request->tokens.meth_length = 0; p_request->tokens.c_ip_start = NULL; - p_request->tokens.scheme_length = 0; - p_request->tokens.host_length = 0; - p_request->tokens.port_length = 0; - p_request->tokens.path_length = 0; - p_request->tokens.meth_length = 0; p_request->tokens.c_ip_length = 0; return p_request; } +#define COPY_STR( LBL ) copy_string_token( p_request->tokens.LBL ## _start, p_request->tokens.LBL ## _length ) +#define COPY_IP4( LBL ) copy_ipv4_token( p_request->tokens.LBL ## _start, p_request->tokens.LBL ## _length ) + /* * Take the previously parsed token locations and copy them into the request struct. * */ void -populate_request( struct request *p_request ) +populate_request( request *p_request ) { - p_request->scheme = - copy_string_token( p_request->tokens.scheme_start, p_request->tokens.scheme_length ); - p_request->host = - copy_string_token( p_request->tokens.host_start, p_request->tokens.host_length ); - p_request->port = - copy_string_token( p_request->tokens.port_start, p_request->tokens.port_length ); - p_request->path = - copy_string_token( p_request->tokens.path_start, p_request->tokens.path_length ); - p_request->method = - copy_string_token( p_request->tokens.meth_start, p_request->tokens.meth_length ); - p_request->client_ip = - copy_ipv4_token( p_request->tokens.c_ip_start, p_request->tokens.c_ip_length ); + p_request->scheme = COPY_STR( scheme ); + p_request->host = COPY_STR( host ); + p_request->port = COPY_STR( port ); + p_request->path = COPY_STR( path ); + p_request->method = COPY_STR( meth ); + p_request->client_ip = COPY_IP4( c_ip ); + + parse_tld( p_request ); return; } /* - * Release memory used by request struct. + * Pull the top level domain out of the requested hostname. + * + */ +void +parse_tld( request *p_request ) +{ + unsigned short int cs = 5, mark = 0; + char *p = p_request->host; + char *pe = p + p_request->tokens.host_length; + char *ts = 0, *te = 0, *eof = NULL; + +%%{ + machine tld_parser; + + host_component = alnum | ( alnum [a-zA-Z0-9\-_]* alnum ); + tld = ( host_component '.' host_component ); + + main := |* + tld => { mark = ( p_request->tokens.host_length - (int)strlen(te) ); }; + *|; +}%% + + /* It's far easier (and faster) to scan from left to right rather than + backtrack, so start by reversing the requested host string. */ + reverse_str( p_request->host ); + + /* scanner */ + %% write exec; + + /* If there was a mark, then allocate memory and copy. */ + if ( mark != 0 ) { + if ( (p_request->tld = calloc( mark + 1, sizeof(char) )) == NULL ) { + debug( 5, LOC, "Unable to allocate memory for tld token: %s\n", strerror(errno) ); + reverse_str( p_request->host ); + return; + } + + memcpy( p_request->tld, p_request->host, mark ); + reverse_str( p_request->tld ); + } + + /* restore the hostname. */ + reverse_str( p_request->host ); + return; +} + + +/* + * Release memory used by the request struct. * */ void @@ -273,6 +297,7 @@ free( p_request->scheme ); free( p_request->host ); + free( p_request->tld ); free( p_request->port ); free( p_request->path ); free( p_request->method ); diff -r 9aa5114326e8 -r 191b3c25974a sql/1.sql --- a/sql/1.sql Mon Oct 17 09:12:00 2011 -0700 +++ b/sql/1.sql Sun Oct 23 22:59:59 2011 -0700 @@ -1,9 +1,15 @@ --- vim: set noet nosta sw=4 ts=4 ft=sql: - BEGIN; -DROP TABLE IF EXISTS rules; -CREATE TABLE rules ( +DROP TABLE IF EXISTS requests; +CREATE TABLE requests ( + hi INT, + rewrite_rule INTEGER REFERENCES rewrite_rules( id ) ON DELETE SET NULL ON UPDATE CASCADE DEFERRABLE INITIALLY DEFERRED +); + +DROP TABLE IF EXISTS rewrite_rules; +CREATE TABLE rewrite_rules ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, redir TINYINT NOT NULL DEFAULT 0 CHECK( redir IN (0,1,2) ) ); diff -r 9aa5114326e8 -r 191b3c25974a util.c --- a/util.c Mon Oct 17 09:12:00 2011 -0700 +++ b/util.c Sun Oct 23 22:59:59 2011 -0700 @@ -39,10 +39,10 @@ usage( char *prg ) { printf( "%s [-vh] [-f ] [-d ]\n", prg ); + printf( " -d Show debug information on stderr\n" ); + printf( " -f Specify the database file to use (default is './volta.db')\n"); + printf( " -h Usage (you're lookin' at it)\n" ); printf( " -v Display version\n" ); - printf( " -d Show debug information on stderr\n" ); - printf( " -h Usage (you're lookin' at it)\n" ); - printf( " -f Specify the database to use (default is 'volta.db' in the cwd.)\n"); printf( "\n" ); return; } @@ -80,6 +80,41 @@ /* + * Output to stdout for squid, unless the debug level is at or above 4. + */ +void +out( const char *str ) +{ + if ( v.debugmode >= 4 ) return; + fprintf( stdout, "%s", str ); + return; +} + + +/* + * Given a string, reverse it in place. + */ +void +reverse_str( char *str ) +{ + int i = 0; + int tmp = 0; + int j = strlen( str ) - 1; + + while ( i < j ) { + tmp = str[i]; + str[i] = str[j]; + str[j] = tmp; + + i++; + j--; + } + + return; +} + + +/* * Append 'buf' to the end of 'line', a la strcat, except dynamically * grow memory for the target string. * @@ -103,10 +138,10 @@ new_len = offset + LINE_BUFSIZE; } - debug( 4, LOC, "Extending line %d to %d bytes at offset %d\n", v.timer.lines+1, new_len, offset ); + debug( 5, LOC, "Extending line %d to %d bytes at offset %d\n", v.timer.lines+1, new_len, offset ); if ( new_len > LINE_MAX || (line_realloc = realloc(line, sizeof(char) * new_len)) == NULL ) { - debug( 1, LOC, "Ignoring line, error while allocating memory: %s\n", - (line_realloc == NULL ? strerror(errno) : "Line too large") ); + debug( 5, LOC, "Ignoring line %d, error while allocating memory: %s\n", + v.timer.lines+1, (line_realloc == NULL ? strerror(errno) : "Line too large") ); if ( line != NULL ) free( line ), line = NULL; printf( "\n" ); } @@ -138,7 +173,7 @@ } if ( (contents = malloc( sb.st_size + 1 )) == NULL ) { - debug( 1, LOC, "Unable to allocate memory for file '%s': %s\n", + debug( 5, LOC, "Unable to allocate memory for file '%s': %s\n", file, strerror(errno) ); return( NULL ); } @@ -150,7 +185,7 @@ } if ( fread( contents, sizeof(char), sb.st_size, fh ) != (unsigned int)sb.st_size ) { - debug( 1, LOC, "Short read for file '%s'?: %s\n", file ); + debug( 5, LOC, "Short read for file '%s'?: %s\n", file ); fclose( fh ); return( NULL ); } @@ -172,7 +207,7 @@ if ( string == NULL || length == 0 ) return ( NULL ); if ( (alloc_ptr = calloc( length + 1, sizeof(char) )) == NULL ) { - debug( 1, LOC, "Unable to allocate memory for token: %s\n", strerror(errno) ); + debug( 5, LOC, "Unable to allocate memory for token: %s\n", strerror(errno) ); return( NULL ); } @@ -199,7 +234,7 @@ c_ip[ length ] = '\0'; if ( (alloc_ptr = calloc( length, sizeof(struct in_addr) )) == NULL ) { - debug( 1, LOC, "Unable to allocate memory for ip '%s': %s\n", + debug( 5, LOC, "Unable to allocate memory for ip '%s': %s\n", c_ip, strerror(errno) ); } diff -r 9aa5114326e8 -r 191b3c25974a volta.h --- a/volta.h Mon Oct 17 09:12:00 2011 -0700 +++ b/volta.h Sun Oct 23 22:59:59 2011 -0700 @@ -91,6 +91,7 @@ typedef struct request { char *scheme; char *host; + char *tld; char *path; char *port; struct in_addr *client_ip; @@ -122,6 +123,8 @@ void usage( char * ); void debug( int, char *, int, const char *, ... ); +void out( const char * ); +void reverse_str( char * ); void report_speed( void ); char *slurp_file( char * ); char *extend_line( char *, const char * ); @@ -133,6 +136,7 @@ request *parse( char * ); request *init_request( void ); void populate_request( request * ); +void parse_tld( request * ); void cleanup_request( request * ); #endif