11355St.nateldemoura@f5.comimport io
21293St.nateldemoura@f5.comimport os
31596Szelenkov@nginx.comimport re
4977Smax.romanov@gmail.comimport time
51477Szelenkov@nginx.com
61019Szelenkov@nginx.comfrom unit.applications.lang.java import TestApplicationJava
71730Szelenkov@nginx.comfrom unit.option import option
81735Szelenkov@nginx.comfrom unit.utils import public_dir
91017Szelenkov@nginx.com
101019Szelenkov@nginx.comclass TestJavaApplication(TestApplicationJava):
111467Szelenkov@nginx.com    prerequisites = {'modules': {'java': 'all'}}
12977Smax.romanov@gmail.com
13*1736Szelenkov@nginx.com    def test_java_conf_error(self, temp_dir, skip_alert):
141596Szelenkov@nginx.com        skip_alert(
151596Szelenkov@nginx.com            r'realpath.*failed',
161596Szelenkov@nginx.com            r'failed to apply new conf',
171596Szelenkov@nginx.com            r'application setup failed',
181106Szelenkov@nginx.com        )
191596Szelenkov@nginx.com        assert 'error' in self.conf(
201596Szelenkov@nginx.com            {
211596Szelenkov@nginx.com                "listeners": {"*:7080": {"pass": "applications/app"}},
221596Szelenkov@nginx.com                "applications": {
231596Szelenkov@nginx.com                    "app": {
241596Szelenkov@nginx.com                        "type": "java",
251596Szelenkov@nginx.com                        "processes": 1,
261596Szelenkov@nginx.com                        "working_directory": option.test_dir + "/java/empty",
271654Szelenkov@nginx.com                        "webapp": temp_dir + "/java",
281654Szelenkov@nginx.com                        "unit_jars": temp_dir + "/no_such_dir",
291596Szelenkov@nginx.com                    }
301596Szelenkov@nginx.com                },
311596Szelenkov@nginx.com            }
321596Szelenkov@nginx.com        ), 'conf error'
331106Szelenkov@nginx.com
341654Szelenkov@nginx.com    def test_java_war(self, temp_dir):
351106Szelenkov@nginx.com        self.load('empty_war')
361106Szelenkov@nginx.com
371596Szelenkov@nginx.com        assert 'success' in self.conf(
381654Szelenkov@nginx.com            '"' + temp_dir + '/java/empty.war"',
391596Szelenkov@nginx.com            '/config/applications/empty_war/webapp',
401596Szelenkov@nginx.com        ), 'configure war'
411106Szelenkov@nginx.com
421596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'war'
431106Szelenkov@nginx.com
44977Smax.romanov@gmail.com    def test_java_application_cookies(self):
45977Smax.romanov@gmail.com        self.load('cookies')
46977Smax.romanov@gmail.com
471017Szelenkov@nginx.com        headers = self.get(
481017Szelenkov@nginx.com            headers={
491017Szelenkov@nginx.com                'Cookie': 'var1=val1; var2=val2',
501017Szelenkov@nginx.com                'Host': 'localhost',
511017Szelenkov@nginx.com                'Connection': 'close',
521017Szelenkov@nginx.com            }
531017Szelenkov@nginx.com        )['headers']
54977Smax.romanov@gmail.com
551596Szelenkov@nginx.com        assert headers['X-Cookie-1'] == 'val1', 'cookie 1'
561596Szelenkov@nginx.com        assert headers['X-Cookie-2'] == 'val2', 'cookie 2'
57977Smax.romanov@gmail.com
58977Smax.romanov@gmail.com    def test_java_application_filter(self):
59977Smax.romanov@gmail.com        self.load('filter')
60977Smax.romanov@gmail.com
61977Smax.romanov@gmail.com        headers = self.get()['headers']
62977Smax.romanov@gmail.com
631596Szelenkov@nginx.com        assert headers['X-Filter-Before'] == '1', 'filter before'
641596Szelenkov@nginx.com        assert headers['X-Filter-After'] == '1', 'filter after'
65977Smax.romanov@gmail.com
661596Szelenkov@nginx.com        assert (
671596Szelenkov@nginx.com            self.get(url='/test')['headers']['X-Filter-After'] == '0'
681596Szelenkov@nginx.com        ), 'filter after 2'
69977Smax.romanov@gmail.com
70977Smax.romanov@gmail.com    def test_java_application_get_variables(self):
71977Smax.romanov@gmail.com        self.load('get_params')
72977Smax.romanov@gmail.com
731017Szelenkov@nginx.com        headers = self.get(url='/?var1=val1&var2=&var4=val4&var4=foo')[
741017Szelenkov@nginx.com            'headers'
751017Szelenkov@nginx.com        ]
76977Smax.romanov@gmail.com
771596Szelenkov@nginx.com        assert headers['X-Var-1'] == 'val1', 'GET variables'
781596Szelenkov@nginx.com        assert headers['X-Var-2'] == 'true', 'GET variables 2'
791596Szelenkov@nginx.com        assert headers['X-Var-3'] == 'false', 'GET variables 3'
80977Smax.romanov@gmail.com
811596Szelenkov@nginx.com        assert (
821596Szelenkov@nginx.com            headers['X-Param-Names'] == 'var4 var2 var1 '
831596Szelenkov@nginx.com        ), 'getParameterNames'
841596Szelenkov@nginx.com        assert headers['X-Param-Values'] == 'val4 foo ', 'getParameterValues'
851596Szelenkov@nginx.com        assert (
861596Szelenkov@nginx.com            headers['X-Param-Map'] == 'var2= var1=val1 var4=val4,foo '
871596Szelenkov@nginx.com        ), 'getParameterMap'
88977Smax.romanov@gmail.com
89977Smax.romanov@gmail.com    def test_java_application_post_variables(self):
90977Smax.romanov@gmail.com        self.load('post_params')
91977Smax.romanov@gmail.com
921017Szelenkov@nginx.com        headers = self.post(
931017Szelenkov@nginx.com            headers={
941017Szelenkov@nginx.com                'Content-Type': 'application/x-www-form-urlencoded',
951017Szelenkov@nginx.com                'Host': 'localhost',
961017Szelenkov@nginx.com                'Connection': 'close',
971017Szelenkov@nginx.com            },
981017Szelenkov@nginx.com            body='var1=val1&var2=',
991017Szelenkov@nginx.com        )['headers']
100977Smax.romanov@gmail.com
1011596Szelenkov@nginx.com        assert headers['X-Var-1'] == 'val1', 'POST variables'
1021596Szelenkov@nginx.com        assert headers['X-Var-2'] == 'true', 'POST variables 2'
1031596Szelenkov@nginx.com        assert headers['X-Var-3'] == 'false', 'POST variables 3'
104977Smax.romanov@gmail.com
105977Smax.romanov@gmail.com    def test_java_application_session(self):
106977Smax.romanov@gmail.com        self.load('session')
107977Smax.romanov@gmail.com
108977Smax.romanov@gmail.com        headers = self.get(url='/?var1=val1')['headers']
109977Smax.romanov@gmail.com        session_id = headers['X-Session-Id']
110977Smax.romanov@gmail.com
1111596Szelenkov@nginx.com        assert headers['X-Var-1'] == 'null', 'variable empty'
1121596Szelenkov@nginx.com        assert headers['X-Session-New'] == 'true', 'session create'
113977Smax.romanov@gmail.com
1141017Szelenkov@nginx.com        headers = self.get(
1151017Szelenkov@nginx.com            headers={
1161017Szelenkov@nginx.com                'Host': 'localhost',
1171017Szelenkov@nginx.com                'Cookie': 'JSESSIONID=' + session_id,
1181017Szelenkov@nginx.com                'Connection': 'close',
1191017Szelenkov@nginx.com            },
1201017Szelenkov@nginx.com            url='/?var1=val2',
1211017Szelenkov@nginx.com        )['headers']
122977Smax.romanov@gmail.com
1231596Szelenkov@nginx.com        assert headers['X-Var-1'] == 'val1', 'variable'
1241596Szelenkov@nginx.com        assert headers['X-Session-New'] == 'false', 'session resume'
1251596Szelenkov@nginx.com        assert session_id == headers['X-Session-Id'], 'session same id'
126977Smax.romanov@gmail.com
127977Smax.romanov@gmail.com    def test_java_application_session_active(self):
128977Smax.romanov@gmail.com        self.load('session_inactive')
129977Smax.romanov@gmail.com
1301596Szelenkov@nginx.com        resp = self.get(
1311596Szelenkov@nginx.com            headers={
1321596Szelenkov@nginx.com                'X-Interval': '4',
1331596Szelenkov@nginx.com                'Host': 'localhost',
1341596Szelenkov@nginx.com                'Connection': 'close',
1351596Szelenkov@nginx.com            }
1361596Szelenkov@nginx.com        )
137977Smax.romanov@gmail.com        session_id = resp['headers']['X-Session-Id']
138977Smax.romanov@gmail.com
1391596Szelenkov@nginx.com        assert resp['status'] == 200, 'session init'
1401596Szelenkov@nginx.com        assert resp['headers']['X-Session-Interval'] == '4', 'session interval'
1411596Szelenkov@nginx.com        assert (
1421017Szelenkov@nginx.com            abs(
1431017Szelenkov@nginx.com                self.date_to_sec_epoch(
1441017Szelenkov@nginx.com                    resp['headers']['X-Session-Last-Access-Time']
1451017Szelenkov@nginx.com                )
1461017Szelenkov@nginx.com                - self.sec_epoch()
1471596Szelenkov@nginx.com            )
1481596Szelenkov@nginx.com            < 5
1491596Szelenkov@nginx.com        ), 'session last access time'
150977Smax.romanov@gmail.com
151977Smax.romanov@gmail.com        time.sleep(1)
152977Smax.romanov@gmail.com
1531017Szelenkov@nginx.com        resp = self.get(
1541017Szelenkov@nginx.com            headers={
1551017Szelenkov@nginx.com                'Host': 'localhost',
1561017Szelenkov@nginx.com                'Cookie': 'JSESSIONID=' + session_id,
1571017Szelenkov@nginx.com                'Connection': 'close',
1581017Szelenkov@nginx.com            }
1591017Szelenkov@nginx.com        )
160977Smax.romanov@gmail.com
1611596Szelenkov@nginx.com        assert resp['headers']['X-Session-Id'] == session_id, 'session active'
162977Smax.romanov@gmail.com
163977Smax.romanov@gmail.com        session_id = resp['headers']['X-Session-Id']
164977Smax.romanov@gmail.com
165977Smax.romanov@gmail.com        time.sleep(1)
166977Smax.romanov@gmail.com
1671017Szelenkov@nginx.com        resp = self.get(
1681017Szelenkov@nginx.com            headers={
1691017Szelenkov@nginx.com                'Host': 'localhost',
1701017Szelenkov@nginx.com                'Cookie': 'JSESSIONID=' + session_id,
1711017Szelenkov@nginx.com                'Connection': 'close',
1721017Szelenkov@nginx.com            }
1731017Szelenkov@nginx.com        )
174977Smax.romanov@gmail.com
1751596Szelenkov@nginx.com        assert (
1761596Szelenkov@nginx.com            resp['headers']['X-Session-Id'] == session_id
1771596Szelenkov@nginx.com        ), 'session active 2'
178977Smax.romanov@gmail.com
1791088Szelenkov@nginx.com        time.sleep(2)
180977Smax.romanov@gmail.com
1811017Szelenkov@nginx.com        resp = self.get(
1821017Szelenkov@nginx.com            headers={
1831017Szelenkov@nginx.com                'Host': 'localhost',
1841017Szelenkov@nginx.com                'Cookie': 'JSESSIONID=' + session_id,
1851017Szelenkov@nginx.com                'Connection': 'close',
1861017Szelenkov@nginx.com            }
1871017Szelenkov@nginx.com        )
188977Smax.romanov@gmail.com
1891596Szelenkov@nginx.com        assert (
1901596Szelenkov@nginx.com            resp['headers']['X-Session-Id'] == session_id
1911596Szelenkov@nginx.com        ), 'session active 3'
192977Smax.romanov@gmail.com
193977Smax.romanov@gmail.com    def test_java_application_session_inactive(self):
194977Smax.romanov@gmail.com        self.load('session_inactive')
195977Smax.romanov@gmail.com
1961596Szelenkov@nginx.com        resp = self.get(
1971596Szelenkov@nginx.com            headers={
1981596Szelenkov@nginx.com                'X-Interval': '1',
1991596Szelenkov@nginx.com                'Host': 'localhost',
2001596Szelenkov@nginx.com                'Connection': 'close',
2011596Szelenkov@nginx.com            }
2021596Szelenkov@nginx.com        )
203977Smax.romanov@gmail.com        session_id = resp['headers']['X-Session-Id']
204977Smax.romanov@gmail.com
205977Smax.romanov@gmail.com        time.sleep(3)
206977Smax.romanov@gmail.com
2071017Szelenkov@nginx.com        resp = self.get(
2081017Szelenkov@nginx.com            headers={
2091017Szelenkov@nginx.com                'Host': 'localhost',
2101017Szelenkov@nginx.com                'Cookie': 'JSESSIONID=' + session_id,
2111017Szelenkov@nginx.com                'Connection': 'close',
2121017Szelenkov@nginx.com            }
2131017Szelenkov@nginx.com        )
214977Smax.romanov@gmail.com
2151596Szelenkov@nginx.com        assert (
2161596Szelenkov@nginx.com            resp['headers']['X-Session-Id'] != session_id
2171596Szelenkov@nginx.com        ), 'session inactive'
218977Smax.romanov@gmail.com
219977Smax.romanov@gmail.com    def test_java_application_session_invalidate(self):
220977Smax.romanov@gmail.com        self.load('session_invalidate')
221977Smax.romanov@gmail.com
222977Smax.romanov@gmail.com        resp = self.get()
223977Smax.romanov@gmail.com        session_id = resp['headers']['X-Session-Id']
224977Smax.romanov@gmail.com
2251017Szelenkov@nginx.com        resp = self.get(
2261017Szelenkov@nginx.com            headers={
2271017Szelenkov@nginx.com                'Host': 'localhost',
2281017Szelenkov@nginx.com                'Cookie': 'JSESSIONID=' + session_id,
2291017Szelenkov@nginx.com                'Connection': 'close',
2301017Szelenkov@nginx.com            }
2311017Szelenkov@nginx.com        )
232977Smax.romanov@gmail.com
2331596Szelenkov@nginx.com        assert (
2341596Szelenkov@nginx.com            resp['headers']['X-Session-Id'] != session_id
2351596Szelenkov@nginx.com        ), 'session invalidate'
236977Smax.romanov@gmail.com
237977Smax.romanov@gmail.com    def test_java_application_session_listeners(self):
238977Smax.romanov@gmail.com        self.load('session_listeners')
239977Smax.romanov@gmail.com
240977Smax.romanov@gmail.com        headers = self.get(url='/test?var1=val1')['headers']
241977Smax.romanov@gmail.com        session_id = headers['X-Session-Id']
242977Smax.romanov@gmail.com
2431596Szelenkov@nginx.com        assert headers['X-Session-Created'] == session_id, 'session create'
2441596Szelenkov@nginx.com        assert headers['X-Attr-Added'] == 'var1=val1', 'attribute add'
245977Smax.romanov@gmail.com
2461017Szelenkov@nginx.com        headers = self.get(
2471017Szelenkov@nginx.com            headers={
2481017Szelenkov@nginx.com                'Host': 'localhost',
2491017Szelenkov@nginx.com                'Cookie': 'JSESSIONID=' + session_id,
2501017Szelenkov@nginx.com                'Connection': 'close',
2511017Szelenkov@nginx.com            },
2521017Szelenkov@nginx.com            url='/?var1=val2',
2531017Szelenkov@nginx.com        )['headers']
254977Smax.romanov@gmail.com
2551596Szelenkov@nginx.com        assert session_id == headers['X-Session-Id'], 'session same id'
2561596Szelenkov@nginx.com        assert headers['X-Attr-Replaced'] == 'var1=val1', 'attribute replace'
257977Smax.romanov@gmail.com
2581017Szelenkov@nginx.com        headers = self.get(
2591017Szelenkov@nginx.com            headers={
2601017Szelenkov@nginx.com                'Host': 'localhost',
2611017Szelenkov@nginx.com                'Cookie': 'JSESSIONID=' + session_id,
2621017Szelenkov@nginx.com                'Connection': 'close',
2631017Szelenkov@nginx.com            },
2641017Szelenkov@nginx.com            url='/',
2651017Szelenkov@nginx.com        )['headers']
266977Smax.romanov@gmail.com
2671596Szelenkov@nginx.com        assert session_id == headers['X-Session-Id'], 'session same id'
2681596Szelenkov@nginx.com        assert headers['X-Attr-Removed'] == 'var1=val2', 'attribute remove'
269977Smax.romanov@gmail.com
270977Smax.romanov@gmail.com    def test_java_application_jsp(self):
271977Smax.romanov@gmail.com        self.load('jsp')
272977Smax.romanov@gmail.com
273977Smax.romanov@gmail.com        headers = self.get(url='/index.jsp')['headers']
274977Smax.romanov@gmail.com
2751596Szelenkov@nginx.com        assert headers['X-Unit-JSP'] == 'ok', 'JSP Ok header'
276977Smax.romanov@gmail.com
277977Smax.romanov@gmail.com    def test_java_application_url_pattern(self):
278977Smax.romanov@gmail.com        self.load('url_pattern')
279977Smax.romanov@gmail.com
280977Smax.romanov@gmail.com        headers = self.get(url='/foo/bar/index.html')['headers']
281977Smax.romanov@gmail.com
2821596Szelenkov@nginx.com        assert headers['X-Id'] == 'servlet1', '#1 Servlet1 request'
2831596Szelenkov@nginx.com        assert (
2841596Szelenkov@nginx.com            headers['X-Request-URI'] == '/foo/bar/index.html'
2851596Szelenkov@nginx.com        ), '#1 request URI'
2861596Szelenkov@nginx.com        assert headers['X-Servlet-Path'] == '/foo/bar', '#1 servlet path'
2871596Szelenkov@nginx.com        assert headers['X-Path-Info'] == '/index.html', '#1 path info'
288977Smax.romanov@gmail.com
289977Smax.romanov@gmail.com        headers = self.get(url='/foo/bar/index.bop')['headers']
290977Smax.romanov@gmail.com
2911596Szelenkov@nginx.com        assert headers['X-Id'] == 'servlet1', '#2 Servlet1 request'
2921596Szelenkov@nginx.com        assert (
2931596Szelenkov@nginx.com            headers['X-Request-URI'] == '/foo/bar/index.bop'
2941596Szelenkov@nginx.com        ), '#2 request URI'
2951596Szelenkov@nginx.com        assert headers['X-Servlet-Path'] == '/foo/bar', '#2 servlet path'
2961596Szelenkov@nginx.com        assert headers['X-Path-Info'] == '/index.bop', '#2 path info'
297977Smax.romanov@gmail.com
298977Smax.romanov@gmail.com        headers = self.get(url='/baz')['headers']
299977Smax.romanov@gmail.com
3001596Szelenkov@nginx.com        assert headers['X-Id'] == 'servlet2', '#3 Servlet2 request'
3011596Szelenkov@nginx.com        assert headers['X-Request-URI'] == '/baz', '#3 request URI'
3021596Szelenkov@nginx.com        assert headers['X-Servlet-Path'] == '/baz', '#3 servlet path'
3031596Szelenkov@nginx.com        assert headers['X-Path-Info'] == 'null', '#3 path info'
304977Smax.romanov@gmail.com
305977Smax.romanov@gmail.com        headers = self.get(url='/baz/index.html')['headers']
306977Smax.romanov@gmail.com
3071596Szelenkov@nginx.com        assert headers['X-Id'] == 'servlet2', '#4 Servlet2 request'
3081596Szelenkov@nginx.com        assert headers['X-Request-URI'] == '/baz/index.html', '#4 request URI'
3091596Szelenkov@nginx.com        assert headers['X-Servlet-Path'] == '/baz', '#4 servlet path'
3101596Szelenkov@nginx.com        assert headers['X-Path-Info'] == '/index.html', '#4 path info'
311977Smax.romanov@gmail.com
312977Smax.romanov@gmail.com        headers = self.get(url='/catalog')['headers']
313977Smax.romanov@gmail.com
3141596Szelenkov@nginx.com        assert headers['X-Id'] == 'servlet3', '#5 Servlet3 request'
3151596Szelenkov@nginx.com        assert headers['X-Request-URI'] == '/catalog', '#5 request URI'
3161596Szelenkov@nginx.com        assert headers['X-Servlet-Path'] == '/catalog', '#5 servlet path'
3171596Szelenkov@nginx.com        assert headers['X-Path-Info'] == 'null', '#5 path info'
318977Smax.romanov@gmail.com
319977Smax.romanov@gmail.com        headers = self.get(url='/catalog/index.html')['headers']
320977Smax.romanov@gmail.com
3211596Szelenkov@nginx.com        assert headers['X-Id'] == 'default', '#6 default request'
3221596Szelenkov@nginx.com        assert (
3231596Szelenkov@nginx.com            headers['X-Request-URI'] == '/catalog/index.html'
3241596Szelenkov@nginx.com        ), '#6 request URI'
3251596Szelenkov@nginx.com        assert (
3261596Szelenkov@nginx.com            headers['X-Servlet-Path'] == '/catalog/index.html'
3271596Szelenkov@nginx.com        ), '#6 servlet path'
3281596Szelenkov@nginx.com        assert headers['X-Path-Info'] == 'null', '#6 path info'
329977Smax.romanov@gmail.com
330977Smax.romanov@gmail.com        headers = self.get(url='/catalog/racecar.bop')['headers']
331977Smax.romanov@gmail.com
3321596Szelenkov@nginx.com        assert headers['X-Id'] == 'servlet4', '#7 servlet4 request'
3331596Szelenkov@nginx.com        assert (
3341596Szelenkov@nginx.com            headers['X-Request-URI'] == '/catalog/racecar.bop'
3351596Szelenkov@nginx.com        ), '#7 request URI'
3361596Szelenkov@nginx.com        assert (
3371596Szelenkov@nginx.com            headers['X-Servlet-Path'] == '/catalog/racecar.bop'
3381596Szelenkov@nginx.com        ), '#7 servlet path'
3391596Szelenkov@nginx.com        assert headers['X-Path-Info'] == 'null', '#7 path info'
340977Smax.romanov@gmail.com
3411017Szelenkov@nginx.com        headers = self.get(url='/index.bop')['headers']
342977Smax.romanov@gmail.com
3431596Szelenkov@nginx.com        assert headers['X-Id'] == 'servlet4', '#8 servlet4 request'
3441596Szelenkov@nginx.com        assert headers['X-Request-URI'] == '/index.bop', '#8 request URI'
3451596Szelenkov@nginx.com        assert headers['X-Servlet-Path'] == '/index.bop', '#8 servlet path'
3461596Szelenkov@nginx.com        assert headers['X-Path-Info'] == 'null', '#8 path info'
347977Smax.romanov@gmail.com
348977Smax.romanov@gmail.com        headers = self.get(url='/foo/baz')['headers']
349977Smax.romanov@gmail.com
3501596Szelenkov@nginx.com        assert headers['X-Id'] == 'servlet0', '#9 servlet0 request'
3511596Szelenkov@nginx.com        assert headers['X-Request-URI'] == '/foo/baz', '#9 request URI'
3521596Szelenkov@nginx.com        assert headers['X-Servlet-Path'] == '/foo', '#9 servlet path'
3531596Szelenkov@nginx.com        assert headers['X-Path-Info'] == '/baz', '#9 path info'
354977Smax.romanov@gmail.com
355977Smax.romanov@gmail.com        headers = self.get()['headers']
356977Smax.romanov@gmail.com
3571596Szelenkov@nginx.com        assert headers['X-Id'] == 'default', '#10 default request'
3581596Szelenkov@nginx.com        assert headers['X-Request-URI'] == '/', '#10 request URI'
3591596Szelenkov@nginx.com        assert headers['X-Servlet-Path'] == '/', '#10 servlet path'
3601596Szelenkov@nginx.com        assert headers['X-Path-Info'] == 'null', '#10 path info'
361977Smax.romanov@gmail.com
362977Smax.romanov@gmail.com        headers = self.get(url='/index.bop/')['headers']
363977Smax.romanov@gmail.com
3641596Szelenkov@nginx.com        assert headers['X-Id'] == 'default', '#11 default request'
3651596Szelenkov@nginx.com        assert headers['X-Request-URI'] == '/index.bop/', '#11 request URI'
3661596Szelenkov@nginx.com        assert headers['X-Servlet-Path'] == '/index.bop/', '#11 servlet path'
3671596Szelenkov@nginx.com        assert headers['X-Path-Info'] == 'null', '#11 path info'
368977Smax.romanov@gmail.com
369977Smax.romanov@gmail.com    def test_java_application_header(self):
370977Smax.romanov@gmail.com        self.load('header')
371977Smax.romanov@gmail.com
372977Smax.romanov@gmail.com        headers = self.get()['headers']
373977Smax.romanov@gmail.com
3741596Szelenkov@nginx.com        assert headers['X-Set-Utf8-Value'] == '????', 'set Utf8 header value'
3751596Szelenkov@nginx.com        assert headers['X-Set-Utf8-Name-???'] == 'x', 'set Utf8 header name'
3761596Szelenkov@nginx.com        assert headers['X-Add-Utf8-Value'] == '????', 'add Utf8 header value'
3771596Szelenkov@nginx.com        assert headers['X-Add-Utf8-Name-???'] == 'y', 'add Utf8 header name'
3781596Szelenkov@nginx.com        assert headers['X-Add-Test'] == 'v1', 'add null header'
3791596Szelenkov@nginx.com        assert ('X-Set-Test1' in headers) == False, 'set null header'
3801596Szelenkov@nginx.com        assert headers['X-Set-Test2'] == '', 'set empty header'
381977Smax.romanov@gmail.com
382977Smax.romanov@gmail.com    def test_java_application_content_type(self):
383977Smax.romanov@gmail.com        self.load('content_type')
384977Smax.romanov@gmail.com
385977Smax.romanov@gmail.com        headers = self.get(url='/1')['headers']
386977Smax.romanov@gmail.com
3871596Szelenkov@nginx.com        assert (
3881596Szelenkov@nginx.com            headers['Content-Type'] == 'text/plain;charset=utf-8'
3891596Szelenkov@nginx.com        ), '#1 Content-Type header'
3901596Szelenkov@nginx.com        assert (
3911596Szelenkov@nginx.com            headers['X-Content-Type'] == 'text/plain;charset=utf-8'
3921596Szelenkov@nginx.com        ), '#1 response Content-Type'
3931596Szelenkov@nginx.com        assert (
3941596Szelenkov@nginx.com            headers['X-Character-Encoding'] == 'utf-8'
3951596Szelenkov@nginx.com        ), '#1 response charset'
396977Smax.romanov@gmail.com
397977Smax.romanov@gmail.com        headers = self.get(url='/2')['headers']
398977Smax.romanov@gmail.com
3991596Szelenkov@nginx.com        assert (
4001596Szelenkov@nginx.com            headers['Content-Type'] == 'text/plain;charset=iso-8859-1'
4011596Szelenkov@nginx.com        ), '#2 Content-Type header'
4021596Szelenkov@nginx.com        assert (
4031596Szelenkov@nginx.com            headers['X-Content-Type'] == 'text/plain;charset=iso-8859-1'
4041596Szelenkov@nginx.com        ), '#2 response Content-Type'
4051596Szelenkov@nginx.com        assert (
4061596Szelenkov@nginx.com            headers['X-Character-Encoding'] == 'iso-8859-1'
4071596Szelenkov@nginx.com        ), '#2 response charset'
408977Smax.romanov@gmail.com
409977Smax.romanov@gmail.com        headers = self.get(url='/3')['headers']
410977Smax.romanov@gmail.com
4111596Szelenkov@nginx.com        assert (
4121596Szelenkov@nginx.com            headers['Content-Type'] == 'text/plain;charset=windows-1251'
4131596Szelenkov@nginx.com        ), '#3 Content-Type header'
4141596Szelenkov@nginx.com        assert (
4151596Szelenkov@nginx.com            headers['X-Content-Type'] == 'text/plain;charset=windows-1251'
4161596Szelenkov@nginx.com        ), '#3 response Content-Type'
4171596Szelenkov@nginx.com        assert (
4181596Szelenkov@nginx.com            headers['X-Character-Encoding'] == 'windows-1251'
4191596Szelenkov@nginx.com        ), '#3 response charset'
420977Smax.romanov@gmail.com
421977Smax.romanov@gmail.com        headers = self.get(url='/4')['headers']
422977Smax.romanov@gmail.com
4231596Szelenkov@nginx.com        assert (
4241596Szelenkov@nginx.com            headers['Content-Type'] == 'text/plain;charset=windows-1251'
4251596Szelenkov@nginx.com        ), '#4 Content-Type header'
4261596Szelenkov@nginx.com        assert (
4271596Szelenkov@nginx.com            headers['X-Content-Type'] == 'text/plain;charset=windows-1251'
4281596Szelenkov@nginx.com        ), '#4 response Content-Type'
4291596Szelenkov@nginx.com        assert (
4301596Szelenkov@nginx.com            headers['X-Character-Encoding'] == 'windows-1251'
4311596Szelenkov@nginx.com        ), '#4 response charset'
432977Smax.romanov@gmail.com
433977Smax.romanov@gmail.com        headers = self.get(url='/5')['headers']
434977Smax.romanov@gmail.com
4351596Szelenkov@nginx.com        assert (
4361596Szelenkov@nginx.com            headers['Content-Type'] == 'text/plain;charset=iso-8859-1'
4371596Szelenkov@nginx.com        ), '#5 Content-Type header'
4381596Szelenkov@nginx.com        assert (
4391596Szelenkov@nginx.com            headers['X-Content-Type'] == 'text/plain;charset=iso-8859-1'
4401596Szelenkov@nginx.com        ), '#5 response Content-Type'
4411596Szelenkov@nginx.com        assert (
4421596Szelenkov@nginx.com            headers['X-Character-Encoding'] == 'iso-8859-1'
4431596Szelenkov@nginx.com        ), '#5 response charset'
444977Smax.romanov@gmail.com
445977Smax.romanov@gmail.com        headers = self.get(url='/6')['headers']
446977Smax.romanov@gmail.com
4471596Szelenkov@nginx.com        assert (
4481596Szelenkov@nginx.com            'Content-Type' in headers
4491596Szelenkov@nginx.com        ) == False, '#6 no Content-Type header'
4501596Szelenkov@nginx.com        assert (
4511596Szelenkov@nginx.com            'X-Content-Type' in headers
4521596Szelenkov@nginx.com        ) == False, '#6 no response Content-Type'
4531596Szelenkov@nginx.com        assert (
4541596Szelenkov@nginx.com            headers['X-Character-Encoding'] == 'utf-8'
4551596Szelenkov@nginx.com        ), '#6 response charset'
456977Smax.romanov@gmail.com
457977Smax.romanov@gmail.com        headers = self.get(url='/7')['headers']
458977Smax.romanov@gmail.com
4591596Szelenkov@nginx.com        assert (
4601596Szelenkov@nginx.com            headers['Content-Type'] == 'text/plain;charset=utf-8'
4611596Szelenkov@nginx.com        ), '#7 Content-Type header'
4621596Szelenkov@nginx.com        assert (
4631596Szelenkov@nginx.com            headers['X-Content-Type'] == 'text/plain;charset=utf-8'
4641596Szelenkov@nginx.com        ), '#7 response Content-Type'
4651596Szelenkov@nginx.com        assert (
4661596Szelenkov@nginx.com            headers['X-Character-Encoding'] == 'utf-8'
4671596Szelenkov@nginx.com        ), '#7 response charset'
468977Smax.romanov@gmail.com
469977Smax.romanov@gmail.com        headers = self.get(url='/8')['headers']
470977Smax.romanov@gmail.com
4711596Szelenkov@nginx.com        assert (
4721596Szelenkov@nginx.com            headers['Content-Type'] == 'text/html;charset=utf-8'
4731596Szelenkov@nginx.com        ), '#8 Content-Type header'
4741596Szelenkov@nginx.com        assert (
4751596Szelenkov@nginx.com            headers['X-Content-Type'] == 'text/html;charset=utf-8'
4761596Szelenkov@nginx.com        ), '#8 response Content-Type'
4771596Szelenkov@nginx.com        assert (
4781596Szelenkov@nginx.com            headers['X-Character-Encoding'] == 'utf-8'
4791596Szelenkov@nginx.com        ), '#8 response charset'
480977Smax.romanov@gmail.com
481977Smax.romanov@gmail.com    def test_java_application_welcome_files(self):
482977Smax.romanov@gmail.com        self.load('welcome_files')
483977Smax.romanov@gmail.com
484977Smax.romanov@gmail.com        headers = self.get()['headers']
485977Smax.romanov@gmail.com
486977Smax.romanov@gmail.com        resp = self.get(url='/dir1')
487977Smax.romanov@gmail.com
4881596Szelenkov@nginx.com        assert resp['status'] == 302, 'dir redirect expected'
489977Smax.romanov@gmail.com
490977Smax.romanov@gmail.com        resp = self.get(url='/dir1/')
491977Smax.romanov@gmail.com
4921596Szelenkov@nginx.com        assert (
4931596Szelenkov@nginx.com            'This is index.txt.' in resp['body']
4941596Szelenkov@nginx.com        ) == True, 'dir1 index body'
4951596Szelenkov@nginx.com        assert resp['headers']['X-TXT-Filter'] == '1', 'TXT Filter header'
496977Smax.romanov@gmail.com
497977Smax.romanov@gmail.com        headers = self.get(url='/dir2/')['headers']
498977Smax.romanov@gmail.com
4991596Szelenkov@nginx.com        assert headers['X-Unit-JSP'] == 'ok', 'JSP Ok header'
5001596Szelenkov@nginx.com        assert headers['X-JSP-Filter'] == '1', 'JSP Filter header'
501977Smax.romanov@gmail.com
502977Smax.romanov@gmail.com        headers = self.get(url='/dir3/')['headers']
503977Smax.romanov@gmail.com
5041596Szelenkov@nginx.com        assert (
5051596Szelenkov@nginx.com            headers['X-App-Servlet'] == '1'
5061596Szelenkov@nginx.com        ), 'URL pattern overrides welcome file'
507977Smax.romanov@gmail.com
508977Smax.romanov@gmail.com        headers = self.get(url='/dir4/')['headers']
509977Smax.romanov@gmail.com
5101596Szelenkov@nginx.com        assert (
5111596Szelenkov@nginx.com            'X-App-Servlet' in headers
5121596Szelenkov@nginx.com        ) == False, 'Static welcome file served first'
513977Smax.romanov@gmail.com
514977Smax.romanov@gmail.com        headers = self.get(url='/dir5/')['headers']
515977Smax.romanov@gmail.com
5161596Szelenkov@nginx.com        assert (
5171596Szelenkov@nginx.com            headers['X-App-Servlet'] == '1'
5181596Szelenkov@nginx.com        ), 'Servlet for welcome file served when no static file found'
519977Smax.romanov@gmail.com
520977Smax.romanov@gmail.com    def test_java_application_request_listeners(self):
521977Smax.romanov@gmail.com        self.load('request_listeners')
522977Smax.romanov@gmail.com
523977Smax.romanov@gmail.com        headers = self.get(url='/test1')['headers']
524977Smax.romanov@gmail.com
5251596Szelenkov@nginx.com        assert (
5261596Szelenkov@nginx.com            headers['X-Request-Initialized'] == '/test1'
5271596Szelenkov@nginx.com        ), 'request initialized event'
5281596Szelenkov@nginx.com        assert headers['X-Request-Destroyed'] == '', 'request destroyed event'
5291596Szelenkov@nginx.com        assert headers['X-Attr-Added'] == '', 'attribute added event'
5301596Szelenkov@nginx.com        assert headers['X-Attr-Removed'] == '', 'attribute removed event'
5311596Szelenkov@nginx.com        assert headers['X-Attr-Replaced'] == '', 'attribute replaced event'
532977Smax.romanov@gmail.com
533977Smax.romanov@gmail.com        headers = self.get(url='/test2?var1=1')['headers']
534977Smax.romanov@gmail.com
5351596Szelenkov@nginx.com        assert (
5361596Szelenkov@nginx.com            headers['X-Request-Initialized'] == '/test2'
5371596Szelenkov@nginx.com        ), 'request initialized event'
5381596Szelenkov@nginx.com        assert (
5391596Szelenkov@nginx.com            headers['X-Request-Destroyed'] == '/test1'
5401596Szelenkov@nginx.com        ), 'request destroyed event'
5411596Szelenkov@nginx.com        assert headers['X-Attr-Added'] == 'var=1;', 'attribute added event'
5421596Szelenkov@nginx.com        assert headers['X-Attr-Removed'] == 'var=1;', 'attribute removed event'
5431596Szelenkov@nginx.com        assert headers['X-Attr-Replaced'] == '', 'attribute replaced event'
544977Smax.romanov@gmail.com
545977Smax.romanov@gmail.com        headers = self.get(url='/test3?var1=1&var2=2')['headers']
546977Smax.romanov@gmail.com
5471596Szelenkov@nginx.com        assert (
5481596Szelenkov@nginx.com            headers['X-Request-Initialized'] == '/test3'
5491596Szelenkov@nginx.com        ), 'request initialized event'
5501596Szelenkov@nginx.com        assert (
5511596Szelenkov@nginx.com            headers['X-Request-Destroyed'] == '/test2'
5521596Szelenkov@nginx.com        ), 'request destroyed event'
5531596Szelenkov@nginx.com        assert headers['X-Attr-Added'] == 'var=1;', 'attribute added event'
5541596Szelenkov@nginx.com        assert headers['X-Attr-Removed'] == 'var=2;', 'attribute removed event'
5551596Szelenkov@nginx.com        assert (
5561596Szelenkov@nginx.com            headers['X-Attr-Replaced'] == 'var=1;'
5571596Szelenkov@nginx.com        ), 'attribute replaced event'
558977Smax.romanov@gmail.com
559977Smax.romanov@gmail.com        headers = self.get(url='/test4?var1=1&var2=2&var3=3')['headers']
560977Smax.romanov@gmail.com
5611596Szelenkov@nginx.com        assert (
5621596Szelenkov@nginx.com            headers['X-Request-Initialized'] == '/test4'
5631596Szelenkov@nginx.com        ), 'request initialized event'
5641596Szelenkov@nginx.com        assert (
5651596Szelenkov@nginx.com            headers['X-Request-Destroyed'] == '/test3'
5661596Szelenkov@nginx.com        ), 'request destroyed event'
5671596Szelenkov@nginx.com        assert headers['X-Attr-Added'] == 'var=1;', 'attribute added event'
5681596Szelenkov@nginx.com        assert headers['X-Attr-Removed'] == '', 'attribute removed event'
5691596Szelenkov@nginx.com        assert (
5701596Szelenkov@nginx.com            headers['X-Attr-Replaced'] == 'var=1;var=2;'
5711596Szelenkov@nginx.com        ), 'attribute replaced event'
572977Smax.romanov@gmail.com
573977Smax.romanov@gmail.com    def test_java_application_request_uri_forward(self):
574977Smax.romanov@gmail.com        self.load('forward')
575977Smax.romanov@gmail.com
5761017Szelenkov@nginx.com        resp = self.get(
5771017Szelenkov@nginx.com            url='/fwd?uri=%2Fdata%2Ftest%3Furi%3Dnew_uri%26a%3D2%26b%3D3&a=1&c=4'
5781017Szelenkov@nginx.com        )
579977Smax.romanov@gmail.com        headers = resp['headers']
580977Smax.romanov@gmail.com
5811596Szelenkov@nginx.com        assert (
5821596Szelenkov@nginx.com            headers['X-REQUEST-Id'] == 'fwd'
5831596Szelenkov@nginx.com        ), 'initial request servlet mapping'
5841596Szelenkov@nginx.com        assert (
5851596Szelenkov@nginx.com            headers['X-Forward-To'] == '/data/test?uri=new_uri&a=2&b=3'
5861596Szelenkov@nginx.com        ), 'forwarding triggered'
5871596Szelenkov@nginx.com        assert (
5881596Szelenkov@nginx.com            headers['X-REQUEST-Param-uri'] == '/data/test?uri=new_uri&a=2&b=3'
5891596Szelenkov@nginx.com        ), 'original uri parameter'
5901596Szelenkov@nginx.com        assert headers['X-REQUEST-Param-a'] == '1', 'original a parameter'
5911596Szelenkov@nginx.com        assert headers['X-REQUEST-Param-c'] == '4', 'original c parameter'
592977Smax.romanov@gmail.com
5931596Szelenkov@nginx.com        assert (
5941596Szelenkov@nginx.com            headers['X-FORWARD-Id'] == 'data'
5951596Szelenkov@nginx.com        ), 'forward request servlet mapping'
5961596Szelenkov@nginx.com        assert (
5971596Szelenkov@nginx.com            headers['X-FORWARD-Request-URI'] == '/data/test'
5981596Szelenkov@nginx.com        ), 'forward request uri'
5991596Szelenkov@nginx.com        assert (
6001596Szelenkov@nginx.com            headers['X-FORWARD-Servlet-Path'] == '/data'
6011596Szelenkov@nginx.com        ), 'forward request servlet path'
6021596Szelenkov@nginx.com        assert (
6031596Szelenkov@nginx.com            headers['X-FORWARD-Path-Info'] == '/test'
6041596Szelenkov@nginx.com        ), 'forward request path info'
6051596Szelenkov@nginx.com        assert (
6061596Szelenkov@nginx.com            headers['X-FORWARD-Query-String'] == 'uri=new_uri&a=2&b=3'
6071596Szelenkov@nginx.com        ), 'forward request query string'
6081596Szelenkov@nginx.com        assert (
6091596Szelenkov@nginx.com            headers['X-FORWARD-Param-uri']
6101596Szelenkov@nginx.com            == 'new_uri,/data/test?uri=new_uri&a=2&b=3'
6111596Szelenkov@nginx.com        ), 'forward uri parameter'
6121596Szelenkov@nginx.com        assert headers['X-FORWARD-Param-a'] == '2,1', 'forward a parameter'
6131596Szelenkov@nginx.com        assert headers['X-FORWARD-Param-b'] == '3', 'forward b parameter'
6141596Szelenkov@nginx.com        assert headers['X-FORWARD-Param-c'] == '4', 'forward c parameter'
615977Smax.romanov@gmail.com
6161596Szelenkov@nginx.com        assert (
6171596Szelenkov@nginx.com            headers['X-javax.servlet.forward.request_uri'] == '/fwd'
6181596Szelenkov@nginx.com        ), 'original request uri'
6191596Szelenkov@nginx.com        assert (
6201596Szelenkov@nginx.com            headers['X-javax.servlet.forward.context_path'] == ''
6211596Szelenkov@nginx.com        ), 'original request context path'
6221596Szelenkov@nginx.com        assert (
6231596Szelenkov@nginx.com            headers['X-javax.servlet.forward.servlet_path'] == '/fwd'
6241596Szelenkov@nginx.com        ), 'original request servlet path'
6251596Szelenkov@nginx.com        assert (
6261596Szelenkov@nginx.com            headers['X-javax.servlet.forward.path_info'] == 'null'
6271596Szelenkov@nginx.com        ), 'original request path info'
6281596Szelenkov@nginx.com        assert (
6291596Szelenkov@nginx.com            headers['X-javax.servlet.forward.query_string']
6301596Szelenkov@nginx.com            == 'uri=%2Fdata%2Ftest%3Furi%3Dnew_uri%26a%3D2%26b%3D3&a=1&c=4'
6311596Szelenkov@nginx.com        ), 'original request query'
632977Smax.romanov@gmail.com
6331596Szelenkov@nginx.com        assert (
6341596Szelenkov@nginx.com            'Before forwarding' in resp['body']
6351596Szelenkov@nginx.com        ) == False, 'discarded data added before forward() call'
6361596Szelenkov@nginx.com        assert (
6371596Szelenkov@nginx.com            'X-After-Forwarding' in headers
6381596Szelenkov@nginx.com        ) == False, 'cannot add headers after forward() call'
6391596Szelenkov@nginx.com        assert (
6401596Szelenkov@nginx.com            'After forwarding' in resp['body']
6411596Szelenkov@nginx.com        ) == False, 'cannot add data after forward() call'
642977Smax.romanov@gmail.com
643977Smax.romanov@gmail.com    def test_java_application_named_dispatcher_forward(self):
644977Smax.romanov@gmail.com        self.load('forward')
645977Smax.romanov@gmail.com
646977Smax.romanov@gmail.com        resp = self.get(url='/fwd?disp=name&uri=data')
647977Smax.romanov@gmail.com        headers = resp['headers']
648977Smax.romanov@gmail.com
6491596Szelenkov@nginx.com        assert (
6501596Szelenkov@nginx.com            headers['X-REQUEST-Id'] == 'fwd'
6511596Szelenkov@nginx.com        ), 'initial request servlet mapping'
6521596Szelenkov@nginx.com        assert headers['X-Forward-To'] == 'data', 'forwarding triggered'
653977Smax.romanov@gmail.com
6541596Szelenkov@nginx.com        assert (
6551596Szelenkov@nginx.com            headers['X-FORWARD-Id'] == 'data'
6561596Szelenkov@nginx.com        ), 'forward request servlet mapping'
6571596Szelenkov@nginx.com        assert (
6581596Szelenkov@nginx.com            headers['X-FORWARD-Request-URI'] == '/fwd'
6591596Szelenkov@nginx.com        ), 'forward request uri'
6601596Szelenkov@nginx.com        assert (
6611596Szelenkov@nginx.com            headers['X-FORWARD-Servlet-Path'] == '/fwd'
6621596Szelenkov@nginx.com        ), 'forward request servlet path'
6631596Szelenkov@nginx.com        assert (
6641596Szelenkov@nginx.com            headers['X-FORWARD-Path-Info'] == 'null'
6651596Szelenkov@nginx.com        ), 'forward request path info'
6661596Szelenkov@nginx.com        assert (
6671596Szelenkov@nginx.com            headers['X-FORWARD-Query-String'] == 'disp=name&uri=data'
6681596Szelenkov@nginx.com        ), 'forward request query string'
669977Smax.romanov@gmail.com
6701596Szelenkov@nginx.com        assert (
6711596Szelenkov@nginx.com            headers['X-javax.servlet.forward.request_uri'] == 'null'
6721596Szelenkov@nginx.com        ), 'original request uri'
6731596Szelenkov@nginx.com        assert (
6741596Szelenkov@nginx.com            headers['X-javax.servlet.forward.context_path'] == 'null'
6751596Szelenkov@nginx.com        ), 'original request context path'
6761596Szelenkov@nginx.com        assert (
6771596Szelenkov@nginx.com            headers['X-javax.servlet.forward.servlet_path'] == 'null'
6781596Szelenkov@nginx.com        ), 'original request servlet path'
6791596Szelenkov@nginx.com        assert (
6801596Szelenkov@nginx.com            headers['X-javax.servlet.forward.path_info'] == 'null'
6811596Szelenkov@nginx.com        ), 'original request path info'
6821596Szelenkov@nginx.com        assert (
6831596Szelenkov@nginx.com            headers['X-javax.servlet.forward.query_string'] == 'null'
6841596Szelenkov@nginx.com        ), 'original request query'
685977Smax.romanov@gmail.com
6861596Szelenkov@nginx.com        assert (
6871596Szelenkov@nginx.com            'Before forwarding' in resp['body']
6881596Szelenkov@nginx.com        ) == False, 'discarded data added before forward() call'
6891596Szelenkov@nginx.com        assert (
6901596Szelenkov@nginx.com            'X-After-Forwarding' in headers
6911596Szelenkov@nginx.com        ) == False, 'cannot add headers after forward() call'
6921596Szelenkov@nginx.com        assert (
6931596Szelenkov@nginx.com            'After forwarding' in resp['body']
6941596Szelenkov@nginx.com        ) == False, 'cannot add data after forward() call'
695977Smax.romanov@gmail.com
696977Smax.romanov@gmail.com    def test_java_application_request_uri_include(self):
697977Smax.romanov@gmail.com        self.load('include')
698977Smax.romanov@gmail.com
699977Smax.romanov@gmail.com        resp = self.get(url='/inc?uri=/data/test')
700977Smax.romanov@gmail.com        headers = resp['headers']
701977Smax.romanov@gmail.com        body = resp['body']
702977Smax.romanov@gmail.com
7031596Szelenkov@nginx.com        assert (
7041596Szelenkov@nginx.com            headers['X-REQUEST-Id'] == 'inc'
7051596Szelenkov@nginx.com        ), 'initial request servlet mapping'
7061596Szelenkov@nginx.com        assert headers['X-Include'] == '/data/test', 'including triggered'
707977Smax.romanov@gmail.com
7081596Szelenkov@nginx.com        assert (
7091596Szelenkov@nginx.com            'X-INCLUDE-Id' in headers
7101596Szelenkov@nginx.com        ) == False, 'unable to add headers in include request'
711977Smax.romanov@gmail.com
7121596Szelenkov@nginx.com        assert (
7131596Szelenkov@nginx.com            'javax.servlet.include.request_uri:  /data/test' in body
7141596Szelenkov@nginx.com        ) == True, 'include request uri'
7151596Szelenkov@nginx.com        #assert (
7161596Szelenkov@nginx.com        #    'javax.servlet.include.context_path: ' in body
7171596Szelenkov@nginx.com        #) == True, 'include request context path'
7181596Szelenkov@nginx.com        assert (
7191596Szelenkov@nginx.com            'javax.servlet.include.servlet_path: /data' in body
7201596Szelenkov@nginx.com        ) == True, 'include request servlet path'
7211596Szelenkov@nginx.com        assert (
7221596Szelenkov@nginx.com            'javax.servlet.include.path_info:    /test' in body
7231596Szelenkov@nginx.com        ) == True, 'include request path info'
7241596Szelenkov@nginx.com        assert (
7251596Szelenkov@nginx.com            'javax.servlet.include.query_string: null' in body
7261596Szelenkov@nginx.com        ) == True, 'include request query'
727977Smax.romanov@gmail.com
7281596Szelenkov@nginx.com        assert (
7291596Szelenkov@nginx.com            'Before include' in body
7301596Szelenkov@nginx.com        ) == True, 'preserve data added before include() call'
7311596Szelenkov@nginx.com        assert (
7321596Szelenkov@nginx.com            headers['X-After-Include'] == 'you-should-see-this'
7331596Szelenkov@nginx.com        ), 'add headers after include() call'
7341596Szelenkov@nginx.com        assert (
7351596Szelenkov@nginx.com            'After include' in body
7361596Szelenkov@nginx.com        ) == True, 'add data after include() call'
737977Smax.romanov@gmail.com
738977Smax.romanov@gmail.com    def test_java_application_named_dispatcher_include(self):
739977Smax.romanov@gmail.com        self.load('include')
740977Smax.romanov@gmail.com
741977Smax.romanov@gmail.com        resp = self.get(url='/inc?disp=name&uri=data')
742977Smax.romanov@gmail.com        headers = resp['headers']
743977Smax.romanov@gmail.com        body = resp['body']
744977Smax.romanov@gmail.com
7451596Szelenkov@nginx.com        assert (
7461596Szelenkov@nginx.com            headers['X-REQUEST-Id'] == 'inc'
7471596Szelenkov@nginx.com        ), 'initial request servlet mapping'
7481596Szelenkov@nginx.com        assert headers['X-Include'] == 'data', 'including triggered'
749977Smax.romanov@gmail.com
7501596Szelenkov@nginx.com        assert (
7511596Szelenkov@nginx.com            'X-INCLUDE-Id' in headers
7521596Szelenkov@nginx.com        ) == False, 'unable to add headers in include request'
753977Smax.romanov@gmail.com
7541596Szelenkov@nginx.com        assert (
7551596Szelenkov@nginx.com            'javax.servlet.include.request_uri:  null' in body
7561596Szelenkov@nginx.com        ) == True, 'include request uri'
7571596Szelenkov@nginx.com        #assert (
7581596Szelenkov@nginx.com        #    'javax.servlet.include.context_path: null' in body
7591596Szelenkov@nginx.com        #) == True, 'include request context path'
7601596Szelenkov@nginx.com        assert (
7611596Szelenkov@nginx.com            'javax.servlet.include.servlet_path: null' in body
7621596Szelenkov@nginx.com        ) == True, 'include request servlet path'
7631596Szelenkov@nginx.com        assert (
7641596Szelenkov@nginx.com            'javax.servlet.include.path_info:    null' in body
7651596Szelenkov@nginx.com        ) == True, 'include request path info'
7661596Szelenkov@nginx.com        assert (
7671596Szelenkov@nginx.com            'javax.servlet.include.query_string: null' in body
7681596Szelenkov@nginx.com        ) == True, 'include request query'
769977Smax.romanov@gmail.com
7701596Szelenkov@nginx.com        assert (
7711596Szelenkov@nginx.com            'Before include' in body
7721596Szelenkov@nginx.com        ) == True, 'preserve data added before include() call'
7731596Szelenkov@nginx.com        assert (
7741596Szelenkov@nginx.com            headers['X-After-Include'] == 'you-should-see-this'
7751596Szelenkov@nginx.com        ), 'add headers after include() call'
7761596Szelenkov@nginx.com        assert (
7771596Szelenkov@nginx.com            'After include' in body
7781596Szelenkov@nginx.com        ) == True, 'add data after include() call'
779977Smax.romanov@gmail.com
780977Smax.romanov@gmail.com    def test_java_application_path_translation(self):
781977Smax.romanov@gmail.com        self.load('path_translation')
782977Smax.romanov@gmail.com
783977Smax.romanov@gmail.com        headers = self.get(url='/pt/test?path=/')['headers']
784977Smax.romanov@gmail.com
7851596Szelenkov@nginx.com        assert headers['X-Servlet-Path'] == '/pt', 'matched servlet path'
7861596Szelenkov@nginx.com        assert headers['X-Path-Info'] == '/test', 'the rest of the path'
7871596Szelenkov@nginx.com        assert (
7881596Szelenkov@nginx.com            headers['X-Path-Translated']
7891596Szelenkov@nginx.com            == headers['X-Real-Path'] + headers['X-Path-Info']
7901596Szelenkov@nginx.com        ), 'translated path is the app root + path info'
7911596Szelenkov@nginx.com        assert (
7921596Szelenkov@nginx.com            headers['X-Resource-Paths'].endswith('/WEB-INF/, /index.html]')
7931596Szelenkov@nginx.com            == True
7941596Szelenkov@nginx.com        ), 'app root directory content'
7951596Szelenkov@nginx.com        assert (
7961596Szelenkov@nginx.com            headers['X-Resource-As-Stream'] == 'null'
7971596Szelenkov@nginx.com        ), 'no resource stream for root path'
798977Smax.romanov@gmail.com
799977Smax.romanov@gmail.com        headers = self.get(url='/test?path=/none')['headers']
800977Smax.romanov@gmail.com
8011596Szelenkov@nginx.com        assert headers['X-Servlet-Path'] == '/test', 'matched whole path'
8021596Szelenkov@nginx.com        assert (
8031596Szelenkov@nginx.com            headers['X-Path-Info'] == 'null'
8041596Szelenkov@nginx.com        ), 'the rest of the path is null, whole path matched'
8051596Szelenkov@nginx.com        assert (
8061596Szelenkov@nginx.com            headers['X-Path-Translated'] == 'null'
8071596Szelenkov@nginx.com        ), 'translated path is null because path info is null'
8081596Szelenkov@nginx.com        assert (
8091596Szelenkov@nginx.com            headers['X-Real-Path'].endswith('/none') == True
8101596Szelenkov@nginx.com        ), 'read path is not null'
8111596Szelenkov@nginx.com        assert headers['X-Resource-Paths'] == 'null', 'no resource found'
8121596Szelenkov@nginx.com        assert headers['X-Resource-As-Stream'] == 'null', 'no resource stream'
813977Smax.romanov@gmail.com
814977Smax.romanov@gmail.com    def test_java_application_query_string(self):
815977Smax.romanov@gmail.com        self.load('query_string')
816977Smax.romanov@gmail.com
8171596Szelenkov@nginx.com        assert (
8181596Szelenkov@nginx.com            self.get(url='/?a=b')['headers']['X-Query-String'] == 'a=b'
8191596Szelenkov@nginx.com        ), 'query string'
820977Smax.romanov@gmail.com
821977Smax.romanov@gmail.com    def test_java_application_query_empty(self):
822977Smax.romanov@gmail.com        self.load('query_string')
823977Smax.romanov@gmail.com
8241596Szelenkov@nginx.com        assert (
8251596Szelenkov@nginx.com            self.get(url='/?')['headers']['X-Query-String'] == ''
8261596Szelenkov@nginx.com        ), 'query string empty'
827977Smax.romanov@gmail.com
828977Smax.romanov@gmail.com    def test_java_application_query_absent(self):
829977Smax.romanov@gmail.com        self.load('query_string')
830977Smax.romanov@gmail.com
8311596Szelenkov@nginx.com        assert (
8321596Szelenkov@nginx.com            self.get()['headers']['X-Query-String'] == 'null'
8331596Szelenkov@nginx.com        ), 'query string absent'
834977Smax.romanov@gmail.com
835977Smax.romanov@gmail.com    def test_java_application_empty(self):
836977Smax.romanov@gmail.com        self.load('empty')
837977Smax.romanov@gmail.com
8381596Szelenkov@nginx.com        assert self.get()['status'] == 200, 'empty'
839977Smax.romanov@gmail.com
840977Smax.romanov@gmail.com    def test_java_application_keepalive_body(self):
841977Smax.romanov@gmail.com        self.load('mirror')
842977Smax.romanov@gmail.com
8431596Szelenkov@nginx.com        assert self.post()['status'] == 200, 'init'
8441029Szelenkov@nginx.com
8451453Szelenkov@nginx.com        body = '0123456789' * 500
8461017Szelenkov@nginx.com        (resp, sock) = self.post(
8471017Szelenkov@nginx.com            headers={
8481017Szelenkov@nginx.com                'Connection': 'keep-alive',
8491017Szelenkov@nginx.com                'Content-Type': 'text/html',
8501017Szelenkov@nginx.com                'Host': 'localhost',
8511017Szelenkov@nginx.com            },
8521017Szelenkov@nginx.com            start=True,
8531453Szelenkov@nginx.com            body=body,
8541029Szelenkov@nginx.com            read_timeout=1,
8551017Szelenkov@nginx.com        )
856977Smax.romanov@gmail.com
8571596Szelenkov@nginx.com        assert resp['body'] == body, 'keep-alive 1'
858977Smax.romanov@gmail.com
8591453Szelenkov@nginx.com        body = '0123456789'
8601017Szelenkov@nginx.com        resp = self.post(
8611017Szelenkov@nginx.com            headers={
8621017Szelenkov@nginx.com                'Connection': 'close',
8631017Szelenkov@nginx.com                'Content-Type': 'text/html',
8641017Szelenkov@nginx.com                'Host': 'localhost',
8651017Szelenkov@nginx.com            },
8661017Szelenkov@nginx.com            sock=sock,
8671453Szelenkov@nginx.com            body=body,
8681017Szelenkov@nginx.com        )
869977Smax.romanov@gmail.com
8701596Szelenkov@nginx.com        assert resp['body'] == body, 'keep-alive 2'
871977Smax.romanov@gmail.com
872977Smax.romanov@gmail.com    def test_java_application_http_10(self):
873977Smax.romanov@gmail.com        self.load('empty')
874977Smax.romanov@gmail.com
8751596Szelenkov@nginx.com        assert self.get(http_10=True)['status'] == 200, 'HTTP 1.0'
876977Smax.romanov@gmail.com
877977Smax.romanov@gmail.com    def test_java_application_no_method(self):
878977Smax.romanov@gmail.com        self.load('empty')
879977Smax.romanov@gmail.com
8801596Szelenkov@nginx.com        assert self.post()['status'] == 405, 'no method'
881977Smax.romanov@gmail.com
882977Smax.romanov@gmail.com    def test_java_application_get_header(self):
883977Smax.romanov@gmail.com        self.load('get_header')
884977Smax.romanov@gmail.com
8851596Szelenkov@nginx.com        assert (
8861017Szelenkov@nginx.com            self.get(
8871017Szelenkov@nginx.com                headers={
8881017Szelenkov@nginx.com                    'X-Header': 'blah',
8891017Szelenkov@nginx.com                    'Content-Type': 'text/html',
8901017Szelenkov@nginx.com                    'Host': 'localhost',
8911018Szelenkov@nginx.com                    'Connection': 'close',
8921017Szelenkov@nginx.com                }
8931596Szelenkov@nginx.com            )['headers']['X-Reply']
8941596Szelenkov@nginx.com            == 'blah'
8951596Szelenkov@nginx.com        ), 'get header'
896977Smax.romanov@gmail.com
897977Smax.romanov@gmail.com    def test_java_application_get_header_empty(self):
898977Smax.romanov@gmail.com        self.load('get_header')
899977Smax.romanov@gmail.com
9001596Szelenkov@nginx.com        assert 'X-Reply' not in self.get()['headers'], 'get header empty'
901977Smax.romanov@gmail.com
902977Smax.romanov@gmail.com    def test_java_application_get_headers(self):
903977Smax.romanov@gmail.com        self.load('get_headers')
904977Smax.romanov@gmail.com
9051017Szelenkov@nginx.com        headers = self.get(
9061017Szelenkov@nginx.com            headers={
9071017Szelenkov@nginx.com                'X-Header': ['blah', 'blah'],
9081017Szelenkov@nginx.com                'Content-Type': 'text/html',
9091017Szelenkov@nginx.com                'Host': 'localhost',
9101018Szelenkov@nginx.com                'Connection': 'close',
9111017Szelenkov@nginx.com            }
9121017Szelenkov@nginx.com        )['headers']
913977Smax.romanov@gmail.com
9141596Szelenkov@nginx.com        assert headers['X-Reply-0'] == 'blah', 'get headers'
9151596Szelenkov@nginx.com        assert headers['X-Reply-1'] == 'blah', 'get headers 2'
916977Smax.romanov@gmail.com
917977Smax.romanov@gmail.com    def test_java_application_get_headers_empty(self):
918977Smax.romanov@gmail.com        self.load('get_headers')
919977Smax.romanov@gmail.com
9201596Szelenkov@nginx.com        assert 'X-Reply-0' not in self.get()['headers'], 'get headers empty'
921977Smax.romanov@gmail.com
922977Smax.romanov@gmail.com    def test_java_application_get_header_names(self):
923977Smax.romanov@gmail.com        self.load('get_header_names')
924977Smax.romanov@gmail.com
925977Smax.romanov@gmail.com        headers = self.get()['headers']
926977Smax.romanov@gmail.com
9271596Szelenkov@nginx.com        assert re.search(
9281596Szelenkov@nginx.com            r'(?:Host|Connection)', headers['X-Reply-0']
9291596Szelenkov@nginx.com        ), 'get header names'
9301596Szelenkov@nginx.com        assert re.search(
9311596Szelenkov@nginx.com            r'(?:Host|Connection)', headers['X-Reply-1']
9321596Szelenkov@nginx.com        ), 'get header names 2'
9331596Szelenkov@nginx.com        assert (
9341596Szelenkov@nginx.com            headers['X-Reply-0'] != headers['X-Reply-1']
9351596Szelenkov@nginx.com        ), 'get header names not equal'
936977Smax.romanov@gmail.com
937977Smax.romanov@gmail.com    def test_java_application_header_int(self):
938977Smax.romanov@gmail.com        self.load('header_int')
939977Smax.romanov@gmail.com
9401017Szelenkov@nginx.com        headers = self.get(
9411017Szelenkov@nginx.com            headers={
9421017Szelenkov@nginx.com                'X-Header': '2',
9431017Szelenkov@nginx.com                'Content-Type': 'text/html',
9441017Szelenkov@nginx.com                'Host': 'localhost',
9451018Szelenkov@nginx.com                'Connection': 'close',
9461017Szelenkov@nginx.com            }
9471017Szelenkov@nginx.com        )['headers']
948977Smax.romanov@gmail.com
9491596Szelenkov@nginx.com        assert headers['X-Set-Int'] == '1', 'set int header'
9501596Szelenkov@nginx.com        assert headers['X-Get-Int'] == '2', 'get int header'
951977Smax.romanov@gmail.com
952977Smax.romanov@gmail.com    def test_java_application_header_date(self):
953977Smax.romanov@gmail.com        self.load('header_date')
954977Smax.romanov@gmail.com
955977Smax.romanov@gmail.com        date = 'Fri, 15 Mar 2019 14:45:34 GMT'
956977Smax.romanov@gmail.com
9571017Szelenkov@nginx.com        headers = self.get(
9581017Szelenkov@nginx.com            headers={
9591017Szelenkov@nginx.com                'X-Header': date,
9601017Szelenkov@nginx.com                'Content-Type': 'text/html',
9611017Szelenkov@nginx.com                'Host': 'localhost',
9621018Szelenkov@nginx.com                'Connection': 'close',
9631017Szelenkov@nginx.com            }
9641017Szelenkov@nginx.com        )['headers']
965977Smax.romanov@gmail.com
9661596Szelenkov@nginx.com        assert (
9671596Szelenkov@nginx.com            headers['X-Set-Date'] == 'Thu, 01 Jan 1970 00:00:01 GMT'
9681596Szelenkov@nginx.com        ), 'set date header'
9691596Szelenkov@nginx.com        assert headers['X-Get-Date'] == date, 'get date header'
970977Smax.romanov@gmail.com
9711654Szelenkov@nginx.com    def test_java_application_multipart(self, temp_dir):
9721117Szelenkov@nginx.com        self.load('multipart')
9731117Szelenkov@nginx.com
9741293St.nateldemoura@f5.com        reldst = '/uploads'
9751654Szelenkov@nginx.com        fulldst = temp_dir + reldst
9761293St.nateldemoura@f5.com        os.mkdir(fulldst)
9771596Szelenkov@nginx.com        public_dir(fulldst)
9781293St.nateldemoura@f5.com
9791355St.nateldemoura@f5.com        fields = {
9801355St.nateldemoura@f5.com            'file': {
9811355St.nateldemoura@f5.com                'filename': 'sample.txt',
9821355St.nateldemoura@f5.com                'type': 'text/plain',
9831355St.nateldemoura@f5.com                'data': io.StringIO('Data from sample file'),
9841355St.nateldemoura@f5.com            },
9851355St.nateldemoura@f5.com            'destination': fulldst,
9861355St.nateldemoura@f5.com            'upload': 'Upload',
9871355St.nateldemoura@f5.com        }
9881355St.nateldemoura@f5.com
9891355St.nateldemoura@f5.com        encoded, content_type = self.multipart_encode(fields)
9901355St.nateldemoura@f5.com
9911355St.nateldemoura@f5.com        preamble = 'Preamble. Should be ignored.'
9921355St.nateldemoura@f5.com        epilogue = 'Epilogue. Should be ignored.'
9931355St.nateldemoura@f5.com        body = "%s\r\n%s\r\n%s" % (preamble, encoded.decode(), epilogue)
9941117Szelenkov@nginx.com
9951117Szelenkov@nginx.com        resp = self.post(
9961117Szelenkov@nginx.com            headers={
9971355St.nateldemoura@f5.com                'Content-Type': content_type,
9981117Szelenkov@nginx.com                'Host': 'localhost',
9991117Szelenkov@nginx.com                'Connection': 'close',
10001117Szelenkov@nginx.com            },
10011117Szelenkov@nginx.com            body=body,
10021117Szelenkov@nginx.com        )
10031117Szelenkov@nginx.com
10041596Szelenkov@nginx.com        assert resp['status'] == 200, 'multipart status'
10051596Szelenkov@nginx.com        assert re.search(
10061596Szelenkov@nginx.com            r'sample\.txt created', resp['body']
10071596Szelenkov@nginx.com        ), 'multipart body'
10081596Szelenkov@nginx.com        assert (
10091293St.nateldemoura@f5.com            self.search_in_log(
10101293St.nateldemoura@f5.com                r'^Data from sample file$', name=reldst + '/sample.txt'
10111596Szelenkov@nginx.com            )
10121596Szelenkov@nginx.com            is not None
10131596Szelenkov@nginx.com        ), 'file created'
10141685Smax.romanov@nginx.com
10151685Smax.romanov@nginx.com    def test_java_application_threads(self):
10161685Smax.romanov@nginx.com        self.load('threads')
10171685Smax.romanov@nginx.com
10181685Smax.romanov@nginx.com        assert 'success' in self.conf(
10191685Smax.romanov@nginx.com            '4', 'applications/threads/threads'
10201685Smax.romanov@nginx.com        ), 'configure 4 threads'
10211685Smax.romanov@nginx.com
10221685Smax.romanov@nginx.com        socks = []
10231685Smax.romanov@nginx.com
10241685Smax.romanov@nginx.com        for i in range(4):
10251685Smax.romanov@nginx.com            (_, sock) = self.get(
10261685Smax.romanov@nginx.com                headers={
10271685Smax.romanov@nginx.com                    'Host': 'localhost',
10281685Smax.romanov@nginx.com                    'X-Delay': '2',
10291685Smax.romanov@nginx.com                    'Connection': 'close',
10301685Smax.romanov@nginx.com                },
10311685Smax.romanov@nginx.com                no_recv=True,
10321685Smax.romanov@nginx.com                start=True,
10331685Smax.romanov@nginx.com            )
10341685Smax.romanov@nginx.com
10351685Smax.romanov@nginx.com            socks.append(sock)
10361685Smax.romanov@nginx.com
10371685Smax.romanov@nginx.com            time.sleep(0.25) # required to avoid greedy request reading
10381685Smax.romanov@nginx.com
10391685Smax.romanov@nginx.com        threads = set()
10401685Smax.romanov@nginx.com
10411685Smax.romanov@nginx.com        for sock in socks:
10421685Smax.romanov@nginx.com            resp = self.recvall(sock).decode('utf-8')
10431685Smax.romanov@nginx.com
10441685Smax.romanov@nginx.com            self.log_in(resp)
10451685Smax.romanov@nginx.com
10461685Smax.romanov@nginx.com            resp = self._resp_to_dict(resp)
10471685Smax.romanov@nginx.com
10481685Smax.romanov@nginx.com            assert resp['status'] == 200, 'status'
10491685Smax.romanov@nginx.com
10501685Smax.romanov@nginx.com            threads.add(resp['headers']['X-Thread'])
10511685Smax.romanov@nginx.com
10521685Smax.romanov@nginx.com            sock.close()
10531685Smax.romanov@nginx.com
10541685Smax.romanov@nginx.com        assert len(socks) == len(threads), 'threads differs'
1055