FAILURE MAP
← Case archive

FA-26851 / HTTP ranges / Open access

Multipart boundary parameter parsing: closing quotes exit quoted parameter state · case 01

Multipart boundary parameter parsing: closing quotes exit quoted parameter state.

Verified by executionVariant 1 · 18 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

The multipart-boundary-parameter-quote-state decision uses parts=[] current='' quoted=False escaped=False for c in x: if escaped: current+=c escaped=False elif quoted and c=='\\': escaped=True elif c=='"': quoted=True elif c==';' and not quoted: parts.append(current) current='' else: current+=c if quoted or escaped: return None parts.append(current) if parts[0].strip().lower()!='multipart/byteranges': return None boundaries=[] for part in parts[1:]: if '=' not in part: continue key,value=part.split('=',1) if key.strip().lower()=='boundary': boundaries.append(value.strip()) if len(boundaries)!=1: return None value=boundaries[0] if not 1<=len(value)<=12: return None if any(ord(c)<32 or ord(c)>126 for c in value): return None return value.

VERIFIED REPAIR

Apply the bounded decision exactly: parts=[] current='' quoted=False escaped=False for c in x: if escaped: current+=c escaped=False elif quoted and c=='\\': escaped=True elif c=='"': quoted=not quoted elif c==';' and not quoted: parts.append(current) current='' else: current+=c if quoted or escaped: return None parts.append(current) if parts[0].strip().lower()!='multipart/byteranges': return None boundaries=[] for part in parts[1:]: if '=' not in part: continue key,value=part.split('=',1) if key.strip().lower()=='boundary': boundaries.append(value.strip()) if len(boundaries)!=1: return None value=boundaries[0] if not 1<=len(value)<=12: return None if any(ord(c)<32 or ord(c)>126 for c in value): return None return value

Unsuccessful approach: The partial repair uses parts=[] current='' quoted=False escaped=False for c in x: if escaped: current+=c escaped=False elif quoted and c=='\\': escaped=True elif c=='"': quoted = not quoted if current.endswith('b') else True elif c==';' and not quoted: parts.append(current) current='' else: current+=c if quoted or escaped: return None parts.append(current) if parts[0].strip().lower()!='multipart/byteranges': return None boundaries=[] for part in parts[1:]: if '=' not in part: continue key,value=part.split('=',1) if key.strip().lower()=='boundary': boundaries.append(value.strip()) if len(boundaries)!=1: return None value=boundaries[0] if not 1<=len(value)<=12: return None if any(ord(c)<32 or ord(c)>126 for c in value): return None return value, which still violates the stated contract.

Case contract

Parse a bounded Content-Type string with semicolon-separated parameters, quoted strings and backslash escapes inside quotes. Require multipart/byteranges (case-insensitive) and exactly one boundary parameter, with 1..12 ASCII printable characters excluding CR/LF. Other parameters ignored. Unbalanced quotes or dangling quoted escapes reject. Input x is the field string.

Why this case matters

Range responses combine representation identity, conditional requests, framing, and partial-object state.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    parts=[]
    current=''
    quoted=False
    escaped=False
    for c in x:
        if escaped:
            current+=c
            escaped=False
        elif quoted and c=='\\':
            escaped=True
        elif c=='"':
            quoted=True
        elif c==';' and not quoted:
            parts.append(current)
            current=''
        else:
            current+=c
    if quoted or escaped: return None
    parts.append(current)
    if parts[0].strip().lower()!='multipart/byteranges': return None
    boundaries=[]
    for part in parts[1:]:
        if '=' not in part: continue
        key,value=part.split('=',1)
        if key.strip().lower()=='boundary': boundaries.append(value.strip())
    if len(boundaries)!=1: return None
    value=boundaries[0]
    if not 1<=len(value)<=12: return None
    if any(ord(c)<32 or ord(c)>126 for c in value): return None
    return value
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('quote-state fixture 0', json.loads(json.dumps(solve('multipart/byteranges; boundary="a;b"'))), json.loads(json.dumps('a;b')))
check('quote-state fixture 1', json.loads(json.dumps(solve('multipart/byteranges; boundary="a\\"b"'))), json.loads(json.dumps('a"b')))
check('quote-state fixture 2', json.loads(json.dumps(solve('multipart/byteranges; boundary="a\\\\b"'))), json.loads(json.dumps('a\\b')))
check('quote-state fixture 3', json.loads(json.dumps(solve('multipart/byteranges; boundary="abc'))), json.loads(json.dumps(None)))
check('quote-state fixture 4', json.loads(json.dumps(solve(' Multipart/ByteRanges ; BOUNDARY = abc '))), json.loads(json.dumps('abc')))
check('quote-state fixture 5', json.loads(json.dumps(solve('multipart/byteranges; boundary=a; boundary=a'))), json.loads(json.dumps(None)))
check('quote-state fixture 6', json.loads(json.dumps(solve('multipart/byteranges; boundary=a; boundary=b'))), json.loads(json.dumps(None)))
check('quote-state fixture 7', json.loads(json.dumps(solve('multipart/mixed; boundary=a'))), json.loads(json.dumps(None)))
check('quote-state fixture 8', json.loads(json.dumps(solve('multipart/byteranges; boundary='))), json.loads(json.dumps(None)))
check('quote-state fixture 9', json.loads(json.dumps(solve('multipart/byteranges; boundary=abcdefghijkl'))), json.loads(json.dumps('abcdefghijkl')))
check('quote-state fixture 10', json.loads(json.dumps(solve('multipart/byteranges; boundary=abcdefghijklm'))), json.loads(json.dumps(None)))
check('quote-state fixture 11', json.loads(json.dumps(solve('multipart/byteranges; boundary=a\nb'))), json.loads(json.dumps(None)))
check('quote-state fixture 12', json.loads(json.dumps(solve('multipart/byteranges; boundary=a\x7fb'))), json.loads(json.dumps(None)))
check('quote-state fixture 13', json.loads(json.dumps(solve('multipart/byteranges; x=y'))), json.loads(json.dumps(None)))
check('quote-state fixture 14', json.loads(json.dumps(solve("p"*N))), json.loads(json.dumps(None)))
check('quote-state fixture 15', json.loads(json.dumps(solve("multipart/byteranges; boundary=b"+str(N)))), json.loads(json.dumps("b"+str(N))))
check('quote-state fixture 16', json.loads(json.dumps(solve('multipart/byteranges; boundary="abc"'))), json.loads(json.dumps('abc')))
check('quote-state fixture 17', json.loads(json.dumps(solve('multipart/byteranges; x=a=b; boundary=ab'))), json.loads(json.dumps('ab')))
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
quote-state fixture 0Nonea;bFailed
quote-state fixture 1Nonea"bFailed
quote-state fixture 2Nonea\bFailed
quote-state fixture 3NoneNonePassed
quote-state fixture 4abcabcPassed
quote-state fixture 5NoneNonePassed
quote-state fixture 6NoneNonePassed
quote-state fixture 7NoneNonePassed
quote-state fixture 8NoneNonePassed
quote-state fixture 9abcdefghijklabcdefghijklPassed
quote-state fixture 10NoneNonePassed
quote-state fixture 11NoneNonePassed
quote-state fixture 12NoneNonePassed
quote-state fixture 13NoneNonePassed
quote-state fixture 14NoneNonePassed
quote-state fixture 15b1b1Passed
quote-state fixture 16NoneabcFailed
quote-state fixture 17ababPassed

SHA-256 / 6ce4762528c0dae6dd7e3f340374d2394433dd1d7297b31967aba2ef0423ed65

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    parts=[]
    current=''
    quoted=False
    escaped=False
    for c in x:
        if escaped:
            current+=c
            escaped=False
        elif quoted and c=='\\':
            escaped=True
        elif c=='"':
            quoted = not quoted if current.endswith('b') else True
        elif c==';' and not quoted:
            parts.append(current)
            current=''
        else:
            current+=c
    if quoted or escaped: return None
    parts.append(current)
    if parts[0].strip().lower()!='multipart/byteranges': return None
    boundaries=[]
    for part in parts[1:]:
        if '=' not in part: continue
        key,value=part.split('=',1)
        if key.strip().lower()=='boundary': boundaries.append(value.strip())
    if len(boundaries)!=1: return None
    value=boundaries[0]
    if not 1<=len(value)<=12: return None
    if any(ord(c)<32 or ord(c)>126 for c in value): return None
    return value
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('quote-state fixture 0', json.loads(json.dumps(solve('multipart/byteranges; boundary="a;b"'))), json.loads(json.dumps('a;b')))
check('quote-state fixture 1', json.loads(json.dumps(solve('multipart/byteranges; boundary="a\\"b"'))), json.loads(json.dumps('a"b')))
check('quote-state fixture 2', json.loads(json.dumps(solve('multipart/byteranges; boundary="a\\\\b"'))), json.loads(json.dumps('a\\b')))
check('quote-state fixture 3', json.loads(json.dumps(solve('multipart/byteranges; boundary="abc'))), json.loads(json.dumps(None)))
check('quote-state fixture 4', json.loads(json.dumps(solve(' Multipart/ByteRanges ; BOUNDARY = abc '))), json.loads(json.dumps('abc')))
check('quote-state fixture 5', json.loads(json.dumps(solve('multipart/byteranges; boundary=a; boundary=a'))), json.loads(json.dumps(None)))
check('quote-state fixture 6', json.loads(json.dumps(solve('multipart/byteranges; boundary=a; boundary=b'))), json.loads(json.dumps(None)))
check('quote-state fixture 7', json.loads(json.dumps(solve('multipart/mixed; boundary=a'))), json.loads(json.dumps(None)))
check('quote-state fixture 8', json.loads(json.dumps(solve('multipart/byteranges; boundary='))), json.loads(json.dumps(None)))
check('quote-state fixture 9', json.loads(json.dumps(solve('multipart/byteranges; boundary=abcdefghijkl'))), json.loads(json.dumps('abcdefghijkl')))
check('quote-state fixture 10', json.loads(json.dumps(solve('multipart/byteranges; boundary=abcdefghijklm'))), json.loads(json.dumps(None)))
check('quote-state fixture 11', json.loads(json.dumps(solve('multipart/byteranges; boundary=a\nb'))), json.loads(json.dumps(None)))
check('quote-state fixture 12', json.loads(json.dumps(solve('multipart/byteranges; boundary=a\x7fb'))), json.loads(json.dumps(None)))
check('quote-state fixture 13', json.loads(json.dumps(solve('multipart/byteranges; x=y'))), json.loads(json.dumps(None)))
check('quote-state fixture 14', json.loads(json.dumps(solve("p"*N))), json.loads(json.dumps(None)))
check('quote-state fixture 15', json.loads(json.dumps(solve("multipart/byteranges; boundary=b"+str(N)))), json.loads(json.dumps("b"+str(N))))
check('quote-state fixture 16', json.loads(json.dumps(solve('multipart/byteranges; boundary="abc"'))), json.loads(json.dumps('abc')))
check('quote-state fixture 17', json.loads(json.dumps(solve('multipart/byteranges; x=a=b; boundary=ab'))), json.loads(json.dumps('ab')))
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
quote-state fixture 0a;ba;bPassed
quote-state fixture 1a"ba"bPassed
quote-state fixture 2a\ba\bPassed
quote-state fixture 3NoneNonePassed
quote-state fixture 4abcabcPassed
quote-state fixture 5NoneNonePassed
quote-state fixture 6NoneNonePassed
quote-state fixture 7NoneNonePassed
quote-state fixture 8NoneNonePassed
quote-state fixture 9abcdefghijklabcdefghijklPassed
quote-state fixture 10NoneNonePassed
quote-state fixture 11NoneNonePassed
quote-state fixture 12NoneNonePassed
quote-state fixture 13NoneNonePassed
quote-state fixture 14NoneNonePassed
quote-state fixture 15b1b1Passed
quote-state fixture 16NoneabcFailed
quote-state fixture 17ababPassed

SHA-256 / 5497ffb69eb054f06d90317e20e89953e6a146c5dba54ad2ec2b379de7ee836b

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    parts=[]
    current=''
    quoted=False
    escaped=False
    for c in x:
        if escaped:
            current+=c
            escaped=False
        elif quoted and c=='\\':
            escaped=True
        elif c=='"':
            quoted=not quoted
        elif c==';' and not quoted:
            parts.append(current)
            current=''
        else:
            current+=c
    if quoted or escaped: return None
    parts.append(current)
    if parts[0].strip().lower()!='multipart/byteranges': return None
    boundaries=[]
    for part in parts[1:]:
        if '=' not in part: continue
        key,value=part.split('=',1)
        if key.strip().lower()=='boundary': boundaries.append(value.strip())
    if len(boundaries)!=1: return None
    value=boundaries[0]
    if not 1<=len(value)<=12: return None
    if any(ord(c)<32 or ord(c)>126 for c in value): return None
    return value
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
check('quote-state fixture 0', json.loads(json.dumps(solve('multipart/byteranges; boundary="a;b"'))), json.loads(json.dumps('a;b')))
check('quote-state fixture 1', json.loads(json.dumps(solve('multipart/byteranges; boundary="a\\"b"'))), json.loads(json.dumps('a"b')))
check('quote-state fixture 2', json.loads(json.dumps(solve('multipart/byteranges; boundary="a\\\\b"'))), json.loads(json.dumps('a\\b')))
check('quote-state fixture 3', json.loads(json.dumps(solve('multipart/byteranges; boundary="abc'))), json.loads(json.dumps(None)))
check('quote-state fixture 4', json.loads(json.dumps(solve(' Multipart/ByteRanges ; BOUNDARY = abc '))), json.loads(json.dumps('abc')))
check('quote-state fixture 5', json.loads(json.dumps(solve('multipart/byteranges; boundary=a; boundary=a'))), json.loads(json.dumps(None)))
check('quote-state fixture 6', json.loads(json.dumps(solve('multipart/byteranges; boundary=a; boundary=b'))), json.loads(json.dumps(None)))
check('quote-state fixture 7', json.loads(json.dumps(solve('multipart/mixed; boundary=a'))), json.loads(json.dumps(None)))
check('quote-state fixture 8', json.loads(json.dumps(solve('multipart/byteranges; boundary='))), json.loads(json.dumps(None)))
check('quote-state fixture 9', json.loads(json.dumps(solve('multipart/byteranges; boundary=abcdefghijkl'))), json.loads(json.dumps('abcdefghijkl')))
check('quote-state fixture 10', json.loads(json.dumps(solve('multipart/byteranges; boundary=abcdefghijklm'))), json.loads(json.dumps(None)))
check('quote-state fixture 11', json.loads(json.dumps(solve('multipart/byteranges; boundary=a\nb'))), json.loads(json.dumps(None)))
check('quote-state fixture 12', json.loads(json.dumps(solve('multipart/byteranges; boundary=a\x7fb'))), json.loads(json.dumps(None)))
check('quote-state fixture 13', json.loads(json.dumps(solve('multipart/byteranges; x=y'))), json.loads(json.dumps(None)))
check('quote-state fixture 14', json.loads(json.dumps(solve("p"*N))), json.loads(json.dumps(None)))
check('quote-state fixture 15', json.loads(json.dumps(solve("multipart/byteranges; boundary=b"+str(N)))), json.loads(json.dumps("b"+str(N))))
check('quote-state fixture 16', json.loads(json.dumps(solve('multipart/byteranges; boundary="abc"'))), json.loads(json.dumps('abc')))
check('quote-state fixture 17', json.loads(json.dumps(solve('multipart/byteranges; x=a=b; boundary=ab'))), json.loads(json.dumps('ab')))
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
quote-state fixture 0a;ba;bPassed
quote-state fixture 1a"ba"bPassed
quote-state fixture 2a\ba\bPassed
quote-state fixture 3NoneNonePassed
quote-state fixture 4abcabcPassed
quote-state fixture 5NoneNonePassed
quote-state fixture 6NoneNonePassed
quote-state fixture 7NoneNonePassed
quote-state fixture 8NoneNonePassed
quote-state fixture 9abcdefghijklabcdefghijklPassed
quote-state fixture 10NoneNonePassed
quote-state fixture 11NoneNonePassed
quote-state fixture 12NoneNonePassed
quote-state fixture 13NoneNonePassed
quote-state fixture 14NoneNonePassed
quote-state fixture 15b1b1Passed
quote-state fixture 16abcabcPassed
quote-state fixture 17ababPassed

SHA-256 / 771f9ff1d5c8219d02e75f3ea1cc9ae03d1f43bf993609115ebdaf843d702d67

Verification & scope

Deterministic simplified range service, with stipulated local policies and already parsed trusted inputs; not a complete HTTP implementation. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:41:19.656661+00:00.

Case digest / 8da21e0c6b2118147d627955e97d1f02e65c4a526810c4947adb8821a265b3d0