xref: /unit/test/test_java_application.py (revision 1117:36151e7d24d6)
1import time
2import unittest
3from unit.applications.lang.java import TestApplicationJava
4
5
6class TestJavaApplication(TestApplicationJava):
7    prerequisites = ['java']
8
9    def test_java_conf_error(self):
10        self.skip_alerts.extend(
11            [
12                r'realpath.*failed',
13                r'failed to apply new conf',
14            ]
15        )
16        self.assertIn(
17            'error',
18            self.conf(
19                {
20                    "listeners": {"*:7080": {"pass": "applications/app"}},
21                    "applications": {
22                        "app": {
23                            "type": "java",
24                            "processes": 1,
25                            "working_directory": self.current_dir
26                            + "/java/empty",
27                            "webapp": self.testdir + "/java",
28                            "unit_jars": self.testdir + "/no_such_dir",
29                        }
30                    },
31                }
32            ),
33            'conf error',
34        )
35
36    def test_java_war(self):
37        self.load('empty_war')
38
39        self.assertIn(
40            'success',
41            self.conf(
42                '"' + self.testdir + '/java/empty.war"',
43                '/config/applications/empty_war/webapp',
44            ),
45            'configure war',
46        )
47
48        self.assertEqual(self.get()['status'], 200, 'war')
49
50    def test_java_application_cookies(self):
51        self.load('cookies')
52
53        headers = self.get(
54            headers={
55                'Cookie': 'var1=val1; var2=val2',
56                'Host': 'localhost',
57                'Connection': 'close',
58            }
59        )['headers']
60
61        self.assertEqual(headers['X-Cookie-1'], 'val1', 'cookie 1')
62        self.assertEqual(headers['X-Cookie-2'], 'val2', 'cookie 2')
63
64    def test_java_application_filter(self):
65        self.load('filter')
66
67        headers = self.get()['headers']
68
69        self.assertEqual(headers['X-Filter-Before'], '1', 'filter before')
70        self.assertEqual(headers['X-Filter-After'], '1', 'filter after')
71
72        self.assertEqual(
73            self.get(url='/test')['headers']['X-Filter-After'],
74            '0',
75            'filter after 2',
76        )
77
78    def test_java_application_get_variables(self):
79        self.load('get_params')
80
81        headers = self.get(url='/?var1=val1&var2=&var4=val4&var4=foo')[
82            'headers'
83        ]
84
85        self.assertEqual(headers['X-Var-1'], 'val1', 'GET variables')
86        self.assertEqual(headers['X-Var-2'], 'true', 'GET variables 2')
87        self.assertEqual(headers['X-Var-3'], 'false', 'GET variables 3')
88
89        self.assertEqual(
90            headers['X-Param-Names'], 'var4 var2 var1 ', 'getParameterNames'
91        )
92        self.assertEqual(
93            headers['X-Param-Values'], 'val4 foo ', 'getParameterValues'
94        )
95        self.assertEqual(
96            headers['X-Param-Map'],
97            'var2= var1=val1 var4=val4,foo ',
98            'getParameterMap',
99        )
100
101    def test_java_application_post_variables(self):
102        self.load('post_params')
103
104        headers = self.post(
105            headers={
106                'Content-Type': 'application/x-www-form-urlencoded',
107                'Host': 'localhost',
108                'Connection': 'close',
109            },
110            body='var1=val1&var2=',
111        )['headers']
112
113        self.assertEqual(headers['X-Var-1'], 'val1', 'POST variables')
114        self.assertEqual(headers['X-Var-2'], 'true', 'POST variables 2')
115        self.assertEqual(headers['X-Var-3'], 'false', 'POST variables 3')
116
117    def test_java_application_session(self):
118        self.load('session')
119
120        headers = self.get(url='/?var1=val1')['headers']
121        session_id = headers['X-Session-Id']
122
123        self.assertEqual(headers['X-Var-1'], 'null', 'variable empty')
124        self.assertEqual(headers['X-Session-New'], 'true', 'session create')
125
126        headers = self.get(
127            headers={
128                'Host': 'localhost',
129                'Cookie': 'JSESSIONID=' + session_id,
130                'Connection': 'close',
131            },
132            url='/?var1=val2',
133        )['headers']
134
135        self.assertEqual(headers['X-Var-1'], 'val1', 'variable')
136        self.assertEqual(headers['X-Session-New'], 'false', 'session resume')
137        self.assertEqual(
138            session_id, headers['X-Session-Id'], 'session same id'
139        )
140
141    def test_java_application_session_active(self):
142        self.load('session_inactive')
143
144        resp = self.get(headers={
145            'X-Interval': '4',
146            'Host': 'localhost',
147            'Connection': 'close',
148        })
149        session_id = resp['headers']['X-Session-Id']
150
151        self.assertEqual(resp['status'], 200, 'session init')
152        self.assertEqual(
153            resp['headers']['X-Session-Interval'], '4', 'session interval'
154        )
155        self.assertLess(
156            abs(
157                self.date_to_sec_epoch(
158                    resp['headers']['X-Session-Last-Access-Time']
159                )
160                - self.sec_epoch()
161            ),
162            5,
163            'session last access time',
164        )
165
166        time.sleep(1)
167
168        resp = self.get(
169            headers={
170                'Host': 'localhost',
171                'Cookie': 'JSESSIONID=' + session_id,
172                'Connection': 'close',
173            }
174        )
175
176        self.assertEqual(
177            resp['headers']['X-Session-Id'], session_id, 'session active'
178        )
179
180        session_id = resp['headers']['X-Session-Id']
181
182        time.sleep(1)
183
184        resp = self.get(
185            headers={
186                'Host': 'localhost',
187                'Cookie': 'JSESSIONID=' + session_id,
188                'Connection': 'close',
189            }
190        )
191
192        self.assertEqual(
193            resp['headers']['X-Session-Id'], session_id, 'session active 2'
194        )
195
196        time.sleep(2)
197
198        resp = self.get(
199            headers={
200                'Host': 'localhost',
201                'Cookie': 'JSESSIONID=' + session_id,
202                'Connection': 'close',
203            }
204        )
205
206        self.assertEqual(
207            resp['headers']['X-Session-Id'], session_id, 'session active 3'
208        )
209
210    def test_java_application_session_inactive(self):
211        self.load('session_inactive')
212
213        resp = self.get(headers={
214            'X-Interval': '1',
215            'Host': 'localhost',
216            'Connection': 'close',
217        })
218        session_id = resp['headers']['X-Session-Id']
219
220        time.sleep(3)
221
222        resp = self.get(
223            headers={
224                'Host': 'localhost',
225                'Cookie': 'JSESSIONID=' + session_id,
226                'Connection': 'close',
227            }
228        )
229
230        self.assertNotEqual(
231            resp['headers']['X-Session-Id'], session_id, 'session inactive'
232        )
233
234    def test_java_application_session_invalidate(self):
235        self.load('session_invalidate')
236
237        resp = self.get()
238        session_id = resp['headers']['X-Session-Id']
239
240        resp = self.get(
241            headers={
242                'Host': 'localhost',
243                'Cookie': 'JSESSIONID=' + session_id,
244                'Connection': 'close',
245            }
246        )
247
248        self.assertNotEqual(
249            resp['headers']['X-Session-Id'], session_id, 'session invalidate'
250        )
251
252    def test_java_application_session_listeners(self):
253        self.load('session_listeners')
254
255        headers = self.get(url='/test?var1=val1')['headers']
256        session_id = headers['X-Session-Id']
257
258        self.assertEqual(
259            headers['X-Session-Created'], session_id, 'session create'
260        )
261        self.assertEqual(headers['X-Attr-Added'], 'var1=val1', 'attribute add')
262
263        headers = self.get(
264            headers={
265                'Host': 'localhost',
266                'Cookie': 'JSESSIONID=' + session_id,
267                'Connection': 'close',
268            },
269            url='/?var1=val2',
270        )['headers']
271
272        self.assertEqual(
273            session_id, headers['X-Session-Id'], 'session same id'
274        )
275        self.assertEqual(
276            headers['X-Attr-Replaced'], 'var1=val1', 'attribute replace'
277        )
278
279        headers = self.get(
280            headers={
281                'Host': 'localhost',
282                'Cookie': 'JSESSIONID=' + session_id,
283                'Connection': 'close',
284            },
285            url='/',
286        )['headers']
287
288        self.assertEqual(
289            session_id, headers['X-Session-Id'], 'session same id'
290        )
291        self.assertEqual(
292            headers['X-Attr-Removed'], 'var1=val2', 'attribute remove'
293        )
294
295    def test_java_application_jsp(self):
296        self.load('jsp')
297
298        headers = self.get(url='/index.jsp')['headers']
299
300        self.assertEqual(headers['X-Unit-JSP'], 'ok', 'JSP Ok header')
301
302    def test_java_application_url_pattern(self):
303        self.load('url_pattern')
304
305        headers = self.get(url='/foo/bar/index.html')['headers']
306
307        self.assertEqual(headers['X-Id'], 'servlet1', '#1 Servlet1 request')
308        self.assertEqual(
309            headers['X-Request-URI'], '/foo/bar/index.html', '#1 request URI'
310        )
311        self.assertEqual(
312            headers['X-Servlet-Path'], '/foo/bar', '#1 servlet path'
313        )
314        self.assertEqual(headers['X-Path-Info'], '/index.html', '#1 path info')
315
316        headers = self.get(url='/foo/bar/index.bop')['headers']
317
318        self.assertEqual(headers['X-Id'], 'servlet1', '#2 Servlet1 request')
319        self.assertEqual(
320            headers['X-Request-URI'], '/foo/bar/index.bop', '#2 request URI'
321        )
322        self.assertEqual(
323            headers['X-Servlet-Path'], '/foo/bar', '#2 servlet path'
324        )
325        self.assertEqual(headers['X-Path-Info'], '/index.bop', '#2 path info')
326
327        headers = self.get(url='/baz')['headers']
328
329        self.assertEqual(headers['X-Id'], 'servlet2', '#3 Servlet2 request')
330        self.assertEqual(headers['X-Request-URI'], '/baz', '#3 request URI')
331        self.assertEqual(headers['X-Servlet-Path'], '/baz', '#3 servlet path')
332        self.assertEqual(headers['X-Path-Info'], 'null', '#3 path info')
333
334        headers = self.get(url='/baz/index.html')['headers']
335
336        self.assertEqual(headers['X-Id'], 'servlet2', '#4 Servlet2 request')
337        self.assertEqual(
338            headers['X-Request-URI'], '/baz/index.html', '#4 request URI'
339        )
340        self.assertEqual(headers['X-Servlet-Path'], '/baz', '#4 servlet path')
341        self.assertEqual(headers['X-Path-Info'], '/index.html', '#4 path info')
342
343        headers = self.get(url='/catalog')['headers']
344
345        self.assertEqual(headers['X-Id'], 'servlet3', '#5 Servlet3 request')
346        self.assertEqual(
347            headers['X-Request-URI'], '/catalog', '#5 request URI'
348        )
349        self.assertEqual(
350            headers['X-Servlet-Path'], '/catalog', '#5 servlet path'
351        )
352        self.assertEqual(headers['X-Path-Info'], 'null', '#5 path info')
353
354        headers = self.get(url='/catalog/index.html')['headers']
355
356        self.assertEqual(headers['X-Id'], 'default', '#6 default request')
357        self.assertEqual(
358            headers['X-Request-URI'], '/catalog/index.html', '#6 request URI'
359        )
360        self.assertEqual(
361            headers['X-Servlet-Path'], '/catalog/index.html', '#6 servlet path'
362        )
363        self.assertEqual(headers['X-Path-Info'], 'null', '#6 path info')
364
365        headers = self.get(url='/catalog/racecar.bop')['headers']
366
367        self.assertEqual(headers['X-Id'], 'servlet4', '#7 servlet4 request')
368        self.assertEqual(
369            headers['X-Request-URI'], '/catalog/racecar.bop', '#7 request URI'
370        )
371        self.assertEqual(
372            headers['X-Servlet-Path'],
373            '/catalog/racecar.bop',
374            '#7 servlet path',
375        )
376        self.assertEqual(headers['X-Path-Info'], 'null', '#7 path info')
377
378        headers = self.get(url='/index.bop')['headers']
379
380        self.assertEqual(headers['X-Id'], 'servlet4', '#8 servlet4 request')
381        self.assertEqual(
382            headers['X-Request-URI'], '/index.bop', '#8 request URI'
383        )
384        self.assertEqual(
385            headers['X-Servlet-Path'], '/index.bop', '#8 servlet path'
386        )
387        self.assertEqual(headers['X-Path-Info'], 'null', '#8 path info')
388
389        headers = self.get(url='/foo/baz')['headers']
390
391        self.assertEqual(headers['X-Id'], 'servlet0', '#9 servlet0 request')
392        self.assertEqual(
393            headers['X-Request-URI'], '/foo/baz', '#9 request URI'
394        )
395        self.assertEqual(headers['X-Servlet-Path'], '/foo', '#9 servlet path')
396        self.assertEqual(headers['X-Path-Info'], '/baz', '#9 path info')
397
398        headers = self.get()['headers']
399
400        self.assertEqual(headers['X-Id'], 'default', '#10 default request')
401        self.assertEqual(headers['X-Request-URI'], '/', '#10 request URI')
402        self.assertEqual(headers['X-Servlet-Path'], '/', '#10 servlet path')
403        self.assertEqual(headers['X-Path-Info'], 'null', '#10 path info')
404
405        headers = self.get(url='/index.bop/')['headers']
406
407        self.assertEqual(headers['X-Id'], 'default', '#11 default request')
408        self.assertEqual(
409            headers['X-Request-URI'], '/index.bop/', '#11 request URI'
410        )
411        self.assertEqual(
412            headers['X-Servlet-Path'], '/index.bop/', '#11 servlet path'
413        )
414        self.assertEqual(headers['X-Path-Info'], 'null', '#11 path info')
415
416    def test_java_application_header(self):
417        self.load('header')
418
419        headers = self.get()['headers']
420
421        self.assertEqual(
422            headers['X-Set-Utf8-Value'], '????', 'set Utf8 header value'
423        )
424        self.assertEqual(
425            headers['X-Set-Utf8-Name-???'], 'x', 'set Utf8 header name'
426        )
427        self.assertEqual(
428            headers['X-Add-Utf8-Value'], '????', 'add Utf8 header value'
429        )
430        self.assertEqual(
431            headers['X-Add-Utf8-Name-???'], 'y', 'add Utf8 header name'
432        )
433        self.assertEqual(headers['X-Add-Test'], 'v1', 'add null header')
434        self.assertEqual('X-Set-Test1' in headers, False, 'set null header')
435        self.assertEqual(headers['X-Set-Test2'], '', 'set empty header')
436
437    def test_java_application_content_type(self):
438        self.load('content_type')
439
440        headers = self.get(url='/1')['headers']
441
442        self.assertEqual(
443            headers['Content-Type'],
444            'text/plain;charset=utf-8',
445            '#1 Content-Type header',
446        )
447        self.assertEqual(
448            headers['X-Content-Type'],
449            'text/plain;charset=utf-8',
450            '#1 response Content-Type',
451        )
452        self.assertEqual(
453            headers['X-Character-Encoding'], 'utf-8', '#1 response charset'
454        )
455
456        headers = self.get(url='/2')['headers']
457
458        self.assertEqual(
459            headers['Content-Type'],
460            'text/plain;charset=iso-8859-1',
461            '#2 Content-Type header',
462        )
463        self.assertEqual(
464            headers['X-Content-Type'],
465            'text/plain;charset=iso-8859-1',
466            '#2 response Content-Type',
467        )
468        self.assertEqual(
469            headers['X-Character-Encoding'],
470            'iso-8859-1',
471            '#2 response charset',
472        )
473
474        headers = self.get(url='/3')['headers']
475
476        self.assertEqual(
477            headers['Content-Type'],
478            'text/plain;charset=windows-1251',
479            '#3 Content-Type header',
480        )
481        self.assertEqual(
482            headers['X-Content-Type'],
483            'text/plain;charset=windows-1251',
484            '#3 response Content-Type',
485        )
486        self.assertEqual(
487            headers['X-Character-Encoding'],
488            'windows-1251',
489            '#3 response charset',
490        )
491
492        headers = self.get(url='/4')['headers']
493
494        self.assertEqual(
495            headers['Content-Type'],
496            'text/plain;charset=windows-1251',
497            '#4 Content-Type header',
498        )
499        self.assertEqual(
500            headers['X-Content-Type'],
501            'text/plain;charset=windows-1251',
502            '#4 response Content-Type',
503        )
504        self.assertEqual(
505            headers['X-Character-Encoding'],
506            'windows-1251',
507            '#4 response charset',
508        )
509
510        headers = self.get(url='/5')['headers']
511
512        self.assertEqual(
513            headers['Content-Type'],
514            'text/plain;charset=iso-8859-1',
515            '#5 Content-Type header',
516        )
517        self.assertEqual(
518            headers['X-Content-Type'],
519            'text/plain;charset=iso-8859-1',
520            '#5 response Content-Type',
521        )
522        self.assertEqual(
523            headers['X-Character-Encoding'],
524            'iso-8859-1',
525            '#5 response charset',
526        )
527
528        headers = self.get(url='/6')['headers']
529
530        self.assertEqual(
531            'Content-Type' in headers, False, '#6 no Content-Type header'
532        )
533        self.assertEqual(
534            'X-Content-Type' in headers, False, '#6 no response Content-Type'
535        )
536        self.assertEqual(
537            headers['X-Character-Encoding'], 'utf-8', '#6 response charset'
538        )
539
540        headers = self.get(url='/7')['headers']
541
542        self.assertEqual(
543            headers['Content-Type'],
544            'text/plain;charset=utf-8',
545            '#7 Content-Type header',
546        )
547        self.assertEqual(
548            headers['X-Content-Type'],
549            'text/plain;charset=utf-8',
550            '#7 response Content-Type',
551        )
552        self.assertEqual(
553            headers['X-Character-Encoding'], 'utf-8', '#7 response charset'
554        )
555
556        headers = self.get(url='/8')['headers']
557
558        self.assertEqual(
559            headers['Content-Type'],
560            'text/html;charset=utf-8',
561            '#8 Content-Type header',
562        )
563        self.assertEqual(
564            headers['X-Content-Type'],
565            'text/html;charset=utf-8',
566            '#8 response Content-Type',
567        )
568        self.assertEqual(
569            headers['X-Character-Encoding'], 'utf-8', '#8 response charset'
570        )
571
572    def test_java_application_welcome_files(self):
573        self.load('welcome_files')
574
575        headers = self.get()['headers']
576
577        resp = self.get(url='/dir1')
578
579        self.assertEqual(resp['status'], 302, 'dir redirect expected')
580
581        resp = self.get(url='/dir1/')
582
583        self.assertEqual(
584            'This is index.txt.' in resp['body'], True, 'dir1 index body'
585        )
586        self.assertEqual(
587            resp['headers']['X-TXT-Filter'], '1', 'TXT Filter header'
588        )
589
590        headers = self.get(url='/dir2/')['headers']
591
592        self.assertEqual(headers['X-Unit-JSP'], 'ok', 'JSP Ok header')
593        self.assertEqual(headers['X-JSP-Filter'], '1', 'JSP Filter header')
594
595        headers = self.get(url='/dir3/')['headers']
596
597        self.assertEqual(
598            headers['X-App-Servlet'], '1', 'URL pattern overrides welcome file'
599        )
600
601        headers = self.get(url='/dir4/')['headers']
602
603        self.assertEqual(
604            'X-App-Servlet' in headers,
605            False,
606            'Static welcome file served first',
607        )
608
609        headers = self.get(url='/dir5/')['headers']
610
611        self.assertEqual(
612            headers['X-App-Servlet'],
613            '1',
614            'Servlet for welcome file served when no static file found',
615        )
616
617    def test_java_application_request_listeners(self):
618        self.load('request_listeners')
619
620        headers = self.get(url='/test1')['headers']
621
622        self.assertEqual(
623            headers['X-Request-Initialized'],
624            '/test1',
625            'request initialized event',
626        )
627        self.assertEqual(
628            headers['X-Request-Destroyed'], '', 'request destroyed event'
629        )
630        self.assertEqual(headers['X-Attr-Added'], '', 'attribute added event')
631        self.assertEqual(
632            headers['X-Attr-Removed'], '', 'attribute removed event'
633        )
634        self.assertEqual(
635            headers['X-Attr-Replaced'], '', 'attribute replaced event'
636        )
637
638        headers = self.get(url='/test2?var1=1')['headers']
639
640        self.assertEqual(
641            headers['X-Request-Initialized'],
642            '/test2',
643            'request initialized event',
644        )
645        self.assertEqual(
646            headers['X-Request-Destroyed'], '/test1', 'request destroyed event'
647        )
648        self.assertEqual(
649            headers['X-Attr-Added'], 'var=1;', 'attribute added event'
650        )
651        self.assertEqual(
652            headers['X-Attr-Removed'], 'var=1;', 'attribute removed event'
653        )
654        self.assertEqual(
655            headers['X-Attr-Replaced'], '', 'attribute replaced event'
656        )
657
658        headers = self.get(url='/test3?var1=1&var2=2')['headers']
659
660        self.assertEqual(
661            headers['X-Request-Initialized'],
662            '/test3',
663            'request initialized event',
664        )
665        self.assertEqual(
666            headers['X-Request-Destroyed'], '/test2', 'request destroyed event'
667        )
668        self.assertEqual(
669            headers['X-Attr-Added'], 'var=1;', 'attribute added event'
670        )
671        self.assertEqual(
672            headers['X-Attr-Removed'], 'var=2;', 'attribute removed event'
673        )
674        self.assertEqual(
675            headers['X-Attr-Replaced'], 'var=1;', 'attribute replaced event'
676        )
677
678        headers = self.get(url='/test4?var1=1&var2=2&var3=3')['headers']
679
680        self.assertEqual(
681            headers['X-Request-Initialized'],
682            '/test4',
683            'request initialized event',
684        )
685        self.assertEqual(
686            headers['X-Request-Destroyed'], '/test3', 'request destroyed event'
687        )
688        self.assertEqual(
689            headers['X-Attr-Added'], 'var=1;', 'attribute added event'
690        )
691        self.assertEqual(
692            headers['X-Attr-Removed'], '', 'attribute removed event'
693        )
694        self.assertEqual(
695            headers['X-Attr-Replaced'],
696            'var=1;var=2;',
697            'attribute replaced event',
698        )
699
700    def test_java_application_request_uri_forward(self):
701        self.load('forward')
702
703        resp = self.get(
704            url='/fwd?uri=%2Fdata%2Ftest%3Furi%3Dnew_uri%26a%3D2%26b%3D3&a=1&c=4'
705        )
706        headers = resp['headers']
707
708        self.assertEqual(
709            headers['X-REQUEST-Id'], 'fwd', 'initial request servlet mapping'
710        )
711        self.assertEqual(
712            headers['X-Forward-To'],
713            '/data/test?uri=new_uri&a=2&b=3',
714            'forwarding triggered',
715        )
716        self.assertEqual(
717            headers['X-REQUEST-Param-uri'],
718            '/data/test?uri=new_uri&a=2&b=3',
719            'original uri parameter',
720        )
721        self.assertEqual(
722            headers['X-REQUEST-Param-a'], '1', 'original a parameter'
723        )
724        self.assertEqual(
725            headers['X-REQUEST-Param-c'], '4', 'original c parameter'
726        )
727
728        self.assertEqual(
729            headers['X-FORWARD-Id'], 'data', 'forward request servlet mapping'
730        )
731        self.assertEqual(
732            headers['X-FORWARD-Request-URI'],
733            '/data/test',
734            'forward request uri',
735        )
736        self.assertEqual(
737            headers['X-FORWARD-Servlet-Path'],
738            '/data',
739            'forward request servlet path',
740        )
741        self.assertEqual(
742            headers['X-FORWARD-Path-Info'],
743            '/test',
744            'forward request path info',
745        )
746        self.assertEqual(
747            headers['X-FORWARD-Query-String'],
748            'uri=new_uri&a=2&b=3',
749            'forward request query string',
750        )
751        self.assertEqual(
752            headers['X-FORWARD-Param-uri'],
753            'new_uri,/data/test?uri=new_uri&a=2&b=3',
754            'forward uri parameter',
755        )
756        self.assertEqual(
757            headers['X-FORWARD-Param-a'], '2,1', 'forward a parameter'
758        )
759        self.assertEqual(
760            headers['X-FORWARD-Param-b'], '3', 'forward b parameter'
761        )
762        self.assertEqual(
763            headers['X-FORWARD-Param-c'], '4', 'forward c parameter'
764        )
765
766        self.assertEqual(
767            headers['X-javax.servlet.forward.request_uri'],
768            '/fwd',
769            'original request uri',
770        )
771        self.assertEqual(
772            headers['X-javax.servlet.forward.context_path'],
773            '',
774            'original request context path',
775        )
776        self.assertEqual(
777            headers['X-javax.servlet.forward.servlet_path'],
778            '/fwd',
779            'original request servlet path',
780        )
781        self.assertEqual(
782            headers['X-javax.servlet.forward.path_info'],
783            'null',
784            'original request path info',
785        )
786        self.assertEqual(
787            headers['X-javax.servlet.forward.query_string'],
788            'uri=%2Fdata%2Ftest%3Furi%3Dnew_uri%26a%3D2%26b%3D3&a=1&c=4',
789            'original request query',
790        )
791
792        self.assertEqual(
793            'Before forwarding' in resp['body'],
794            False,
795            'discarded data added before forward() call',
796        )
797        self.assertEqual(
798            'X-After-Forwarding' in headers,
799            False,
800            'cannot add headers after forward() call',
801        )
802        self.assertEqual(
803            'After forwarding' in resp['body'],
804            False,
805            'cannot add data after forward() call',
806        )
807
808    def test_java_application_named_dispatcher_forward(self):
809        self.load('forward')
810
811        resp = self.get(url='/fwd?disp=name&uri=data')
812        headers = resp['headers']
813
814        self.assertEqual(
815            headers['X-REQUEST-Id'], 'fwd', 'initial request servlet mapping'
816        )
817        self.assertEqual(
818            headers['X-Forward-To'], 'data', 'forwarding triggered'
819        )
820
821        self.assertEqual(
822            headers['X-FORWARD-Id'], 'data', 'forward request servlet mapping'
823        )
824        self.assertEqual(
825            headers['X-FORWARD-Request-URI'], '/fwd', 'forward request uri'
826        )
827        self.assertEqual(
828            headers['X-FORWARD-Servlet-Path'],
829            '/fwd',
830            'forward request servlet path',
831        )
832        self.assertEqual(
833            headers['X-FORWARD-Path-Info'], 'null', 'forward request path info'
834        )
835        self.assertEqual(
836            headers['X-FORWARD-Query-String'],
837            'disp=name&uri=data',
838            'forward request query string',
839        )
840
841        self.assertEqual(
842            headers['X-javax.servlet.forward.request_uri'],
843            'null',
844            'original request uri',
845        )
846        self.assertEqual(
847            headers['X-javax.servlet.forward.context_path'],
848            'null',
849            'original request context path',
850        )
851        self.assertEqual(
852            headers['X-javax.servlet.forward.servlet_path'],
853            'null',
854            'original request servlet path',
855        )
856        self.assertEqual(
857            headers['X-javax.servlet.forward.path_info'],
858            'null',
859            'original request path info',
860        )
861        self.assertEqual(
862            headers['X-javax.servlet.forward.query_string'],
863            'null',
864            'original request query',
865        )
866
867        self.assertEqual(
868            'Before forwarding' in resp['body'],
869            False,
870            'discarded data added before forward() call',
871        )
872        self.assertEqual(
873            'X-After-Forwarding' in headers,
874            False,
875            'cannot add headers after forward() call',
876        )
877        self.assertEqual(
878            'After forwarding' in resp['body'],
879            False,
880            'cannot add data after forward() call',
881        )
882
883    def test_java_application_request_uri_include(self):
884        self.load('include')
885
886        resp = self.get(url='/inc?uri=/data/test')
887        headers = resp['headers']
888        body = resp['body']
889
890        self.assertEqual(
891            headers['X-REQUEST-Id'], 'inc', 'initial request servlet mapping'
892        )
893        self.assertEqual(
894            headers['X-Include'], '/data/test', 'including triggered'
895        )
896
897        self.assertEqual(
898            'X-INCLUDE-Id' in headers,
899            False,
900            'unable to add headers in include request',
901        )
902
903        self.assertEqual(
904            'javax.servlet.include.request_uri:  /data/test' in body,
905            True,
906            'include request uri',
907        )
908        #        self.assertEqual('javax.servlet.include.context_path: ' in body,
909        #            'include request context path')
910        self.assertEqual(
911            'javax.servlet.include.servlet_path: /data' in body,
912            True,
913            'include request servlet path',
914        )
915        self.assertEqual(
916            'javax.servlet.include.path_info:    /test' in body,
917            True,
918            'include request path info',
919        )
920        self.assertEqual(
921            'javax.servlet.include.query_string: null' in body,
922            True,
923            'include request query',
924        )
925
926        self.assertEqual(
927            'Before include' in body,
928            True,
929            'preserve data added before include() call',
930        )
931        self.assertEqual(
932            headers['X-After-Include'],
933            'you-should-see-this',
934            'add headers after include() call',
935        )
936        self.assertEqual(
937            'After include' in body, True, 'add data after include() call'
938        )
939
940    def test_java_application_named_dispatcher_include(self):
941        self.load('include')
942
943        resp = self.get(url='/inc?disp=name&uri=data')
944        headers = resp['headers']
945        body = resp['body']
946
947        self.assertEqual(
948            headers['X-REQUEST-Id'], 'inc', 'initial request servlet mapping'
949        )
950        self.assertEqual(headers['X-Include'], 'data', 'including triggered')
951
952        self.assertEqual(
953            'X-INCLUDE-Id' in headers,
954            False,
955            'unable to add headers in include request',
956        )
957
958        self.assertEqual(
959            'javax.servlet.include.request_uri:  null' in body,
960            True,
961            'include request uri',
962        )
963        #    self.assertEqual('javax.servlet.include.context_path: null' in body,
964        #        'include request context path')
965        self.assertEqual(
966            'javax.servlet.include.servlet_path: null' in body,
967            True,
968            'include request servlet path',
969        )
970        self.assertEqual(
971            'javax.servlet.include.path_info:    null' in body,
972            True,
973            'include request path info',
974        )
975        self.assertEqual(
976            'javax.servlet.include.query_string: null' in body,
977            True,
978            'include request query',
979        )
980
981        self.assertEqual(
982            'Before include' in body,
983            True,
984            'preserve data added before include() call',
985        )
986        self.assertEqual(
987            headers['X-After-Include'],
988            'you-should-see-this',
989            'add headers after include() call',
990        )
991        self.assertEqual(
992            'After include' in body, True, 'add data after include() call'
993        )
994
995    def test_java_application_path_translation(self):
996        self.load('path_translation')
997
998        headers = self.get(url='/pt/test?path=/')['headers']
999
1000        self.assertEqual(
1001            headers['X-Servlet-Path'], '/pt', 'matched servlet path'
1002        )
1003        self.assertEqual(
1004            headers['X-Path-Info'], '/test', 'the rest of the path'
1005        )
1006        self.assertEqual(
1007            headers['X-Path-Translated'],
1008            headers['X-Real-Path'] + headers['X-Path-Info'],
1009            'translated path is the app root + path info',
1010        )
1011        self.assertEqual(
1012            headers['X-Resource-Paths'].endswith('/WEB-INF/, /index.html]'),
1013            True,
1014            'app root directory content',
1015        )
1016        self.assertEqual(
1017            headers['X-Resource-As-Stream'],
1018            'null',
1019            'no resource stream for root path',
1020        )
1021
1022        headers = self.get(url='/test?path=/none')['headers']
1023
1024        self.assertEqual(
1025            headers['X-Servlet-Path'], '/test', 'matched whole path'
1026        )
1027        self.assertEqual(
1028            headers['X-Path-Info'],
1029            'null',
1030            'the rest of the path is null, whole path matched',
1031        )
1032        self.assertEqual(
1033            headers['X-Path-Translated'],
1034            'null',
1035            'translated path is null because path info is null',
1036        )
1037        self.assertEqual(
1038            headers['X-Real-Path'].endswith('/none'),
1039            True,
1040            'read path is not null',
1041        )
1042        self.assertEqual(
1043            headers['X-Resource-Paths'], 'null', 'no resource found'
1044        )
1045        self.assertEqual(
1046            headers['X-Resource-As-Stream'], 'null', 'no resource stream'
1047        )
1048
1049    def test_java_application_query_string(self):
1050        self.load('query_string')
1051
1052        self.assertEqual(
1053            self.get(url='/?a=b')['headers']['X-Query-String'],
1054            'a=b',
1055            'query string',
1056        )
1057
1058    def test_java_application_query_empty(self):
1059        self.load('query_string')
1060
1061        self.assertEqual(
1062            self.get(url='/?')['headers']['X-Query-String'],
1063            '',
1064            'query string empty',
1065        )
1066
1067    def test_java_application_query_absent(self):
1068        self.load('query_string')
1069
1070        self.assertEqual(
1071            self.get()['headers']['X-Query-String'],
1072            'null',
1073            'query string absent',
1074        )
1075
1076    def test_java_application_empty(self):
1077        self.load('empty')
1078
1079        self.assertEqual(self.get()['status'], 200, 'empty')
1080
1081    def test_java_application_keepalive_body(self):
1082        self.load('mirror')
1083
1084        self.assertEqual(self.post()['status'], 200, 'init')
1085
1086        (resp, sock) = self.post(
1087            headers={
1088                'Connection': 'keep-alive',
1089                'Content-Type': 'text/html',
1090                'Host': 'localhost',
1091            },
1092            start=True,
1093            body='0123456789' * 500,
1094            read_timeout=1,
1095        )
1096
1097        self.assertEqual(resp['body'], '0123456789' * 500, 'keep-alive 1')
1098
1099        resp = self.post(
1100            headers={
1101                'Connection': 'close',
1102                'Content-Type': 'text/html',
1103                'Host': 'localhost',
1104            },
1105            sock=sock,
1106            body='0123456789',
1107        )
1108
1109        self.assertEqual(resp['body'], '0123456789', 'keep-alive 2')
1110
1111    def test_java_application_http_10(self):
1112        self.load('empty')
1113
1114        self.assertEqual(self.get(http_10=True)['status'], 200, 'HTTP 1.0')
1115
1116    def test_java_application_no_method(self):
1117        self.load('empty')
1118
1119        self.assertEqual(self.post()['status'], 405, 'no method')
1120
1121    def test_java_application_get_header(self):
1122        self.load('get_header')
1123
1124        self.assertEqual(
1125            self.get(
1126                headers={
1127                    'X-Header': 'blah',
1128                    'Content-Type': 'text/html',
1129                    'Host': 'localhost',
1130                    'Connection': 'close',
1131                }
1132            )['headers']['X-Reply'],
1133            'blah',
1134            'get header',
1135        )
1136
1137    def test_java_application_get_header_empty(self):
1138        self.load('get_header')
1139
1140        self.assertNotIn('X-Reply', self.get()['headers'], 'get header empty')
1141
1142    def test_java_application_get_headers(self):
1143        self.load('get_headers')
1144
1145        headers = self.get(
1146            headers={
1147                'X-Header': ['blah', 'blah'],
1148                'Content-Type': 'text/html',
1149                'Host': 'localhost',
1150                'Connection': 'close',
1151            }
1152        )['headers']
1153
1154        self.assertEqual(headers['X-Reply-0'], 'blah', 'get headers')
1155        self.assertEqual(headers['X-Reply-1'], 'blah', 'get headers 2')
1156
1157    def test_java_application_get_headers_empty(self):
1158        self.load('get_headers')
1159
1160        self.assertNotIn(
1161            'X-Reply-0', self.get()['headers'], 'get headers empty'
1162        )
1163
1164    def test_java_application_get_header_names(self):
1165        self.load('get_header_names')
1166
1167        headers = self.get()['headers']
1168
1169        self.assertRegex(
1170            headers['X-Reply-0'], r'(?:Host|Connection)', 'get header names'
1171        )
1172        self.assertRegex(
1173            headers['X-Reply-1'], r'(?:Host|Connection)', 'get header names 2'
1174        )
1175        self.assertNotEqual(
1176            headers['X-Reply-0'],
1177            headers['X-Reply-1'],
1178            'get header names not equal',
1179        )
1180
1181    def test_java_application_header_int(self):
1182        self.load('header_int')
1183
1184        headers = self.get(
1185            headers={
1186                'X-Header': '2',
1187                'Content-Type': 'text/html',
1188                'Host': 'localhost',
1189                'Connection': 'close',
1190            }
1191        )['headers']
1192
1193        self.assertEqual(headers['X-Set-Int'], '1', 'set int header')
1194        self.assertEqual(headers['X-Get-Int'], '2', 'get int header')
1195
1196    def test_java_application_header_date(self):
1197        self.load('header_date')
1198
1199        date = 'Fri, 15 Mar 2019 14:45:34 GMT'
1200
1201        headers = self.get(
1202            headers={
1203                'X-Header': date,
1204                'Content-Type': 'text/html',
1205                'Host': 'localhost',
1206                'Connection': 'close',
1207            }
1208        )['headers']
1209
1210        self.assertEqual(
1211            headers['X-Set-Date'],
1212            'Thu, 01 Jan 1970 00:00:01 GMT',
1213            'set date header',
1214        )
1215        self.assertEqual(headers['X-Get-Date'], date, 'get date header')
1216
1217    @unittest.skip('not yet')
1218    def test_java_application_multipart(self):
1219        self.load('multipart')
1220
1221        body = """Preamble. Should be ignored.\r
1222\r
1223--12345\r
1224Content-Disposition: form-data; name="file"; filename="sample.txt"\r
1225Content-Type: text/plain\r
1226\r
1227Data from sample file\r
1228--12345\r
1229Content-Disposition: form-data; name="destination"\r
1230\r
1231%s\r
1232--12345\r
1233Content-Disposition: form-data; name="upload"\r
1234\r
1235Upload\r
1236--12345--\r
1237\r
1238Epilogue. Should be ignored.""" % self.testdir
1239
1240        resp = self.post(
1241            headers={
1242                'Content-Type': 'multipart/form-data; boundary=12345',
1243                'Host': 'localhost',
1244                'Connection': 'close',
1245            },
1246            body=body,
1247        )
1248
1249        self.assertEqual(resp['status'], 200, 'multipart status')
1250        self.assertRegex(resp['body'], r'sample\.txt created', 'multipart body')
1251        self.assertIsNotNone(
1252            self.search_in_log(r'^Data from sample file$', name='sample.txt'),
1253            'file created',
1254        )
1255
1256if __name__ == '__main__':
1257    TestJavaApplication.main()
1258