obs-local-part = word *("." word)
(value)
| 1518 | return local_part, value |
| 1519 | |
| 1520 | def get_obs_local_part(value): |
| 1521 | """ obs-local-part = word *("." word) |
| 1522 | """ |
| 1523 | obs_local_part = ObsLocalPart() |
| 1524 | last_non_ws_was_dot = False |
| 1525 | while value and (value[0]=='\\' or value[0] not in PHRASE_ENDS): |
| 1526 | if value[0] == '.': |
| 1527 | if last_non_ws_was_dot: |
| 1528 | obs_local_part.defects.append(errors.InvalidHeaderDefect( |
| 1529 | "invalid repeated '.'")) |
| 1530 | obs_local_part.append(DOT) |
| 1531 | last_non_ws_was_dot = True |
| 1532 | value = value[1:] |
| 1533 | continue |
| 1534 | elif value[0]=='\\': |
| 1535 | obs_local_part.append(ValueTerminal(value[0], |
| 1536 | 'misplaced-special')) |
| 1537 | value = value[1:] |
| 1538 | obs_local_part.defects.append(errors.InvalidHeaderDefect( |
| 1539 | "'\\' character outside of quoted-string/ccontent")) |
| 1540 | last_non_ws_was_dot = False |
| 1541 | continue |
| 1542 | if obs_local_part and obs_local_part[-1].token_type != 'dot': |
| 1543 | obs_local_part.defects.append(errors.InvalidHeaderDefect( |
| 1544 | "missing '.' between words")) |
| 1545 | try: |
| 1546 | token, value = get_word(value) |
| 1547 | last_non_ws_was_dot = False |
| 1548 | except errors.HeaderParseError: |
| 1549 | if value[0] not in CFWS_LEADER: |
| 1550 | raise |
| 1551 | token, value = get_cfws(value) |
| 1552 | obs_local_part.append(token) |
| 1553 | if not obs_local_part: |
| 1554 | raise errors.HeaderParseError( |
| 1555 | "expected obs-local-part but found '{}'".format(value)) |
| 1556 | if (obs_local_part[0].token_type == 'dot' or |
| 1557 | obs_local_part[0].token_type=='cfws' and |
| 1558 | len(obs_local_part) > 1 and |
| 1559 | obs_local_part[1].token_type=='dot'): |
| 1560 | obs_local_part.defects.append(errors.InvalidHeaderDefect( |
| 1561 | "Invalid leading '.' in local part")) |
| 1562 | if (obs_local_part[-1].token_type == 'dot' or |
| 1563 | obs_local_part[-1].token_type=='cfws' and |
| 1564 | len(obs_local_part) > 1 and |
| 1565 | obs_local_part[-2].token_type=='dot'): |
| 1566 | obs_local_part.defects.append(errors.InvalidHeaderDefect( |
| 1567 | "Invalid trailing '.' in local part")) |
| 1568 | if obs_local_part.defects: |
| 1569 | obs_local_part.token_type = 'invalid-obs-local-part' |
| 1570 | return obs_local_part, value |
| 1571 | |
| 1572 | def get_dtext(value): |
| 1573 | r""" dtext = <printable ascii except \ [ ]> / obs-dtext |
no test coverage detected
searching dependent graphs…