Mercurial Hosting > luan
comparison src/org/eclipse/jetty/http/HttpParser.java @ 1019:f126d30e04a4
start replacing BufferCache with StringCache
| author | Franklin Schmidt <fschmidt@gmail.com> |
|---|---|
| date | Mon, 31 Oct 2016 03:33:42 -0600 |
| parents | d2c3ff33387c |
| children | 6be43ef1eb96 |
comparison
equal
deleted
inserted
replaced
| 1018:4dc1e1a18661 | 1019:f126d30e04a4 |
|---|---|
| 65 private final EndPoint _endp; | 65 private final EndPoint _endp; |
| 66 private Buffer _header; // Buffer for header data (and small _content) | 66 private Buffer _header; // Buffer for header data (and small _content) |
| 67 private Buffer _body; // Buffer for large content | 67 private Buffer _body; // Buffer for large content |
| 68 private Buffer _buffer; // The current buffer in use (either _header or _content) | 68 private Buffer _buffer; // The current buffer in use (either _header or _content) |
| 69 private CachedBuffer _cached; | 69 private CachedBuffer _cached; |
| 70 private final View.CaseInsensitive _tok0 = new View.CaseInsensitive(); // Saved token: header name, request method or response version | 70 private String _tok0; // Saved token: header name, request method or response version |
| 71 private final View.CaseInsensitive _tok1 = new View.CaseInsensitive(); // Saved token: header value, request URI or response code | 71 private final View.CaseInsensitive _tok1 = new View.CaseInsensitive(); // Saved token: header value, request URI or response code |
| 72 private String _multiLineValue; | 72 private String _multiLineValue; |
| 73 private int _responseStatus; // If >0 then we are parsing a response | 73 private int _responseStatus; // If >0 then we are parsing a response |
| 74 private boolean _persistent; | 74 private boolean _persistent; |
| 75 | 75 |
| 170 | 170 |
| 171 if (_state == STATE_END) | 171 if (_state == STATE_END) |
| 172 return 0; | 172 return 0; |
| 173 | 173 |
| 174 if (_buffer==null) | 174 if (_buffer==null) |
| 175 _buffer=getHeaderBuffer(); | 175 _buffer = getHeaderBuffer(); |
| 176 | 176 |
| 177 | 177 |
| 178 if (_state == STATE_CONTENT && _contentPosition == _contentLength) | 178 if (_state == STATE_CONTENT && _contentPosition == _contentLength) |
| 179 { | 179 { |
| 180 _state=STATE_END; | 180 _state=STATE_END; |
| 288 break; | 288 break; |
| 289 | 289 |
| 290 case STATE_FIELD0: | 290 case STATE_FIELD0: |
| 291 if (ch == HttpTokens.SPACE) | 291 if (ch == HttpTokens.SPACE) |
| 292 { | 292 { |
| 293 _tok0.update(_buffer.markIndex(), _buffer.getIndex() - 1); | 293 //System.out.println("qqqqqqqqqqqqqqqq a "+_tok0); |
| 294 _responseStatus = HttpVersions.CACHE.get(_tok0)==null?-1:0; | 294 // _tok0.update(_buffer.markIndex(), _buffer.getIndex() - 1); |
| 295 _tok0 = _buffer.peek(_buffer.markIndex(), _buffer.getIndex() - 1 - _buffer.markIndex()).toString(); | |
| 296 //System.out.println("qqqqqqqqqqqqqqqq b "+_tok0); | |
| 297 _responseStatus = !HttpVersions.CACHE.contains(_tok0)?-1:0; | |
| 295 _state=STATE_SPACE1; | 298 _state=STATE_SPACE1; |
| 296 continue; | 299 continue; |
| 297 } | 300 } |
| 298 else if (ch < HttpTokens.SPACE && ch>=0) | 301 else if (ch < HttpTokens.SPACE && ch>=0) |
| 299 { | 302 { |
| 333 } | 336 } |
| 334 else if (ch < HttpTokens.SPACE && ch>=0) | 337 else if (ch < HttpTokens.SPACE && ch>=0) |
| 335 { | 338 { |
| 336 _eol=ch; | 339 _eol=ch; |
| 337 _state=STATE_HEADER; | 340 _state=STATE_HEADER; |
| 338 _tok0.setPutIndex(_tok0.getIndex()); | 341 // _tok0.setPutIndex(_tok0.getIndex()); |
| 342 _tok0 = ""; | |
| 339 _tok1.setPutIndex(_tok1.getIndex()); | 343 _tok1.setPutIndex(_tok1.getIndex()); |
| 340 _multiLineValue=null; | 344 _multiLineValue=null; |
| 341 continue; | 345 continue; |
| 342 } | 346 } |
| 343 // not a digit, so must be a URI | 347 // not a digit, so must be a URI |
| 353 continue; | 357 continue; |
| 354 } | 358 } |
| 355 else if (ch < HttpTokens.SPACE && ch>=0) | 359 else if (ch < HttpTokens.SPACE && ch>=0) |
| 356 { | 360 { |
| 357 // HTTP/0.9 | 361 // HTTP/0.9 |
| 358 _handler.startRequest(HttpMethods.CACHE.lookup(_tok0), _buffer.sliceFromMark(), null); | 362 _handler.startRequest(_tok0, _buffer.sliceFromMark(), null); |
| 359 _persistent=false; | 363 _persistent=false; |
| 360 _state=STATE_SEEKING_EOF; | 364 _state=STATE_SEEKING_EOF; |
| 361 _handler.headerComplete(); | 365 _handler.headerComplete(); |
| 362 _handler.messageComplete(_contentPosition); | 366 _handler.messageComplete(_contentPosition); |
| 363 return 1; | 367 return 1; |
| 374 { | 378 { |
| 375 if (_responseStatus>0) | 379 if (_responseStatus>0) |
| 376 { | 380 { |
| 377 _eol=ch; | 381 _eol=ch; |
| 378 _state=STATE_HEADER; | 382 _state=STATE_HEADER; |
| 379 _tok0.setPutIndex(_tok0.getIndex()); | 383 // _tok0.setPutIndex(_tok0.getIndex()); |
| 384 _tok0 = ""; | |
| 380 _tok1.setPutIndex(_tok1.getIndex()); | 385 _tok1.setPutIndex(_tok1.getIndex()); |
| 381 _multiLineValue=null; | 386 _multiLineValue=null; |
| 382 } | 387 } |
| 383 else | 388 else |
| 384 { | 389 { |
| 385 // HTTP/0.9 | 390 // HTTP/0.9 |
| 386 _handler.startRequest(HttpMethods.CACHE.lookup(_tok0), _tok1, null); | 391 _handler.startRequest(_tok0, _tok1, null); |
| 387 _persistent=false; | 392 _persistent=false; |
| 388 _state=STATE_SEEKING_EOF; | 393 _state=STATE_SEEKING_EOF; |
| 389 _handler.headerComplete(); | 394 _handler.headerComplete(); |
| 390 _handler.messageComplete(_contentPosition); | 395 _handler.messageComplete(_contentPosition); |
| 391 return 1; | 396 return 1; |
| 394 break; | 399 break; |
| 395 | 400 |
| 396 case STATE_FIELD2: | 401 case STATE_FIELD2: |
| 397 if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED) | 402 if (ch == HttpTokens.CARRIAGE_RETURN || ch == HttpTokens.LINE_FEED) |
| 398 { | 403 { |
| 399 Buffer version; | 404 String version; |
| 400 if (_responseStatus>0) | 405 if (_responseStatus > 0) |
| 401 // _handler.startResponse(version=HttpVersions.CACHE.lookup(_tok0), _responseStatus,_buffer.sliceFromMark()); | 406 // _handler.startResponse(version=HttpVersions.CACHE.lookup(_tok0), _responseStatus,_buffer.sliceFromMark()); |
| 402 version = HttpVersions.CACHE.lookup(_tok0); | 407 version = _tok0; |
| 403 else | 408 else |
| 404 _handler.startRequest(HttpMethods.CACHE.lookup(_tok0), _tok1, version=HttpVersions.CACHE.lookup(_buffer.sliceFromMark())); | 409 _handler.startRequest(_tok0, _tok1, version=_buffer.sliceFromMark().toString()); |
| 405 _eol=ch; | 410 _eol=ch; |
| 406 _persistent=HttpVersions.CACHE.getOrdinal(version)>=HttpVersions.HTTP_1_1_ORDINAL; | 411 _persistent = HttpVersions.CACHE.getOrdinal(version) >= HttpVersions.HTTP_1_1_ORDINAL; |
| 407 _state=STATE_HEADER; | 412 _state=STATE_HEADER; |
| 408 _tok0.setPutIndex(_tok0.getIndex()); | 413 // _tok0.setPutIndex(_tok0.getIndex()); |
| 414 _tok0 = ""; | |
| 409 _tok1.setPutIndex(_tok1.getIndex()); | 415 _tok1.setPutIndex(_tok1.getIndex()); |
| 410 _multiLineValue=null; | 416 _multiLineValue=null; |
| 411 continue; | 417 continue; |
| 412 } | 418 } |
| 413 break; | 419 break; |
| 505 } | 511 } |
| 506 } | 512 } |
| 507 } | 513 } |
| 508 | 514 |
| 509 _handler.parsedHeader(header, value); | 515 _handler.parsedHeader(header, value); |
| 510 _tok0.setPutIndex(_tok0.getIndex()); | 516 // _tok0.setPutIndex(_tok0.getIndex()); |
| 517 _tok0 = ""; | |
| 511 _tok1.setPutIndex(_tok1.getIndex()); | 518 _tok1.setPutIndex(_tok1.getIndex()); |
| 512 _multiLineValue=null; | 519 _multiLineValue=null; |
| 513 } | 520 } |
| 514 _buffer.setMarkIndex(-1); | 521 _buffer.setMarkIndex(-1); |
| 515 | 522 |
| 594 case STATE_HEADER_NAME: | 601 case STATE_HEADER_NAME: |
| 595 switch(ch) | 602 switch(ch) |
| 596 { | 603 { |
| 597 case HttpTokens.CARRIAGE_RETURN: | 604 case HttpTokens.CARRIAGE_RETURN: |
| 598 case HttpTokens.LINE_FEED: | 605 case HttpTokens.LINE_FEED: |
| 599 if (_length > 0) | 606 if (_length > 0) { |
| 600 _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length); | 607 //System.out.println("qqqqqqqqqqqqqqqq c "+_tok0); |
| 608 // _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length); | |
| 609 _tok0 = _buffer.peek(_buffer.markIndex(), _length).toString(); | |
| 610 //System.out.println("qqqqqqqqqqqqqqqq d "+_tok0); | |
| 611 } | |
| 601 _eol=ch; | 612 _eol=ch; |
| 602 _state=STATE_HEADER; | 613 _state=STATE_HEADER; |
| 603 break; | 614 break; |
| 604 case HttpTokens.COLON: | 615 case HttpTokens.COLON: |
| 605 if (_length > 0 && _cached==null) | 616 if (_length > 0 && _cached==null) { |
| 606 _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length); | 617 //System.out.println("qqqqqqqqqqqqqqqq e "+_tok0); |
| 618 // _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length); | |
| 619 _tok0 = _buffer.peek(_buffer.markIndex(), _length).toString(); | |
| 620 //System.out.println("qqqqqqqqqqqqqqqq f "+_tok0); | |
| 621 } | |
| 607 _length=-1; | 622 _length=-1; |
| 608 _state=STATE_HEADER_VALUE; | 623 _state=STATE_HEADER_VALUE; |
| 609 break; | 624 break; |
| 610 case HttpTokens.SPACE: | 625 case HttpTokens.SPACE: |
| 611 case HttpTokens.TAB: | 626 case HttpTokens.TAB: |
| 625 case STATE_HEADER_IN_NAME: | 640 case STATE_HEADER_IN_NAME: |
| 626 switch(ch) | 641 switch(ch) |
| 627 { | 642 { |
| 628 case HttpTokens.CARRIAGE_RETURN: | 643 case HttpTokens.CARRIAGE_RETURN: |
| 629 case HttpTokens.LINE_FEED: | 644 case HttpTokens.LINE_FEED: |
| 630 if (_length > 0) | 645 if (_length > 0) { |
| 631 _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length); | 646 //System.out.println("qqqqqqqqqqqqqqqq g "+_tok0); |
| 647 // _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length); | |
| 648 _tok0 = _buffer.peek(_buffer.markIndex(),_length).toString(); | |
| 649 //System.out.println("qqqqqqqqqqqqqqqq h "+_tok0); | |
| 650 } | |
| 632 _eol=ch; | 651 _eol=ch; |
| 633 _state=STATE_HEADER; | 652 _state=STATE_HEADER; |
| 634 break; | 653 break; |
| 635 case HttpTokens.COLON: | 654 case HttpTokens.COLON: |
| 636 if (_length > 0 && _cached==null) | 655 if (_length > 0 && _cached==null) { |
| 637 _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length); | 656 //System.out.println("qqqqqqqqqqqqqqqq i "+_tok0); |
| 657 // _tok0.update(_buffer.markIndex(), _buffer.markIndex() + _length); | |
| 658 _tok0 = _buffer.peek(_buffer.markIndex(),_length).toString(); | |
| 659 //System.out.println("qqqqqqqqqqqqqqqq j "+_tok0); | |
| 660 } | |
| 638 _length=-1; | 661 _length=-1; |
| 639 _state=STATE_HEADER_VALUE; | 662 _state=STATE_HEADER_VALUE; |
| 640 break; | 663 break; |
| 641 case HttpTokens.SPACE: | 664 case HttpTokens.SPACE: |
| 642 case HttpTokens.TAB: | 665 case HttpTokens.TAB: |
| 1039 public Buffer getHeaderBuffer() | 1062 public Buffer getHeaderBuffer() |
| 1040 { | 1063 { |
| 1041 if (_header == null) | 1064 if (_header == null) |
| 1042 { | 1065 { |
| 1043 _header = _buffers.getHeader(); | 1066 _header = _buffers.getHeader(); |
| 1044 _tok0.update(_header); | 1067 //System.out.println("qqqqqqqqqqqqqqqq k "+_tok0); |
| 1068 // _tok0.update(_header); | |
| 1069 _tok0 = ""; | |
| 1070 //System.out.println("qqqqqqqqqqqqqqqq l "+_tok0); | |
| 1045 _tok1.update(_header); | 1071 _tok1.update(_header); |
| 1046 } | 1072 } |
| 1047 return _header; | 1073 return _header; |
| 1048 } | 1074 } |
| 1049 | 1075 |
| 1120 public void parsedHeader(Buffer name, Buffer value) throws IOException; | 1146 public void parsedHeader(Buffer name, Buffer value) throws IOException; |
| 1121 | 1147 |
| 1122 /** | 1148 /** |
| 1123 * This is the method called by parser when the HTTP request line is parsed | 1149 * This is the method called by parser when the HTTP request line is parsed |
| 1124 */ | 1150 */ |
| 1125 public abstract void startRequest(Buffer method, Buffer url, Buffer version) | 1151 public abstract void startRequest(String method, Buffer url, String version) |
| 1126 throws IOException; | 1152 throws IOException; |
| 1127 | 1153 |
| 1128 public void earlyEOF(); | 1154 public void earlyEOF(); |
| 1129 } | 1155 } |
| 1130 | 1156 |
