github.com/krum110487/go-htaccess@v0.0.0-20240316004156-60641c8e7598/parser/parser_test.go (about) 1 package parser 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "log" 7 "os" 8 "path" 9 "runtime" 10 "testing" 11 ) 12 13 func init() { 14 _, filename, _, _ := runtime.Caller(0) 15 dir := path.Join(path.Dir(filename), "..") 16 err := os.Chdir(dir) 17 if err != nil { 18 panic(err) 19 } 20 } 21 22 func testMatch(t *testing.T, tests [][]string) { 23 failed := false 24 for i, test := range tests { 25 name := fmt.Sprintf("Test %d", i) 26 src := test[0] 27 res := fmt.Sprintf(`%s`, test[1]) 28 29 hta, err := htaccessParser.ParseString(name, src) 30 if err != nil { 31 panic(err) 32 } 33 34 data, _ := json.Marshal(hta) 35 jsonStr := string(data) 36 if jsonStr != res { 37 failed = true 38 t.Logf("Test %d failed to match:\n\tSource: %s\n\tParsedStr: %s\n\tExpected: %s", 39 i+1, src, jsonStr, res) 40 } 41 } 42 43 if failed { 44 t.FailNow() 45 } 46 } 47 48 func TestParserRewriteRule(t *testing.T) { 49 tests := [][]string{ 50 {`RewriteRule "^search/(.*)$" "/search.php?term=$1" "[B= ?]"`, 51 `{"directives":[{"IfGroup":null,"Tag":null,"Name":"RewriteRule","Params":[{"rawString":"^search/(.*)$"},{"rawString":"/search.php?term=$1","variableName":"/search.php?term","assignValue":"$1"},{"rawString":"[B= ?]","flags":{"flagMap":{"B":{"valueStr":" ?"}}}}],"Results":false}]}`}, 52 {`RewriteRule "^search/(.*)$" "/search.php?term=$1" [B=?]`, 53 `{"directives":[{"IfGroup":null,"Tag":null,"Name":"RewriteRule","Params":[{"rawString":"^search/(.*)$"},{"rawString":"/search.php?term=$1","variableName":"/search.php?term","assignValue":"$1"},{"rawString":"[B=?]","flags":{"flagMap":{"B":{"valueStr":"?"}}}}],"Results":false}]}`}, 54 } 55 56 testMatch(t, tests) 57 } 58 59 func TestParserRewriteCond(t *testing.T) { 60 tests := [][]string{ 61 {`RewriteCond "%{HTTP_HOST}" "(.*)" 62 RewriteRule "^/(.*)" "/sites/%1/$1"`, 63 `{"directives":[{"IfGroup":null,"Tag":null,"Name":"RewriteCond","Params":[{"rawString":"%{HTTP_HOST}","variableName":"HTTP_HOST"},{"rawString":"(.*)"}],"Results":false},{"IfGroup":null,"Tag":null,"Name":"RewriteRule","Params":[{"rawString":"^/(.*)"},{"rawString":"/sites/%1/$1"}],"Results":false}]}`}, 64 {`RewriteCond "%{QUERY_STRING}" "hack" 65 RewriteCond "%{HTTP_COOKIE}" !go 66 RewriteRule "." "-" [F]`, 67 `{"directives":[{"IfGroup":null,"Tag":null,"Name":"RewriteCond","Params":[{"rawString":"%{QUERY_STRING}","variableName":"QUERY_STRING"},{"rawString":"hack"}],"Results":false},{"IfGroup":null,"Tag":null,"Name":"RewriteCond","Params":[{"rawString":"%{HTTP_COOKIE}","variableName":"HTTP_COOKIE"},{"rawString":"!go","notOp":true,"notOpString":"go"}],"Results":false},{"IfGroup":null,"Tag":null,"Name":"RewriteRule","Params":[{"rawString":"."},{"rawString":"-"},{"rawString":"[F]","flags":{"flagMap":{"F":{"valueBool":true}}}}],"Results":false}]}`}, 68 } 69 70 testMatch(t, tests) 71 } 72 73 func TestParserSetEnvIf(t *testing.T) { 74 tests := [][]string{ 75 {`SetEnvIf user-agent "WebBandit" stayout=1`, 76 `{"directives":[{"IfGroup":null,"Tag":null,"Name":"SetEnvIf","Params":[{"rawString":"user-agent"},{"rawString":"WebBandit"},{"rawString":"stayout=1","variableName":"stayout","assignValue":"1"}],"Results":false}]}`}, 77 } 78 79 testMatch(t, tests) 80 } 81 82 func TestParserDirectoryIndex(t *testing.T) { 83 tests := [][]string{ 84 {`RewriteEngine On 85 DirectoryIndex index.php index.html`, 86 `{"directives":[{"IfGroup":null,"Tag":null,"Name":"RewriteEngine","Params":[{"rawString":"On"}],"Results":false},{"IfGroup":null,"Tag":null,"Name":"DirectoryIndex","Params":[{"rawString":"index.php"},{"rawString":"index.html"}],"Results":false}]}`}, 87 {`Require all granted 88 Require not env stayout`, 89 `{"directives":[{"IfGroup":null,"Tag":null,"Name":"Require","Params":[{"rawString":"all"},{"rawString":"granted"}],"Results":false},{"IfGroup":null,"Tag":null,"Name":"Require","Params":[{"rawString":"not"},{"rawString":"env"},{"rawString":"stayout"}],"Results":false}]}`}, 90 } 91 92 testMatch(t, tests) 93 } 94 95 func TestParserIfThenElse(t *testing.T) { 96 tests := [][]string{ 97 {`<If "-R '10.1.0.0/16'"> 98 RewriteEngine On 99 </If> 100 <ElseIf "-R '10.2.0.0/8'"> 101 # Do Nothing 102 </ElseIf> 103 <ElseIf "-R '10.3.0.0/8'"> 104 RewriteEngine Off 105 </ElseIf> 106 <Else> 107 RewriteEngine On 108 </Else>`, 109 `{"directives":[{"IfGroup":{"Name":"If","Expression":{"operator":"-R","rightArgument":"'10.1.0.0/16'"},"IfGroup":null,"Dirs":[{"IfGroup":null,"Tag":null,"Name":"RewriteEngine","Params":[{"rawString":"On"}],"Results":false}],"Tags":null,"TagClose":"If","ElseIf":[{"Name":"ElseIf","Expression":{"operator":"-R","rightArgument":"'10.2.0.0/8'"},"IfGroup":null,"Dirs":null,"Tags":null,"TagClose":"ElseIf"},{"Name":"ElseIf","Expression":{"operator":"-R","rightArgument":"'10.3.0.0/8'"},"IfGroup":null,"Dirs":[{"IfGroup":null,"Tag":null,"Name":"RewriteEngine","Params":[{"rawString":"Off"}],"Results":false}],"Tags":null,"TagClose":"ElseIf"}],"Else":{"Name":"Else","IfGroup":null,"Dirs":[{"IfGroup":null,"Tag":null,"Name":"RewriteEngine","Params":[{"rawString":"On"}],"Results":false}],"Tags":null,"TagClose":"Else"}},"Tag":null,"Name":"","Params":null,"Results":false}]}`}, 110 } 111 112 testMatch(t, tests) 113 } 114 115 func TestParserNestedIfThenElse(t *testing.T) { 116 tests := [][]string{ 117 {`<If "-R '10.1.0.0/16'"> 118 <If "-R '10.1.0.0/16'"> 119 RewriteEngine On 120 </If> 121 <Else> 122 RewriteEngine Off 123 </Else> 124 </If> 125 <ElseIf "-R '10.2.0.0/8'"> 126 <If "-R '10.1.0.0/16'"> 127 RewriteEngine On 128 </If> 129 <Else> 130 RewriteEngine Off 131 </Else> 132 </ElseIf> 133 <Else> 134 <If "-R '10.1.0.0/16'"> 135 RewriteEngine On 136 </If> 137 <Else> 138 RewriteEngine Off 139 </Else> 140 </Else>`, 141 `{"directives":[{"IfGroup":{"Name":"If","Expression":{"operator":"-R","rightArgument":"'10.1.0.0/16'"},"IfGroup":{"Name":"If","Expression":{"operator":"-R","rightArgument":"'10.1.0.0/16'"},"IfGroup":null,"Dirs":[{"IfGroup":null,"Tag":null,"Name":"RewriteEngine","Params":[{"rawString":"On"}],"Results":false}],"Tags":null,"TagClose":"If","ElseIf":null,"Else":{"Name":"Else","IfGroup":null,"Dirs":[{"IfGroup":null,"Tag":null,"Name":"RewriteEngine","Params":[{"rawString":"Off"}],"Results":false}],"Tags":null,"TagClose":"Else"}},"Dirs":null,"Tags":null,"TagClose":"If","ElseIf":[{"Name":"ElseIf","Expression":{"operator":"-R","rightArgument":"'10.2.0.0/8'"},"IfGroup":{"Name":"If","Expression":{"operator":"-R","rightArgument":"'10.1.0.0/16'"},"IfGroup":null,"Dirs":[{"IfGroup":null,"Tag":null,"Name":"RewriteEngine","Params":[{"rawString":"On"}],"Results":false}],"Tags":null,"TagClose":"If","ElseIf":null,"Else":{"Name":"Else","IfGroup":null,"Dirs":[{"IfGroup":null,"Tag":null,"Name":"RewriteEngine","Params":[{"rawString":"Off"}],"Results":false}],"Tags":null,"TagClose":"Else"}},"Dirs":null,"Tags":null,"TagClose":"ElseIf"}],"Else":{"Name":"Else","IfGroup":{"Name":"If","Expression":{"operator":"-R","rightArgument":"'10.1.0.0/16'"},"IfGroup":null,"Dirs":[{"IfGroup":null,"Tag":null,"Name":"RewriteEngine","Params":[{"rawString":"On"}],"Results":false}],"Tags":null,"TagClose":"If","ElseIf":null,"Else":{"Name":"Else","IfGroup":null,"Dirs":[{"IfGroup":null,"Tag":null,"Name":"RewriteEngine","Params":[{"rawString":"Off"}],"Results":false}],"Tags":null,"TagClose":"Else"}},"Dirs":null,"Tags":null,"TagClose":"Else"}},"Tag":null,"Name":"","Params":null,"Results":false}]}`}, 142 } 143 144 testMatch(t, tests) 145 } 146 147 func TestParserInvalidDirective(t *testing.T) { 148 149 } 150 151 func TestParserFiles(t *testing.T) { 152 _, filename, _, _ := runtime.Caller(0) 153 dir := path.Join(path.Dir(filename), "../tests/data/htaccessFiles") 154 155 files, err := os.ReadDir(dir) 156 if err != nil { 157 log.Fatal(err) 158 } 159 160 for _, f := range files { 161 path := dir + "/" + f.Name() 162 _, err := os.Open(path) 163 if err != nil { 164 log.Fatal(err) 165 } 166 167 b, _ := os.ReadFile(path) 168 _, err = htaccessParser.ParseBytes(f.Name(), b) 169 if err != nil { 170 fmt.Println(err) 171 t.Fail() 172 } 173 } 174 }