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