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
|