| 553 | |
| 554 | |
| 555 | class HTTPResponse(_HTTPContent): |
| 556 | name = "HTTP Response" |
| 557 | fields_desc = ( |
| 558 | [ |
| 559 | # First line |
| 560 | _HTTPHeaderField("Http-Version", "HTTP/1.1"), |
| 561 | _HTTPHeaderField("Status-Code", "200"), |
| 562 | _HTTPHeaderField("Reason-Phrase", "OK"), |
| 563 | # Headers |
| 564 | ] |
| 565 | + ( |
| 566 | _generate_headers( |
| 567 | GENERAL_HEADERS, |
| 568 | RESPONSE_HEADERS, |
| 569 | COMMON_UNSTANDARD_GENERAL_HEADERS, |
| 570 | COMMON_UNSTANDARD_RESPONSE_HEADERS, |
| 571 | ) |
| 572 | ) |
| 573 | + [ |
| 574 | _HTTPHeaderField("Unknown-Headers", None), |
| 575 | ] |
| 576 | ) |
| 577 | |
| 578 | def answers(self, other): |
| 579 | return HTTPRequest in other |
| 580 | |
| 581 | def do_dissect(self, s): |
| 582 | """From the HTTP packet string, populate the scapy object""" |
| 583 | first_line, body = _dissect_headers(self, s) |
| 584 | try: |
| 585 | HTTPVersion, Status, Reason = re.split(rb"\s+", first_line, maxsplit=2) |
| 586 | self.setfieldval("Http_Version", HTTPVersion) |
| 587 | self.setfieldval("Status_Code", Status) |
| 588 | self.setfieldval("Reason_Phrase", Reason) |
| 589 | except ValueError: |
| 590 | pass |
| 591 | if body: |
| 592 | self.raw_packet_cache = s[: -len(body)] |
| 593 | else: |
| 594 | self.raw_packet_cache = s |
| 595 | return body |
| 596 | |
| 597 | def mysummary(self): |
| 598 | return self.sprintf("%HTTPResponse.Status_Code% %HTTPResponse.Reason_Phrase%") |
| 599 | |
| 600 | |
| 601 | # General HTTP class + defragmentation |
no test coverage detected