obs-local-part = word *("." word)
(value)
| 1501 | return local_part, value |
| 1502 | |
| 1503 | def get_obs_local_part(value): |
| 1504 | """ obs-local-part = word *("." word) |
| 1505 | """ |
| 1506 | obs_local_part = ObsLocalPart() |
| 1507 | last_non_ws_was_dot = False |
| 1508 | while value and (value[0]=='\\' or value[0] not in PHRASE_ENDS): |
| 1509 | if value[0] == '.': |
| 1510 | if last_non_ws_was_dot: |
| 1511 | obs_local_part.defects.append(errors.InvalidHeaderDefect( |
| 1512 | "invalid repeated '.'")) |
| 1513 | obs_local_part.append(DOT) |
| 1514 | last_non_ws_was_dot = True |
| 1515 | value = value[1:] |
| 1516 | continue |
| 1517 | elif value[0]=='\\': |
| 1518 | obs_local_part.append(ValueTerminal(value[0], |
| 1519 | 'misplaced-special')) |
| 1520 | value = value[1:] |
| 1521 | obs_local_part.defects.append(errors.InvalidHeaderDefect( |
| 1522 | "'\\' character outside of quoted-string/ccontent")) |
| 1523 | last_non_ws_was_dot = False |
| 1524 | continue |
| 1525 | if obs_local_part and obs_local_part[-1].token_type != 'dot': |
| 1526 | obs_local_part.defects.append(errors.InvalidHeaderDefect( |
| 1527 | "missing '.' between words")) |
| 1528 | try: |
| 1529 | token, value = get_word(value) |
| 1530 | last_non_ws_was_dot = False |
| 1531 | except errors.HeaderParseError: |
| 1532 | if value[0] not in CFWS_LEADER: |
| 1533 | raise |
| 1534 | token, value = get_cfws(value) |
| 1535 | obs_local_part.append(token) |
| 1536 | if not obs_local_part: |
| 1537 | raise errors.HeaderParseError( |
| 1538 | "expected obs-local-part but found '{}'".format(value)) |
| 1539 | if (obs_local_part[0].token_type == 'dot' or |
| 1540 | obs_local_part[0].token_type=='cfws' and |
| 1541 | len(obs_local_part) > 1 and |
| 1542 | obs_local_part[1].token_type=='dot'): |
| 1543 | obs_local_part.defects.append(errors.InvalidHeaderDefect( |
| 1544 | "Invalid leading '.' in local part")) |
| 1545 | if (obs_local_part[-1].token_type == 'dot' or |
| 1546 | obs_local_part[-1].token_type=='cfws' and |
| 1547 | len(obs_local_part) > 1 and |
| 1548 | obs_local_part[-2].token_type=='dot'): |
| 1549 | obs_local_part.defects.append(errors.InvalidHeaderDefect( |
| 1550 | "Invalid trailing '.' in local part")) |
| 1551 | if obs_local_part.defects: |
| 1552 | obs_local_part.token_type = 'invalid-obs-local-part' |
| 1553 | return obs_local_part, value |
| 1554 | |
| 1555 | def get_dtext(value): |
| 1556 | r""" dtext = <printable ascii except \ [ ]> / obs-dtext |
no test coverage detected