1*756eaf79SMilton MillerBEGIN { 2*756eaf79SMilton Miller if (!resultfile) 3*756eaf79SMilton Miller resultfile="testfile" 4*756eaf79SMilton Miller if (!script) 5*756eaf79SMilton Miller script = "http-redirect.awk" 6*756eaf79SMilton Miller invoke="awk -f " script 7*756eaf79SMilton Miller cmd = invoke " > " resultfile 8*756eaf79SMilton Miller if (tracefile) 9*756eaf79SMilton Miller invoke = invoke " -v tracefile=" tracefile 10*756eaf79SMilton Miller} 11*756eaf79SMilton Miller 12*756eaf79SMilton Millerfunction reportfail(resultfile, expect, request, headers) 13*756eaf79SMilton Miller{ 14*756eaf79SMilton Miller print("Testcase FAIL") 15*756eaf79SMilton Miller print("Expected to find :" expect) 16*756eaf79SMilton Miller print("actual:") 17*756eaf79SMilton Miller system("cat " resultfile) 18*756eaf79SMilton Miller print("expect:" expect) 19*756eaf79SMilton Miller print("input:") 20*756eaf79SMilton Miller print("reuest: " request) 21*756eaf79SMilton Miller for (h in headers) 22*756eaf79SMilton Miller print("headers:" headers[h]) 23*756eaf79SMilton Miller print("") 24*756eaf79SMilton Miller print("FAIL") 25*756eaf79SMilton Miller exit(1) 26*756eaf79SMilton Miller} 27*756eaf79SMilton Miller 28*756eaf79SMilton Millerfunction test(code, expect, request, headers) 29*756eaf79SMilton Miller{ 30*756eaf79SMilton Miller runtest(cmd, request, headers) 31*756eaf79SMilton Miller result = check(resultfile, code, expect, request, headers) 32*756eaf79SMilton Miller results[result] = results[result] + 1 33*756eaf79SMilton Miller if (result == "FAIL") 34*756eaf79SMilton Miller reportfail(resultfile, expect, request, headers) 35*756eaf79SMilton Miller} 36*756eaf79SMilton Miller 37*756eaf79SMilton Millerfunction check(resultfile, code, expect, request, headers) 38*756eaf79SMilton Miller{ 39*756eaf79SMilton Miller line = "" 40*756eaf79SMilton Miller getline result < resultfile 41*756eaf79SMilton Miller 42*756eaf79SMilton Miller while ((getline line < resultfile) > 0) 43*756eaf79SMilton Miller if (line ~ /^Location/) 44*756eaf79SMilton Miller found = line 45*756eaf79SMilton Miller 46*756eaf79SMilton Miller close(resultfile) 47*756eaf79SMilton Miller 48*756eaf79SMilton Miller if (code in locations) 49*756eaf79SMilton Miller if ((line == expect) && (location ~ " " code " ")) 50*756eaf79SMilton Miller rc = "PASS" 51*756eaf79SMilton Miller else 52*756eaf79SMilton Miller rc = fail 53*756eaf79SMilton Miller return rc 54*756eaf79SMilton Miller} 55*756eaf79SMilton Miller 56*756eaf79SMilton Millerfunction runtest(cmd, request, headers, h, OORS) 57*756eaf79SMilton Miller{ 58*756eaf79SMilton Miller if (!cmd) 59*756eaf79SMilton Miller return 60*756eaf79SMilton Miller OORS = ORS 61*756eaf79SMilton Miller ORS = "\r\n" 62*756eaf79SMilton Miller 63*756eaf79SMilton Miller print(request) | cmd 64*756eaf79SMilton Miller for (h in headers) 65*756eaf79SMilton Miller print(headers[h]) | cmd 66*756eaf79SMilton Miller print("") | cmd 67*756eaf79SMilton Miller close(cmd) 68*756eaf79SMilton Miller 69*756eaf79SMilton Miller ORS = OORS 70*756eaf79SMilton Miller} 71*756eaf79SMilton Miller 72*756eaf79SMilton Millerfunction add(array, value) { 73*756eaf79SMilton Miller counter = counter + 1 74*756eaf79SMilton Miller array[counter] = value 75*756eaf79SMilton Miller} 76*756eaf79SMilton Miller 77*756eaf79SMilton Millerfunction mkrequest(method, path, version) 78*756eaf79SMilton Miller{ 79*756eaf79SMilton Miller return method " " path " " version 80*756eaf79SMilton Miller} 81*756eaf79SMilton Miller 82*756eaf79SMilton MillerBEGIN { 83*756eaf79SMilton Miller failingtests() 84*756eaf79SMilton Miller passingtests() 85*756eaf79SMilton Miller exit(0) 86*756eaf79SMilton Miller} 87*756eaf79SMilton Miller 88*756eaf79SMilton Millerfunction failingtests(headers) { 89*756eaf79SMilton Miller host1 = "somewhere.example.com" 90*756eaf79SMilton Miller 91*756eaf79SMilton Miller headers[0] = "Host: " host1 ports[port] 92*756eaf79SMilton Miller version="HTTP/1.1" 93*756eaf79SMilton Miller path="/" 94*756eaf79SMilton Miller method="GET" 95*756eaf79SMilton Miller 96*756eaf79SMilton Miller othermethods(path, version, headers) 97*756eaf79SMilton Miller test(505, "", mkrequest(method, path, "HTTP/1"), headers) 98*756eaf79SMilton Miller test(505, "", mkrequest(method, path, "HTTP/2.0"), headers) 99*756eaf79SMilton Miller test(505, "", mkrequest(method, path, "http/1.1"), headers) 100*756eaf79SMilton Miller junk[0] = "Host: abc_def.example.com" 101*756eaf79SMilton Miller test(400, "", mkrequest(method, path, "HTTP/1.1"), junk) 102*756eaf79SMilton Miller test(400, "", mkrequest(method, path, "HTTP/1.1"), headers) 103*756eaf79SMilton Miller test(404, "", mkrequest(method, "/abc", "HTTP/1.1"), junk) 104*756eaf79SMilton Miller} 105*756eaf79SMilton Miller 106*756eaf79SMilton Millerfunction othermethods(path, version, headers, methods, m) 107*756eaf79SMilton Miller{ 108*756eaf79SMilton Miller add(methods, "PUT") 109*756eaf79SMilton Miller add(methods, "POST") 110*756eaf79SMilton Miller add(methods, "TRACE") 111*756eaf79SMilton Miller add(methods, "CONNECT") 112*756eaf79SMilton Miller add(methods, "get") 113*756eaf79SMilton Miller add(methods, "head") 114*756eaf79SMilton Miller 115*756eaf79SMilton Miller for (m in methods) 116*756eaf79SMilton Miller test(501, "", mkrequest(methods[m], path, version), headers) 117*756eaf79SMilton Miller} 118*756eaf79SMilton Miller 119*756eaf79SMilton Millerfunction passingtests(headers) { 120*756eaf79SMilton Miller method="GET" 121*756eaf79SMilton Miller path="/" 122*756eaf79SMilton Miller version="HTTP/1.1" 123*756eaf79SMilton Miller 124*756eaf79SMilton Miller host1 = "somewhere.example.com" 125*756eaf79SMilton Miller host2 = "elsewhere.example.com" 126*756eaf79SMilton Miller mkports(ports) 127*756eaf79SMilton Miller 128*756eaf79SMilton Miller expect="Location: https://" host1 "/\r" 129*756eaf79SMilton Miller 130*756eaf79SMilton Miller request = mkrequest(method, path, version) 131*756eaf79SMilton Miller for (port in ports) { 132*756eaf79SMilton Miller headers[0] = "Host: " host1 ports[port] 133*756eaf79SMilton Miller test(308, expect, request, headers) 134*756eaf79SMilton Miller } 135*756eaf79SMilton Miller test(308, expect, mkrequest("HEAD", path, version), headers) 136*756eaf79SMilton Miller headers[0] = "Host: " host2 137*756eaf79SMilton Miller testabsuris(expect, headers, host1, ports) 138*756eaf79SMilton Miller} 139*756eaf79SMilton Miller 140*756eaf79SMilton Millerfunction testabsuris(expect, headers, host, ports) 141*756eaf79SMilton Miller{ 142*756eaf79SMilton Miller mkabsuris(uris, host, ports) 143*756eaf79SMilton Miller 144*756eaf79SMilton Miller # test with and without path 145*756eaf79SMilton Miller for (uri in uris) { 146*756eaf79SMilton Miller u = uris[uri] 147*756eaf79SMilton Miller test(308, expect, mkrequest(method, u, version), headers) 148*756eaf79SMilton Miller test(308, expect, mkrequest(method, u "/", version), headers) 149*756eaf79SMilton Miller } 150*756eaf79SMilton Miller} 151*756eaf79SMilton Miller 152*756eaf79SMilton Millerfunction mkports(ports) { 153*756eaf79SMilton Miller add(ports, "") 154*756eaf79SMilton Miller add(ports, ":") 155*756eaf79SMilton Miller add(ports, ":8080") 156*756eaf79SMilton Miller} 157*756eaf79SMilton Miller 158*756eaf79SMilton Millerfunction mkabsuris(uris, host, ports, schemes, scheme, port) 159*756eaf79SMilton Miller{ 160*756eaf79SMilton Miller mkschemes(schemes) 161*756eaf79SMilton Miller 162*756eaf79SMilton Miller for (scheme in schemes) 163*756eaf79SMilton Miller for (port in ports) 164*756eaf79SMilton Miller add(uris, schemes[scheme] "://" host ports[port] ) 165*756eaf79SMilton Miller} 166*756eaf79SMilton Miller 167*756eaf79SMilton Millerfunction mkschemes(schemes, h, t1, t2, p, hs, ts, ps) { 168*756eaf79SMilton Miller mkletters(hs, 4, 8) 169*756eaf79SMilton Miller mkletters(ts, 5, 4) 170*756eaf79SMilton Miller mkletters(ps, 5, 0) 171*756eaf79SMilton Miller 172*756eaf79SMilton Miller for (h in hs) 173*756eaf79SMilton Miller for (t1 in ts) 174*756eaf79SMilton Miller for (t2 in ts) 175*756eaf79SMilton Miller for (p in ps) 176*756eaf79SMilton Miller add(schemes, hs[h] ts[t1] ts[t2] ps[p]) 177*756eaf79SMilton Miller} 178*756eaf79SMilton Miller 179*756eaf79SMilton Millerfunction mkletters(ns, h1, h2) 180*756eaf79SMilton Miller{ 181*756eaf79SMilton Miller add(ns, "%" h1 h2) 182*756eaf79SMilton Miller add(ns, "%" (h1 + 2) h2) 183*756eaf79SMilton Miller add(ns, sprintf("%c", h1 * 16 + h2)) 184*756eaf79SMilton Miller add(ns, sprintf("%c", (h1 + 2) * 16 + h2)) 185*756eaf79SMilton Miller 186*756eaf79SMilton Miller} 187*756eaf79SMilton Miller 188