Mercurial Hosting > luan
comparison src/org/eclipse/jetty/http/HttpParser.java @ 1034:563458c4dc93
remove HttpGenerator.reset()
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Thu, 03 Nov 2016 21:02:59 -0600 |
| parents | 4ada7a8c128a |
| children | b87f97f6418a |
comparison
equal
deleted
inserted
replaced
| 1033:4ada7a8c128a | 1034:563458c4dc93 |
|---|---|
| 34 public final class HttpParser | 34 public final class HttpParser |
| 35 { | 35 { |
| 36 private static final Logger LOG = LoggerFactory.getLogger(HttpParser.class); | 36 private static final Logger LOG = LoggerFactory.getLogger(HttpParser.class); |
| 37 | 37 |
| 38 // States | 38 // States |
| 39 private static final int STATE_START=-14; | 39 private static final int STATE_START = -14; |
| 40 private static final int STATE_FIELD0=-13; | 40 private static final int STATE_FIELD0 = -13; |
| 41 private static final int STATE_SPACE1=-12; | 41 private static final int STATE_SPACE1 = -12; |
| 42 private static final int STATE_STATUS=-11; | 42 private static final int STATE_STATUS = -11; |
| 43 private static final int STATE_URI=-10; | 43 private static final int STATE_URI = -10; |
| 44 private static final int STATE_SPACE2=-9; | 44 private static final int STATE_SPACE2 = -9; |
| 45 private static final int STATE_END0=-8; | 45 private static final int STATE_FIELD2 = -6; |
| 46 private static final int STATE_END1=-7; | 46 private static final int STATE_HEADER = -5; |
| 47 private static final int STATE_FIELD2=-6; | 47 private static final int STATE_HEADER_NAME = -4; |
| 48 private static final int STATE_HEADER=-5; | 48 private static final int STATE_HEADER_IN_NAME = -3; |
| 49 private static final int STATE_HEADER_NAME=-4; | 49 private static final int STATE_HEADER_VALUE = -2; |
| 50 private static final int STATE_HEADER_IN_NAME=-3; | 50 private static final int STATE_HEADER_IN_VALUE = -1; |
| 51 private static final int STATE_HEADER_VALUE=-2; | 51 private static final int STATE_END = 0; |
| 52 private static final int STATE_HEADER_IN_VALUE=-1; | 52 private static final int STATE_EOF_CONTENT = 1; |
| 53 private static final int STATE_END=0; | 53 private static final int STATE_CONTENT = 2; |
| 54 private static final int STATE_EOF_CONTENT=1; | 54 private static final int STATE_CHUNKED_CONTENT = 3; |
| 55 private static final int STATE_CONTENT=2; | 55 private static final int STATE_CHUNK_SIZE = 4; |
| 56 private static final int STATE_CHUNKED_CONTENT=3; | 56 private static final int STATE_CHUNK_PARAMS = 5; |
| 57 private static final int STATE_CHUNK_SIZE=4; | 57 private static final int STATE_CHUNK = 6; |
| 58 private static final int STATE_CHUNK_PARAMS=5; | 58 private static final int STATE_SEEKING_EOF = 7; |
| 59 private static final int STATE_CHUNK=6; | |
| 60 private static final int STATE_SEEKING_EOF=7; | |
| 61 | 59 |
| 62 private final EventHandler _handler; | 60 private final EventHandler _handler; |
| 63 private final EndPoint _endp; | 61 private final EndPoint _endp; |
| 64 public final Buffer _header; // Buffer for header data (and small _content) | 62 public final Buffer _header; // Buffer for header data (and small _content) |
| 65 private final Buffer _body; // Buffer for large content | 63 private final Buffer _body; // Buffer for large content |
| 130 | 128 |
| 131 public void setPersistent(boolean persistent) | 129 public void setPersistent(boolean persistent) |
| 132 { | 130 { |
| 133 _persistent = persistent; | 131 _persistent = persistent; |
| 134 if (!_persistent &&(_state==STATE_END || _state==STATE_START)) | 132 if (!_persistent &&(_state==STATE_END || _state==STATE_START)) |
| 135 _state=STATE_SEEKING_EOF; | 133 _state = STATE_SEEKING_EOF; |
| 136 } | 134 } |
| 137 | 135 |
| 138 /* ------------------------------------------------------------------------------- */ | 136 /* ------------------------------------------------------------------------------- */ |
| 139 /** | 137 /** |
| 140 * Parse until END state. | 138 * Parse until END state. |
| 201 | 199 |
| 202 if (filled > 0 ) | 200 if (filled > 0 ) |
| 203 progress++; | 201 progress++; |
| 204 else if (filled < 0 ) | 202 else if (filled < 0 ) |
| 205 { | 203 { |
| 206 _persistent=false; | 204 _persistent = false; |
| 207 | 205 |
| 208 // do we have content to deliver? | 206 // do we have content to deliver? |
| 209 if (_state>STATE_END) | 207 if (_state>STATE_END) |
| 210 { | 208 { |
| 211 if (_buffer.length()>0 && !_headResponse) | 209 if (_buffer.length()>0 && !_headResponse) |
| 304 if (ch > HttpTokens.SPACE || ch<0) | 302 if (ch > HttpTokens.SPACE || ch<0) |
| 305 { | 303 { |
| 306 _buffer.mark(); | 304 _buffer.mark(); |
| 307 if (_responseStatus>=0) | 305 if (_responseStatus>=0) |
| 308 { | 306 { |
| 309 _state=STATE_STATUS; | 307 _state = STATE_STATUS; |
| 310 _responseStatus=ch-'0'; | 308 _responseStatus=ch-'0'; |
| 311 } | 309 } |
| 312 else | 310 else |
| 313 _state=STATE_URI; | 311 _state=STATE_URI; |
| 314 } | 312 } |
| 321 case STATE_STATUS: | 319 case STATE_STATUS: |
| 322 if (ch == HttpTokens.SPACE) | 320 if (ch == HttpTokens.SPACE) |
| 323 { | 321 { |
| 324 // _tok1.update(_buffer.markIndex(), _buffer.getIndex() - 1); | 322 // _tok1.update(_buffer.markIndex(), _buffer.getIndex() - 1); |
| 325 _tok1 = _buffer.toString(_buffer.markIndex(), _buffer.getIndex() - 1 - _buffer.markIndex()); | 323 _tok1 = _buffer.toString(_buffer.markIndex(), _buffer.getIndex() - 1 - _buffer.markIndex()); |
| 326 _state=STATE_SPACE2; | 324 _state = STATE_SPACE2; |
| 327 continue; | 325 continue; |
| 328 } | 326 } |
| 329 else if (ch>='0' && ch<='9') | 327 else if (ch>='0' && ch<='9') |
| 330 { | 328 { |
| 331 _responseStatus=_responseStatus*10+(ch-'0'); | 329 _responseStatus=_responseStatus*10+(ch-'0'); |
| 332 continue; | 330 continue; |
| 333 } | 331 } |
| 334 else if (ch < HttpTokens.SPACE && ch>=0) | 332 else if (ch < HttpTokens.SPACE && ch>=0) |
| 335 { | 333 { |
| 336 _eol=ch; | 334 _eol=ch; |
| 337 _state=STATE_HEADER; | 335 _state = STATE_HEADER; |
| 338 _tok0 = ""; | 336 _tok0 = ""; |
| 339 _tok1 = ""; | 337 _tok1 = ""; |
| 340 _multiLineValue=null; | 338 _multiLineValue=null; |
| 341 continue; | 339 continue; |
| 342 } | 340 } |
| 355 } | 353 } |
| 356 else if (ch < HttpTokens.SPACE && ch>=0) | 354 else if (ch < HttpTokens.SPACE && ch>=0) |
| 357 { | 355 { |
| 358 // HTTP/0.9 | 356 // HTTP/0.9 |
| 359 _handler.startRequest(_tok0, _buffer.sliceFromMark().toString(), null); | 357 _handler.startRequest(_tok0, _buffer.sliceFromMark().toString(), null); |
| 360 _persistent=false; | 358 _persistent = false; |
| 361 _state=STATE_SEEKING_EOF; | 359 _state = STATE_SEEKING_EOF; |
| 362 _handler.headerComplete(); | 360 _handler.headerComplete(); |
| 363 _handler.messageComplete(_contentPosition); | 361 _handler.messageComplete(_contentPosition); |
| 364 return 1; | 362 return 1; |
| 365 } | 363 } |
| 366 break; | 364 break; |
| 383 } | 381 } |
| 384 else | 382 else |
| 385 { | 383 { |
| 386 // HTTP/0.9 | 384 // HTTP/0.9 |
| 387 _handler.startRequest(_tok0, _tok1, null); | 385 _handler.startRequest(_tok0, _tok1, null); |
| 388 _persistent=false; | 386 _persistent = false; |
| 389 _state=STATE_SEEKING_EOF; | 387 _state = STATE_SEEKING_EOF; |
| 390 _handler.headerComplete(); | 388 _handler.headerComplete(); |
| 391 _handler.messageComplete(_contentPosition); | 389 _handler.messageComplete(_contentPosition); |
| 392 return 1; | 390 return 1; |
| 393 } | 391 } |
| 394 } | 392 } |
| 476 | 474 |
| 477 case HttpHeaders.CONNECTION_ORDINAL: | 475 case HttpHeaders.CONNECTION_ORDINAL: |
| 478 switch(HttpHeaderValues.CACHE.getOrdinal(value)) | 476 switch(HttpHeaderValues.CACHE.getOrdinal(value)) |
| 479 { | 477 { |
| 480 case HttpHeaderValues.CLOSE_ORDINAL: | 478 case HttpHeaderValues.CLOSE_ORDINAL: |
| 481 _persistent=false; | 479 _persistent = false; |
| 482 break; | 480 break; |
| 483 | 481 |
| 484 case HttpHeaderValues.KEEP_ALIVE_ORDINAL: | 482 case HttpHeaderValues.KEEP_ALIVE_ORDINAL: |
| 485 _persistent=true; | 483 _persistent = true; |
| 486 break; | 484 break; |
| 487 | 485 |
| 488 case -1: // No match, may be multi valued | 486 case -1: // No match, may be multi valued |
| 489 { | 487 { |
| 490 for (String v : value.split(",")) | 488 for (String v : value.split(",")) |
| 491 { | 489 { |
| 492 switch(HttpHeaderValues.CACHE.getOrdinal(v.trim())) | 490 switch(HttpHeaderValues.CACHE.getOrdinal(v.trim())) |
| 493 { | 491 { |
| 494 case HttpHeaderValues.CLOSE_ORDINAL: | 492 case HttpHeaderValues.CLOSE_ORDINAL: |
| 495 _persistent=false; | 493 _persistent = false; |
| 496 break; | 494 break; |
| 497 | 495 |
| 498 case HttpHeaderValues.KEEP_ALIVE_ORDINAL: | 496 case HttpHeaderValues.KEEP_ALIVE_ORDINAL: |
| 499 _persistent=true; | 497 _persistent = true; |
| 500 break; | 498 break; |
| 501 } | 499 } |
| 502 } | 500 } |
| 503 break; | 501 break; |
| 504 } | 502 } |
| 553 _handler.headerComplete(); // May recurse here ! | 551 _handler.headerComplete(); // May recurse here ! |
| 554 break; | 552 break; |
| 555 | 553 |
| 556 case HttpTokens.NO_CONTENT: | 554 case HttpTokens.NO_CONTENT: |
| 557 _handler.headerComplete(); | 555 _handler.headerComplete(); |
| 558 _state=_persistent||(_responseStatus>=100&&_responseStatus<200)?STATE_END:STATE_SEEKING_EOF; | 556 _state = _persistent||(_responseStatus>=100&&_responseStatus<200)?STATE_END:STATE_SEEKING_EOF; |
| 559 _handler.messageComplete(_contentPosition); | 557 _handler.messageComplete(_contentPosition); |
| 560 return 1; | 558 return 1; |
| 561 | 559 |
| 562 default: | 560 default: |
| 563 _state=STATE_CONTENT; | 561 _state=STATE_CONTENT; |
| 617 { | 615 { |
| 618 _cached = null; | 616 _cached = null; |
| 619 if (_length == -1) | 617 if (_length == -1) |
| 620 _buffer.mark(); | 618 _buffer.mark(); |
| 621 _length=_buffer.getIndex() - _buffer.markIndex(); | 619 _length=_buffer.getIndex() - _buffer.markIndex(); |
| 622 _state=STATE_HEADER_IN_NAME; | 620 _state = STATE_HEADER_IN_NAME; |
| 623 } | 621 } |
| 624 } | 622 } |
| 625 | 623 |
| 626 break; | 624 break; |
| 627 | 625 |
| 683 default: | 681 default: |
| 684 { | 682 { |
| 685 if (_length == -1) | 683 if (_length == -1) |
| 686 _buffer.mark(); | 684 _buffer.mark(); |
| 687 _length=_buffer.getIndex() - _buffer.markIndex(); | 685 _length=_buffer.getIndex() - _buffer.markIndex(); |
| 688 _state=STATE_HEADER_IN_VALUE; | 686 _state = STATE_HEADER_IN_VALUE; |
| 689 } | 687 } |
| 690 } | 688 } |
| 691 break; | 689 break; |
| 692 | 690 |
| 693 case STATE_HEADER_IN_VALUE: | 691 case STATE_HEADER_IN_VALUE: |
| 726 // ========================== | 724 // ========================== |
| 727 | 725 |
| 728 // Handle HEAD response | 726 // Handle HEAD response |
| 729 if (_responseStatus>0 && _headResponse) | 727 if (_responseStatus>0 && _headResponse) |
| 730 { | 728 { |
| 731 _state=_persistent||(_responseStatus>=100&&_responseStatus<200)?STATE_END:STATE_SEEKING_EOF; | 729 _state = _persistent||(_responseStatus>=100&&_responseStatus<200)?STATE_END:STATE_SEEKING_EOF; |
| 732 _handler.messageComplete(_contentLength); | 730 _handler.messageComplete(_contentLength); |
| 733 } | 731 } |
| 734 | 732 |
| 735 | 733 |
| 736 // ========================== | 734 // ========================== |
| 767 case STATE_CONTENT: | 765 case STATE_CONTENT: |
| 768 { | 766 { |
| 769 long remaining=_contentLength - _contentPosition; | 767 long remaining=_contentLength - _contentPosition; |
| 770 if (remaining == 0) | 768 if (remaining == 0) |
| 771 { | 769 { |
| 772 _state=_persistent?STATE_END:STATE_SEEKING_EOF; | 770 _state = _persistent?STATE_END:STATE_SEEKING_EOF; |
| 773 _handler.messageComplete(_contentPosition); | 771 _handler.messageComplete(_contentPosition); |
| 774 return 1; | 772 return 1; |
| 775 } | 773 } |
| 776 | 774 |
| 777 if (length > remaining) | 775 if (length > remaining) |
| 786 _contentView.update(chunk); | 784 _contentView.update(chunk); |
| 787 _handler.content(chunk); // May recurse here | 785 _handler.content(chunk); // May recurse here |
| 788 | 786 |
| 789 if(_contentPosition == _contentLength) | 787 if(_contentPosition == _contentLength) |
| 790 { | 788 { |
| 791 _state=_persistent?STATE_END:STATE_SEEKING_EOF; | 789 _state = _persistent?STATE_END:STATE_SEEKING_EOF; |
| 792 _handler.messageComplete(_contentPosition); | 790 _handler.messageComplete(_contentPosition); |
| 793 } | 791 } |
| 794 // TODO adjust the _buffer to keep unconsumed content | 792 // TODO adjust the _buffer to keep unconsumed content |
| 795 return 1; | 793 return 1; |
| 796 } | 794 } |
| 804 _buffer.get(); | 802 _buffer.get(); |
| 805 else | 803 else |
| 806 { | 804 { |
| 807 _chunkLength=0; | 805 _chunkLength=0; |
| 808 _chunkPosition=0; | 806 _chunkPosition=0; |
| 809 _state=STATE_CHUNK_SIZE; | 807 _state = STATE_CHUNK_SIZE; |
| 810 } | 808 } |
| 811 break; | 809 break; |
| 812 } | 810 } |
| 813 | 811 |
| 814 case STATE_CHUNK_SIZE: | 812 case STATE_CHUNK_SIZE: |
| 820 | 818 |
| 821 if (_chunkLength == 0) | 819 if (_chunkLength == 0) |
| 822 { | 820 { |
| 823 if (_eol==HttpTokens.CARRIAGE_RETURN && _buffer.hasContent() && _buffer.peek()==HttpTokens.LINE_FEED) | 821 if (_eol==HttpTokens.CARRIAGE_RETURN && _buffer.hasContent() && _buffer.peek()==HttpTokens.LINE_FEED) |
| 824 _eol=_buffer.get(); | 822 _eol=_buffer.get(); |
| 825 _state=_persistent?STATE_END:STATE_SEEKING_EOF; | 823 _state = _persistent?STATE_END:STATE_SEEKING_EOF; |
| 826 _handler.messageComplete(_contentPosition); | 824 _handler.messageComplete(_contentPosition); |
| 827 return 1; | 825 return 1; |
| 828 } | 826 } |
| 829 else | 827 else |
| 830 _state=STATE_CHUNK; | 828 _state = STATE_CHUNK; |
| 831 } | 829 } |
| 832 else if (ch <= HttpTokens.SPACE || ch == HttpTokens.SEMI_COLON) | 830 else if (ch <= HttpTokens.SPACE || ch == HttpTokens.SEMI_COLON) |
| 833 _state=STATE_CHUNK_PARAMS; | 831 _state=STATE_CHUNK_PARAMS; |
| 834 else if (ch >= '0' && ch <= '9') | 832 else if (ch >= '0' && ch <= '9') |
| 835 _chunkLength=_chunkLength * 16 + (ch - '0'); | 833 _chunkLength=_chunkLength * 16 + (ch - '0'); |
| 850 _eol=ch; | 848 _eol=ch; |
| 851 if (_chunkLength == 0) | 849 if (_chunkLength == 0) |
| 852 { | 850 { |
| 853 if (_eol==HttpTokens.CARRIAGE_RETURN && _buffer.hasContent() && _buffer.peek()==HttpTokens.LINE_FEED) | 851 if (_eol==HttpTokens.CARRIAGE_RETURN && _buffer.hasContent() && _buffer.peek()==HttpTokens.LINE_FEED) |
| 854 _eol=_buffer.get(); | 852 _eol=_buffer.get(); |
| 855 _state=_persistent?STATE_END:STATE_SEEKING_EOF; | 853 _state = _persistent?STATE_END:STATE_SEEKING_EOF; |
| 856 _handler.messageComplete(_contentPosition); | 854 _handler.messageComplete(_contentPosition); |
| 857 return 1; | 855 return 1; |
| 858 } | 856 } |
| 859 else | 857 else |
| 860 _state=STATE_CHUNK; | 858 _state=STATE_CHUNK; |
| 884 case STATE_SEEKING_EOF: | 882 case STATE_SEEKING_EOF: |
| 885 { | 883 { |
| 886 // Close if there is more data than CRLF | 884 // Close if there is more data than CRLF |
| 887 if (_buffer.length()>2) | 885 if (_buffer.length()>2) |
| 888 { | 886 { |
| 889 _state=STATE_END; | 887 _state = STATE_END; |
| 890 _endp.close(); | 888 _endp.close(); |
| 891 } | 889 } |
| 892 else | 890 else |
| 893 { | 891 { |
| 894 // or if the data is not white space | 892 // or if the data is not white space |
| 911 | 909 |
| 912 return progress; | 910 return progress; |
| 913 } | 911 } |
| 914 catch(HttpException e) | 912 catch(HttpException e) |
| 915 { | 913 { |
| 916 _persistent=false; | 914 _persistent = false; |
| 917 _state=STATE_SEEKING_EOF; | 915 _state = STATE_SEEKING_EOF; |
| 918 throw e; | 916 throw e; |
| 919 } | 917 } |
| 920 } | 918 } |
| 921 | 919 |
| 922 /* ------------------------------------------------------------------------------- */ | 920 /* ------------------------------------------------------------------------------- */ |
