local-part = dot-atom / quoted-string / obs-local-part
(value)
| 1462 | return phrase, value |
| 1463 | |
| 1464 | def get_local_part(value): |
| 1465 | """ local-part = dot-atom / quoted-string / obs-local-part |
| 1466 | |
| 1467 | """ |
| 1468 | local_part = LocalPart() |
| 1469 | leader = None |
| 1470 | if value and value[0] in CFWS_LEADER: |
| 1471 | leader, value = get_cfws(value) |
| 1472 | if not value: |
| 1473 | raise errors.HeaderParseError( |
| 1474 | "expected local-part but found '{}'".format(value)) |
| 1475 | try: |
| 1476 | token, value = get_dot_atom(value) |
| 1477 | except errors.HeaderParseError: |
| 1478 | try: |
| 1479 | token, value = get_word(value) |
| 1480 | except errors.HeaderParseError: |
| 1481 | if value[0] != '\\' and value[0] in PHRASE_ENDS: |
| 1482 | raise |
| 1483 | token = TokenList() |
| 1484 | if leader is not None: |
| 1485 | token[:0] = [leader] |
| 1486 | local_part.append(token) |
| 1487 | if value and (value[0]=='\\' or value[0] not in PHRASE_ENDS): |
| 1488 | obs_local_part, value = get_obs_local_part(str(local_part) + value) |
| 1489 | if obs_local_part.token_type == 'invalid-obs-local-part': |
| 1490 | local_part.defects.append(errors.InvalidHeaderDefect( |
| 1491 | "local-part is not dot-atom, quoted-string, or obs-local-part")) |
| 1492 | else: |
| 1493 | local_part.defects.append(errors.ObsoleteHeaderDefect( |
| 1494 | "local-part is not a dot-atom (contains CFWS)")) |
| 1495 | local_part[0] = obs_local_part |
| 1496 | try: |
| 1497 | local_part.value.encode('ascii') |
| 1498 | except UnicodeEncodeError: |
| 1499 | local_part.defects.append(errors.NonASCIILocalPartDefect( |
| 1500 | "local-part contains non-ASCII characters)")) |
| 1501 | return local_part, value |
| 1502 | |
| 1503 | def get_obs_local_part(value): |
| 1504 | """ obs-local-part = word *("." word) |
no test coverage detected