123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- /*
- cgi.tst - CGI tests
- */
- const HTTP = tget('TM_HTTP') || "127.0.0.1:8080"
- let http: Http = new Http
- if (thas('ME_GOAHEAD_CGI')) {
- /* Suport routines */
- function contains(pat): Void {
- ttrue(http.response.contains(pat))
- }
- function keyword(pat: String): String? {
- pat.replace(/\//, "\\/").replace(/\[/, "\\[")
- let reg = RegExp(".*" + pat + "=([^<]*).*", "s")
- return http.response.replace(reg, "$1")
- }
- function match(key: String, value: String): Void {
- if (keyword(key) != value) {
- print(http.response)
- print("\nKey \"" + key + "\"")
- print("Expected: " + value)
- // print("Actual : " + keyword(value))
- }
- ttrue(keyword(key) == value)
- }
- /* Tests */
- function forms() {
- // Test various forms to invoke cgi programs
- http.get(HTTP + "/cgi-bin/cgitest")
- ttrue(http.status == 200)
- contains("cgitest: Output")
- http.close()
- if (Config.OS == "windows") {
- http.get(HTTP + "/cgi-bin/cgitest.exe")
- ttrue(http.status == 200)
- contains("cgitest: Output")
- http.close()
- }
- }
- function extraPath() {
- http.get(HTTP + "/cgi-bin/cgitest")
- ttrue(http.status == 200)
- match("PATH_INFO", "")
- match("PATH_TRANSLATED", "")
- http.close()
- http.get(HTTP + "/cgi-bin/cgitest/extra/path")
- match("PATH_INFO", "/extra/path")
- let scriptFilename = keyword("SCRIPT_FILENAME")
- let path = Path(scriptFilename).dirname.join("extra/path")
- let translated = Path(keyword("PATH_TRANSLATED"))
- ttrue(path == translated)
- http.close()
- }
- function query() {
- http.get(HTTP + "/cgi-bin/cgitest/extra/path?a=b&c=d&e=f")
- match("SCRIPT_NAME", "/cgi-bin/cgitest")
- match("PATH_INFO", "/extra/path")
- contains("QVAR a=b")
- contains("QVAR c=d")
- http.close()
- http.get(HTTP + "/cgi-bin/cgitest?a+b+c")
- match("QUERY_STRING", "a+b+c")
- contains("QVAR a b c")
- http.close()
- //
- // Query string vars should not be turned into variables for GETs
- // Extra path only supported for cgi programs with extensions.
- //
- http.get(HTTP + "/cgi-bin/cgitest/extra/path?var1=a+a&var2=b%20b&var3=c")
- match("SCRIPT_NAME", "/cgi-bin/cgitest")
- match("QUERY_STRING", "var1=a+a&var2=b%20b&var3=c")
- match("QVAR var1", "a a")
- match("QVAR var2", "b b")
- match("QVAR var3", "c")
- http.close()
- //
- // Post data should be turned into variables
- //
- http.form(HTTP + "/cgi-bin/cgitest/extra/path?var1=a+a&var2=b%20b&var3=c",
- { name: "Peter", address: "777 Mulberry Lane" })
- match("QUERY_STRING", "var1=a+a&var2=b%20b&var3=c")
- match("QVAR var1", "a a")
- match("QVAR var2", "b b")
- match("QVAR var3", "c")
- match("PVAR name", "Peter")
- match("PVAR address", "777 Mulberry Lane")
- http.close()
- }
- function encoding() {
- http.get(HTTP + "/cgi-bin/cgitest/extra%20long/a/../path/a/..?var%201=value%201")
- match("QUERY_STRING", "var%201=value%201")
- match("SCRIPT_NAME", "/cgi-bin/cgitest")
- match("QVAR var 1", "value 1")
- match("PATH_INFO", "/extra long/path")
- let scriptFilename = keyword("SCRIPT_FILENAME")
- let path = Path(scriptFilename).dirname.join("extra long/path")
- let translated = Path(keyword("PATH_TRANSLATED"))
- ttrue(path == translated)
- http.close()
- }
- function status() {
- let http = new Http
- http.setHeader("SWITCHES", "-s%20711")
- http.get(HTTP + "/cgi-bin/cgitest?mob=111")
- ttrue(http.status == 711)
- http.close()
- }
- function location() {
- let http = new Http
- http.setHeader("SWITCHES", "-l%20/index.html")
- http.followRedirects = false
- http.get(HTTP + "/cgi-bin/cgitest")
- ttrue(http.status == 302)
- http.close()
- }
- function quoting() {
- http.get(HTTP + "/cgi-bin/cgitest?a+b+c")
- match("QUERY_STRING", "a+b+c")
- match("QVAR a b c", "")
- http.close()
- http.get(HTTP + "/cgi-bin/cgitest?a=1&b=2&c=3")
- match("QUERY_STRING", "a=1&b=2&c=3")
- match("QVAR a", "1")
- match("QVAR b", "2")
- match("QVAR c", "3")
- http.close()
- http.get(HTTP + "/cgi-bin/cgitest?a%20a=1%201+b%20b=2%202")
- match("QUERY_STRING", "a%20a=1%201+b%20b=2%202")
- match("QVAR a a", "1 1 b b=2 2")
- http.close()
- http.get(HTTP + "/cgi-bin/cgitest?a%20a=1%201&b%20b=2%202")
- match("QUERY_STRING", "a%20a=1%201&b%20b=2%202")
- match("QVAR a a", "1 1")
- match("QVAR b b", "2 2")
- http.close()
- }
- function post() {
- // Simple post
- http.post(HTTP + '/cgi-bin/cgitest', 'Some data')
- ttrue(http.status == 200)
- match('CONTENT_LENGTH', '9')
- http.close()
- // Simple form
- http.form(HTTP + '/cgi-bin/cgitest', {name: 'John', address: '700 Park Ave'})
- ttrue(http.status == 200)
- match('PVAR name', 'John')
- match('PVAR address', '700 Park Ave')
- http.close()
- }
- forms()
- extraPath()
- query()
- encoding()
- status()
- location()
- quoting()
- post()
- } else {
- tskip("CGI not enabled")
- }
|