local-part = dot-atom / quoted-string / obs-local-part
(value)
| 1479 | return phrase, value |
| 1480 | |
| 1481 | def get_local_part(value): |
| 1482 | """ local-part = dot-atom / quoted-string / obs-local-part |
| 1483 | |
| 1484 | """ |
| 1485 | local_part = LocalPart() |
| 1486 | leader = None |
| 1487 | if value and value[0] in CFWS_LEADER: |
| 1488 | leader, value = get_cfws(value) |
| 1489 | if not value: |
| 1490 | raise errors.HeaderParseError( |
| 1491 | "expected local-part but found '{}'".format(value)) |
| 1492 | try: |
| 1493 | token, value = get_dot_atom(value) |
| 1494 | except errors.HeaderParseError: |
| 1495 | try: |
| 1496 | token, value = get_word(value) |
| 1497 | except errors.HeaderParseError: |
| 1498 | if value[0] != '\\' and value[0] in PHRASE_ENDS: |
| 1499 | raise |
| 1500 | token = TokenList() |
| 1501 | if leader is not None: |
| 1502 | token[:0] = [leader] |
| 1503 | local_part.append(token) |
| 1504 | if value and (value[0]=='\\' or value[0] not in PHRASE_ENDS): |
| 1505 | obs_local_part, value = get_obs_local_part(str(local_part) + value) |
| 1506 | if obs_local_part.token_type == 'invalid-obs-local-part': |
| 1507 | local_part.defects.append(errors.InvalidHeaderDefect( |
| 1508 | "local-part is not dot-atom, quoted-string, or obs-local-part")) |
| 1509 | else: |
| 1510 | local_part.defects.append(errors.ObsoleteHeaderDefect( |
| 1511 | "local-part is not a dot-atom (contains CFWS)")) |
| 1512 | local_part[0] = obs_local_part |
| 1513 | try: |
| 1514 | local_part.value.encode('ascii') |
| 1515 | except UnicodeEncodeError: |
| 1516 | local_part.defects.append(errors.NonASCIILocalPartDefect( |
| 1517 | "local-part contains non-ASCII characters)")) |
| 1518 | return local_part, value |
| 1519 | |
| 1520 | def get_obs_local_part(value): |
| 1521 | """ obs-local-part = word *("." word) |
no test coverage detected
searching dependent graphs…