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