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  }