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