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