Analyze headers. Calculate content length, removes hop headers, etc.
(self, name, value)
| 597 | return self.headers_sent |
| 598 | |
| 599 | def add_header(self, name, value): |
| 600 | """Analyze headers. Calculate content length, |
| 601 | removes hop headers, etc.""" |
| 602 | assert not self.headers_sent, 'headers have been sent already' |
| 603 | assert isinstance(name, str), \ |
| 604 | 'Header name should be a string, got {!r}'.format(name) |
| 605 | assert set(name).issubset(ASCIISET), \ |
| 606 | 'Header name should contain ASCII chars, got {!r}'.format(name) |
| 607 | assert isinstance(value, str), \ |
| 608 | 'Header {!r} should have string value, got {!r}'.format( |
| 609 | name, value) |
| 610 | |
| 611 | name = upstr(name) |
| 612 | value = value.strip() |
| 613 | |
| 614 | if name == hdrs.CONTENT_LENGTH: |
| 615 | self.length = int(value) |
| 616 | |
| 617 | if name == hdrs.TRANSFER_ENCODING: |
| 618 | self.has_chunked_hdr = value.lower().strip() == 'chunked' |
| 619 | |
| 620 | if name == hdrs.CONNECTION: |
| 621 | val = value.lower() |
| 622 | # handle websocket |
| 623 | if 'upgrade' in val: |
| 624 | self.upgrade = True |
| 625 | # connection keep-alive |
| 626 | elif 'close' in val: |
| 627 | self.keepalive = False |
| 628 | elif 'keep-alive' in val: |
| 629 | self.keepalive = True |
| 630 | |
| 631 | elif name == hdrs.UPGRADE: |
| 632 | if 'websocket' in value.lower(): |
| 633 | self.websocket = True |
| 634 | self.headers[name] = value |
| 635 | |
| 636 | elif name not in self.HOP_HEADERS: |
| 637 | # ignore hop-by-hop headers |
| 638 | self.headers.add(name, value) |
| 639 | |
| 640 | def add_headers(self, *headers): |
| 641 | """Adds headers to a HTTP message.""" |
no outgoing calls