| 91 | |
| 92 | |
| 93 | class RTSPResponse(_HTTPContent): |
| 94 | name = "RTSP Response" |
| 95 | fields_desc = ( |
| 96 | [ |
| 97 | # First line |
| 98 | _HTTPHeaderField("Version", "RTSP/1.1"), |
| 99 | _HTTPHeaderField("Status_Code", "200"), |
| 100 | _HTTPHeaderField("Reason_Phrase", "OK"), |
| 101 | # Headers |
| 102 | ] |
| 103 | + ( |
| 104 | _generate_headers( |
| 105 | RTSP_RESP_HEADERS, |
| 106 | ) |
| 107 | ) |
| 108 | + [ |
| 109 | _HTTPHeaderField("Unknown-Headers", None), |
| 110 | ] |
| 111 | ) |
| 112 | |
| 113 | def answers(self, other): |
| 114 | return RTSPRequest in other |
| 115 | |
| 116 | def do_dissect(self, s): |
| 117 | first_line, body = _dissect_headers(self, s) |
| 118 | try: |
| 119 | Version, Status, Reason = re.split(rb"\s+", first_line, maxsplit=2) |
| 120 | self.setfieldval("Version", Version) |
| 121 | self.setfieldval("Status_Code", Status) |
| 122 | self.setfieldval("Reason_Phrase", Reason) |
| 123 | except ValueError: |
| 124 | pass |
| 125 | if body: |
| 126 | self.raw_packet_cache = s[: -len(body)] |
| 127 | else: |
| 128 | self.raw_packet_cache = s |
| 129 | return body |
| 130 | |
| 131 | def mysummary(self): |
| 132 | return self.sprintf( |
| 133 | "%RTSPResponse.Version% %RTSPResponse.Status_Code% " |
| 134 | "%RTSPResponse.Reason_Phrase%" |
| 135 | ) |
| 136 | |
| 137 | |
| 138 | class RTSP(HTTP): |
nothing calls this directly
no test coverage detected
searching dependent graphs…