فهرست مقاله
فرض کنید یک نشانیِ ثابت، پاسخِ ساختگیِ تنظیماتِ حسگر را میدهد، اما محتوای پاسخ به نسخه و واحدِ درخواستی وابسته است. اگر پاسخِ درخواستِ قبلی را فقط با نشانی پیدا کنیم، ممکن است گونهٔ نامناسبی برداریم. این درس یک بخشِ کوچک از طراحیِ کش را جدا میکند: کدام پاسخهای ذخیرهشده از نظرِ فیلدهای انتخابکننده با درخواستِ جدید تطبیق دارند؟ سرور، انتقالِ شبکه و کشِ واقعی اجرا نمیکنیم.
۱. یک نشانی، چند پاسخِ وابسته به درخواست

در درسِ GET شرطی و ETag، بازنمایی از قبل انتخاب شده بود؛ سپس شرطِ دریافتکننده با شناسهٔ آن مقایسه میشد. اینجا یک مرحله زودتر میایستیم. چند پاسخ برای همان روشِ GET و همان URI فرض میکنیم و باید تفاوتِ درخواستهایی را نگه داریم که باعثِ انتخابِ آن پاسخها شدهاند.
برای روشنبودنِ معنا، سه فیلدِ سفارشی تعریف میکنیم. X-Calibration-Revision یک برچسبِ مبهمِ نسخه است؛ X-Response-Unit برچسبِ قراردادیِ واحد و X-Trace نشانِ تشخیصی است. هیچکدام اصالتِ ضرایب، دقتِ حسگر یا تبدیلِ واقعیِ ولتاژ را تأیید نمیکنند. نامها و مقدارهایشان متعلق به همین آزمایشاند، نه یک استانداردِ منتشرشده برای تجهیزات.
هر پاسخ با یک شناسهٔ عددی، فهرستِ Vary و فیلدهای درخواستِ انتخابکننده ثبت میشود. پاسخِ پنج با نسخهٔ r1 و واحدِ mV و پاسخِ دو با نسخهٔ r2 و همان واحد انتخاب شدهاند؛ هر دو روی نسخه و واحد تغییر میکنند. برای درخواستِ r2 و mV، فقط شناسهٔ دو با این دو پاسخ تطبیق دارد. برابر بودنِ نشانی، تفاوتِ این شاهدها را حذف نمیکند.
بخشِ کاملِ ۴٫۱ در RFC 9111 همین نقشِ فیلدهای نامبرده در Vary را هنگامِ تطابق توضیح میدهد. بااینحال، این شرط را مجوزِ نهاییِ استفاده نمینامیم. امکانِ ذخیرهکردن، تازگی، اعتبارسنجیِ مبدأ و انتخاب میان چند پاسخ، تصمیمهای دیگری دارند؛ خروجیِ برنامه فقط نامزدهاست.
۲. سرآیندِ غایب با مقدارِ خالی یکی نیست

یک پاسخ را وقتی انتخاب کردهایم که فیلدِ واحد اصلاً حاضر نبوده است؛ پاسخِ دیگری با فیلدِ حاضر و مقدارِ رشتهٔ خالی انتخاب شده است. اگر Vary واحد را نام ببرد، این دو حالت برابر نیستند. مدل، حضور را جدا از مقدار نگه میدارد؛ استفاده از رشتهٔ خالی به عنوانِ نشانهٔ غیبت، همین تمایز را از بین میبرد.
در شاهدِ دستی، شناسهٔ سه به نبودِ واحد و شناسهٔ چهار به مقدارِ خالی تعلق دارد. درخواستِ بدونِ واحد، سه و درخواستِ با مقدارِ خالی، چهار را برمیگرداند. اینها دو حالتِ ساختاریاند؛ «خالی» را خطای حسگر، صفر ولت یا مقدارِ گمشدهٔ پایگاه داده تفسیر نمیکنیم. معنیِ کاربردیِ مقدار همچنان باید جدا تعریف شود.
طبق بخشِ نامِ فیلد در RFC 9110، بزرگیِ حروفِ نام مهم نیست. بنابراین صورتهای مختلفِ نام را کوچک میکنیم. مقدارها چنین قاعدهٔ عمومیای ندارند: در قراردادِ مبهمِ ما r1 و R1 متفاوتاند. این رفتار را به فیلدهایی که معنای مشخصِ دیگری دارند، مانند ترجیحِ زبان، تعمیم نمیدهیم.
ورودیها از پیش تفکیک شدهاند. رشتهٔ خامِ HTTP، فاصلههای ابتدا و انتها، چند خطِ تکراری، ویرگول و مقدارِ نقلقولدار تجزیه نمیشوند. بخشِ کاملِ ۵٫۵ منبع، قواعد و احتیاطهای مقدارِ فیلد را توضیح میدهد؛ کدِ حاضر فقط زیرمجموعهٔ صریحِ خودش را میپذیرد. ردکردنِ نامِ تکراری در این رابطِ تکمقداری، حکمِ نامعتبر بودنِ همهٔ پیامهای چندخطیِ HTTP نیست.
۳. اثرانگشتِ انتخاب با Vary و مرزِ ستاره

مسیرِ اصلی پس از اعتبارسنجیِ کامل، برای هر نامِ موردنیاز یک جفتِ حضور و مقدار میسازد. اثرانگشتِ درخواستِ جدید باید با اثرانگشتِ درخواستِ انتخابکننده برابر باشد. اگر هم نسخه و هم واحد نام برده شدهاند، تطابقِ یکی کافی نیست. در مقابل، تغییرِ فیلدِ تشخیصی که در Vary نام نبردهایم، این شرط را عوض نمیکند.
ترتیبِ نامهای Vary و تکرارِ نامِ معمولی، محدودیتِ تازهای نمیسازند. اما عضوِ ستاره در هر جای فهرست، تطابقِ مستقیم را رد میکند؛ حتی اگر نامِ واحد هم کنارش باشد. بخشِ کاملِ Vary در RFC 9110 توضیح میدهد که عواملِ انتخاب میتوانند فراتر از فیلدهای قابلِ مشاهده باشند. این تابع نمیتواند آن اطلاعاتِ نامعلوم را حدس بزند.
فهرستِ تهی را به معنیِ نبودِ محدودیتِ Vary در همین زیرمسئله میگیریم؛ پس ممکن است چند شناسه نامزد شوند. این نتیجه، داورِ نهایی نیست. RFC 9111 دربارهٔ ترجیح، تازگیِ پاسخ و پاسخِ پیشفرضی که Vary را جا انداخته نیز بحث میکند. برنامه عمداً یکی از نامزدها را به دلخواه یا با شمارهٔ شناسه برنده نمیکند.
در آزمایشِ نسخهٔ کالیبراسیون در lru_cache، وابستگیِ پنهان از کلیدِ تابع جا افتاده بود. شباهتِ مفهومی، کاملبودنِ هویت است؛ سازوکارها یکی نیستند. اینجا decorator، اخراجِ کماستفادهترین عضو، شمارِ hit یا پاکسازیِ کشِ تابع نداریم؛ محدودیتِ درخواستِ انتخابکننده را میسنجیم.
۴. کدِ محدود و مرجعِ مستقلِ مجموعهٔ درخواستها

رابط، تاپلِ حداکثر شش پاسخ با شناسههای صحیحِ دقیقِ صفر تا پانزده میگیرد. فهرستِ Vary حداکثر چهار عضو و هر مجموعهٔ فیلد حداکثر سه جفت دارد. bool، زیرکلاس، مولد، نام یا مقدارِ خارج از جدول و شناسهٔ تکراری رد میشوند. کلِ اعلان پیش از ساختِ اثرانگشت بررسی میشود؛ پاسخِ نامعتبرِ آخر با وجودِ نامزدِ مناسبِ اول پنهان نمیماند.
"""Finite selecting-request matching only; no HTTP server, client or cache."""
from itertools import product
import json
import platform
import sys
FIELD_VALUES = {
"x-calibration-revision": ("", "r1", "R1", "r2"),
"x-response-unit": ("", "mV", "V"),
"x-trace": ("", "t0"),
}
VARY_FIELDS = ("x-calibration-revision", "x-response-unit")
def _headers(value):
if type(value) is not tuple or len(value) > 3:
raise ValueError("exact tuple of at most three singleton fields required")
answer = {}
for pair in value:
if type(pair) is not tuple or len(pair) != 2:
raise ValueError("exact name/value pair required")
name, content = pair
if type(name) is not str or not name.isascii() or name.lower() not in FIELD_VALUES:
raise ValueError("declared exact ASCII field name required")
normalized = name.lower()
if normalized in answer:
raise ValueError("own singleton profile rejects duplicate field names")
if type(content) is not str or content not in FIELD_VALUES[normalized]:
raise ValueError("declared opaque field value required")
answer[normalized] = content
return answer
def _admit(stored, request_headers):
if type(stored) is not tuple or len(stored) > 6:
raise ValueError("exact tuple of at most six stored candidates required")
request = _headers(request_headers)
admitted, seen = [], set()
for entry in stored:
if type(entry) is not tuple or len(entry) != 3:
raise ValueError("exact identifier/vary/selecting-request triple required")
identifier, vary, selecting_headers = entry
if type(identifier) is not int or not 0 <= identifier <= 15 or identifier in seen:
raise ValueError("unique exact identifier in 0..15 required")
seen.add(identifier)
if type(vary) is not tuple or len(vary) > 4:
raise ValueError("exact Vary tuple of at most four members required")
names = []
for name in vary:
if type(name) is not str or not name.isascii() or name.lower() not in (*VARY_FIELDS, "*"):
raise ValueError("declared Vary member required")
names.append(name.lower())
selecting = _headers(selecting_headers)
admitted.append((identifier, tuple(sorted(set(names))), selecting))
return tuple(admitted), request
def _fingerprint(headers, names):
# A missing member is not the present empty string.
return tuple((name in headers, headers.get(name, "")) for name in names)
def matching_variants(stored, request_headers):
"""Return ALL matching IDs for one fixed GET/URI, not a selected response.
Complete declaration admission precedes any fingerprint/matching work.
Fields have this lesson's opaque singleton semantics and are pre-parsed.
A result is not freshness, revalidation, authorization or reuse approval.
"""
entries, request = _admit(stored, request_headers)
answer = []
for identifier, names, selecting in entries:
if "*" not in names and _fingerprint(selecting, names) == _fingerprint(request, names):
answer.append(identifier)
return tuple(sorted(answer))
def universe_reference(stored, request_headers):
"""Independent allowed-request sets over the entire declared finite world.
Valid fixtures only. No main validator/fingerprint/matcher/constants build
expected values. Intersections operate on request ordinals, not cache keys.
"""
fields = ("x-calibration-revision", "x-response-unit", "x-trace")
choices = ((None, "", "r1", "R1", "r2"), (None, "", "mV", "V"), (None, "", "t0"))
universe = tuple(product(range(5), range(4), range(3)))
def state(headers, field):
for name, value in headers:
if name.lower() == field:
return choices[fields.index(field)].index(value)
return 0
presented = tuple(state(request_headers, field) for field in fields)
ticket = universe.index(presented)
result = set()
for identifier, vary, selecting in stored:
allowed = set(range(len(universe)))
for raw_name in vary:
name = raw_name.lower()
if name == "*":
allowed = set()
break
axis = fields.index(name)
wanted = state(selecting, name)
allowed.intersection_update(i for i, point in enumerate(universe) if point[axis] == wanted)
if ticket in allowed:
result.add(identifier)
return tuple(sorted(result))
def _fixture_headers(revision, unit, trace=None):
return tuple((name, value) for name, value in
(("X-Calibration-Revision", revision), ("X-Response-Unit", unit), ("X-Trace", trace))
if value is not None)
def _rejects(stored, request):
try:
matching_variants(stored, request)
except ValueError:
return True
return False
def run_example():
revision, unit = VARY_FIELDS
both = (revision, unit)
request = _fixture_headers("r2", "mV")
stored = (
(5, both, _fixture_headers("r1", "mV")),
(2, both, _fixture_headers("r2", "mV")),
(9, (unit,), _fixture_headers("r1", None)),
(12, ("*",), request),
)
match = matching_variants(stored, request)
checks = {}
checks["manual_same_URI_different_revision_matches_only_corresponding_candidate"] = (
match == (2,) and matching_variants(stored, _fixture_headers("r1", "mV")) == (5,))
checks["two_named_fields_are_a_conjunction_not_either_field"] = (
matching_variants(stored[:2], _fixture_headers("r2", "V")) == ()
and matching_variants(stored[:2], _fixture_headers("r1", "V")) == ())
missing_blank = ((3, (unit,), ()), (4, (unit,), ((unit, ""),)))
checks["absent_field_differs_from_present_empty_value"] = (
matching_variants(missing_blank, ()) == (3,)
and matching_variants(missing_blank, ((unit, ""),)) == (4,))
unrestricted = ((7, (), _fixture_headers("r1", "V")), (1, (), ()))
checks["empty_Vary_restriction_keeps_all_candidate_IDs_without_winner"] = (
matching_variants(unrestricted, request) == (1, 7)
and matching_variants(unrestricted, ()) == (1, 7))
wildcard = tuple((i, members, request) for i, members in enumerate(
(("*",), (unit, "*"), ("*", revision), ("*", "*"))))
checks["any_wildcard_member_always_fails_direct_matching"] = matching_variants(wildcard, request) == ()
case_entry = ((6, ("X-CALIBRATION-REVISION",), (("X-Calibration-Revision", "r1"),)),)
checks["field_names_ignore_case_but_declared_opaque_values_do_not"] = (
matching_variants(case_entry, ((revision, "r1"),)) == (6,)
and matching_variants(case_entry, ((revision.upper(), "R1"),)) == ())
checks["unnominated_fields_do_not_enter_the_matching_restriction"] = (
matching_variants(stored, _fixture_headers("r2", "mV", "t0")) == match
and matching_variants(((0, (unit,), _fixture_headers("r1", "V", "")),),
_fixture_headers("R1", "V", "t0")) == (0,))
repeated = ((4, (unit, revision, unit, revision.upper()), request),)
checks["Vary_name_order_and_repetition_do_not_change_restriction"] = (
matching_variants(repeated, request) == (4,)
and matching_variants(((4, both, request),), request) == (4,))
reordered = tuple((i, tuple(reversed(v)), tuple(reversed(h))) for i, v, h in reversed(stored))
checks["stored_and_field_order_leave_canonical_ID_result_unchanged"] = (
matching_variants(reordered, tuple(reversed(request))) == match)
multi = ((13, (unit,), request), (1, both, request), (8, (revision,), request))
checks["all_matching_candidates_remain_visible_without_Date_or_preference_choice"] = (
matching_variants(multi, request) == (1, 8, 13))
varies = ((), (revision,), (unit,), both, ("*",), ("*", unit), (unit, unit))
selector_profiles = tuple(product((None, "", "r1", "R1", "r2"), (None, "", "mV", "V")))
request_profiles = tuple(product((None, "", "r1", "R1", "r2"), (None, "", "mV", "V"), (None, "", "t0")))
family_ok, cases = True, 0
for rv, uv in selector_profiles:
for vary in varies:
fixture = ((0, vary, _fixture_headers(rv, uv)),)
for rr, ur, tr in request_profiles:
query = _fixture_headers(rr, ur, tr)
family_ok &= matching_variants(fixture, query) == universe_reference(fixture, query)
cases += 1
checks["independent_universe_allowed_sets_finite_profiles_ONE_group"] = bool(family_ok and cases > 0)
class TupleChild(tuple):
pass
class StrChild(str):
def lower(self):
raise AssertionError("exact str validation must precede lower hook")
class IntChild(int):
pass
consumed = []
def generator():
consumed.append("pulled")
yield (unit, "mV")
valid = ((0, both, request),)
invalid = [(None, request), ([], request), (TupleChild(valid), request),
(valid, []), (valid, TupleChild(request)), (valid, generator()),
(((True, (), ()),), ()), (((IntChild(0), (), ()),), ()),
(((0, (), ()), (0, (), ())), ()), (((0, [], ()),), ()),
(((0, (StrChild(unit),), ()),), ()), (((0, ("x-trace",), ()),), ()),
(((0, ("unknown",), ()),), ()), (((0, (False,), ()),), ()),
(((0, (), []),), ()), (((0, (), ((unit, "V"), (unit.upper(), "V"))),), ()),
(valid, (("Authorization", ""),)), (valid, ((unit, "mv"),)),
(valid, ((unit, "mV "),)), (valid, ((unit, "\r\n"),)),
(valid, ((unit, None),)), (valid, ((unit, StrChild("V")),)),
(valid, ((StrChild(unit), "V"),)), (valid, ((unit,),)),
(valid, ([unit, "V"],)), (((0, (), ()), (1, (), ((unit, False),))), request)]
original_fingerprint = globals()["_fingerprint"]
fingerprints = []
def forbidden_fingerprint(*args):
fingerprints.append("entered")
raise AssertionError("whole declaration must validate before matching")
try:
globals()["_fingerprint"] = forbidden_fingerprint
invalid_ok = all(_rejects(s, q) for s, q in invalid)
finally:
globals()["_fingerprint"] = original_fingerprint
checks["whole_exact_declaration_rejection_precedes_matching_ONE_group"] = (
invalid_ok and consumed == [] and fingerprints == [])
cap = tuple((i, (unit,) * 4, request) for i in (0, 1, 2, 3, 4, 15))
too_many_headers = request + (("x-trace", ""), ("X-Trace", "t0"))
bound_invalid = ((cap + ((14, (), ()),), request), (((16, (), ()),), ()),
(((-1, (), ()),), ()), (((0, (unit,) * 5, ()),), ()), ((), too_many_headers))
checks["inclusive_profile_caps_empty_inputs_and_one_beyond_limits"] = (
matching_variants(cap, request) == (0, 1, 2, 3, 4, 15)
and matching_variants((), ()) == () and matching_variants(((0, (), ()),), ()) == (0,)
and all(_rejects(s, q) for s, q in bound_invalid))
before = repr((multi, request))
first = matching_variants(multi, request)
matching_variants(missing_blank, ())
second = matching_variants(multi, request)
checks["immutable_nonempty_results_preserved_inputs_and_intervening_isolation"] = (
first == second == (1, 8, 13) and first is not second
and type(first) is tuple and all(type(i) is int for i in first)
and before == repr((multi, request)))
assert len(checks) == 14 and all(type(value) is bool and value for value in checks.values()), checks
return {"runtime": {"python": platform.python_version(), "implementation": platform.python_implementation()},
"scope": "All Vary matching candidate IDs only, one supplied fixed GET/URI; no cache response decision",
"custom_opaque_singleton_values": FIELD_VALUES,
"manual": {"stored": stored, "request": request, "all_matching_IDs": match,
"URI_only_would_not_distinguish_IDs": tuple(sorted(x[0] for x in stored)),
"missing_unit_candidates": matching_variants(missing_blank, ()),
"present_empty_unit_candidates": matching_variants(missing_blank, ((unit, ""),)),
"multiple_matches_not_a_winner": first},
"finite_family_ONE_group": {"selector_profiles": len(selector_profiles), "vary_profiles": len(varies),
"request_profiles": len(request_profiles), "cases": cases},
"invalid_profiles_ONE_group": len(invalid), "invalid_bounds_ONE_group": len(bound_invalid),
"validation_probe_fingerprint_calls": len(fingerprints), "generator_items_consumed": len(consumed),
"groups_total": len(checks), "checks": checks,
"limits": ["Pre-parsed declared singleton fields only; duplicate request fields rejected by own admission policy, not general HTTP syntax.",
"Only field NAMES are normalized to lowercase; declared opaque values stay exact, with absent distinct from present empty.",
"Any wildcard member fails direct matching; origin revalidation is a separate unimplemented path.",
"All matching IDs returned: no Date/preference winner, freshness/storage permission/authorization/304/reuse or server/cache deployment.",
"No real calibration, performance, memory, confidentiality or comprehensive protocol/security claim; finite comparisons are one group."]}
if __name__ == "__main__":
sys.stdout.buffer.write((json.dumps(run_example(), ensure_ascii=True, indent=2) + "\n").encode("ascii"))
مرجعِ مستقل، همهٔ حالتهای مجازِ درخواست را به یک جهانِ محدود تبدیل میکند. برای هر فیلدِ نامبرده، مجموعهٔ شمارهٔ درخواستهای دارای همان حالت را میسازد؛ اشتراکِ این مجموعهها، درخواستهای مجازِ آن پاسخ است. سپس عضویتِ درخواستِ جدید را میسنجد. تابعِ اثرانگشت، اعتبارسنج و تطابقِ اصلی، پاسخِ انتظارِ این مرجع را تولید نمیکنند.
چهارده گروهِ بولیِ نامدار داریم؛ تمامِ ترکیبهای محدودِ حالتِ انتخابکننده، فهرستِ Vary و درخواستِ جدید فقط یک گروهاند. شاهدهای دستی، غیبت و مقدارِ خالی، ستاره، نامِ تکراری، ترتیب، نوع و اندازه، چند نامزد و استقلالِ فراخوانیها نیز بررسی میشوند. تعدادِ واقعیِ حالتها و نسخهٔ مفسر در خروجی ثبت میشود؛ دادهها را گروهِ مستقل نمیشماریم.
{
"runtime": {
"python": "3.14.5",
"implementation": "CPython"
},
"scope": "All Vary matching candidate IDs only, one supplied fixed GET/URI; no cache response decision",
"custom_opaque_singleton_values": {
"x-calibration-revision": [
"",
"r1",
"R1",
"r2"
],
"x-response-unit": [
"",
"mV",
"V"
],
"x-trace": [
"",
"t0"
]
},
"manual": {
"stored": [
[
5,
[
"x-calibration-revision",
"x-response-unit"
],
[
[
"X-Calibration-Revision",
"r1"
],
[
"X-Response-Unit",
"mV"
]
]
],
[
2,
[
"x-calibration-revision",
"x-response-unit"
],
[
[
"X-Calibration-Revision",
"r2"
],
[
"X-Response-Unit",
"mV"
]
]
],
[
9,
[
"x-response-unit"
],
[
[
"X-Calibration-Revision",
"r1"
]
]
],
[
12,
[
"*"
],
[
[
"X-Calibration-Revision",
"r2"
],
[
"X-Response-Unit",
"mV"
]
]
]
],
"request": [
[
"X-Calibration-Revision",
"r2"
],
[
"X-Response-Unit",
"mV"
]
],
"all_matching_IDs": [
2
],
"URI_only_would_not_distinguish_IDs": [
2,
5,
9,
12
],
"missing_unit_candidates": [
3
],
"present_empty_unit_candidates": [
4
],
"multiple_matches_not_a_winner": [
1,
8,
13
]
},
"finite_family_ONE_group": {
"selector_profiles": 20,
"vary_profiles": 7,
"request_profiles": 60,
"cases": 8400
},
"invalid_profiles_ONE_group": 26,
"invalid_bounds_ONE_group": 5,
"validation_probe_fingerprint_calls": 0,
"generator_items_consumed": 0,
"groups_total": 14,
"checks": {
"manual_same_URI_different_revision_matches_only_corresponding_candidate": true,
"two_named_fields_are_a_conjunction_not_either_field": true,
"absent_field_differs_from_present_empty_value": true,
"empty_Vary_restriction_keeps_all_candidate_IDs_without_winner": true,
"any_wildcard_member_always_fails_direct_matching": true,
"field_names_ignore_case_but_declared_opaque_values_do_not": true,
"unnominated_fields_do_not_enter_the_matching_restriction": true,
"Vary_name_order_and_repetition_do_not_change_restriction": true,
"stored_and_field_order_leave_canonical_ID_result_unchanged": true,
"all_matching_candidates_remain_visible_without_Date_or_preference_choice": true,
"independent_universe_allowed_sets_finite_profiles_ONE_group": true,
"whole_exact_declaration_rejection_precedes_matching_ONE_group": true,
"inclusive_profile_caps_empty_inputs_and_one_beyond_limits": true,
"immutable_nonempty_results_preserved_inputs_and_intervening_isolation": true
},
"limits": [
"Pre-parsed declared singleton fields only; duplicate request fields rejected by own admission policy, not general HTTP syntax.",
"Only field NAMES are normalized to lowercase; declared opaque values stay exact, with absent distinct from present empty.",
"Any wildcard member fails direct matching; origin revalidation is a separate unimplemented path.",
"All matching IDs returned: no Date/preference winner, freshness/storage permission/authorization/304/reuse or server/cache deployment.",
"No real calibration, performance, memory, confidentiality or comprehensive protocol/security claim; finite comparisons are one group."
]
}
خروجی، تاپلِ شناسهها با ترتیبِ عددیِ قطعی است؛ این ترتیب به معنیِ ترجیحِ پاسخ نیست. پاسخِ خالی یعنی در این شرط، نامزدی پیدا نشد. برنامه بدنهای نمیفرستد، کدِ وضعیت نمیسازد و با مبدأ تماس نمیگیرد. شناسهٔ منطبق نیز دربارهٔ تازگی یا مجوزِ دسترسی چیزی ثابت نمیکند.
۵. تطابقِ گونه، مجوزِ ارسالِ پاسخ نیست

پرسش اول: آیا نشانیِ یکسان برای پاسخِ قبلی کافی است؟ پاسخ: خیر؛ در مثالِ نسخهها، درخواستِ r2 فقط پاسخِ دو را نامزد کرد. محدودیتِ Vary از درخواستِ انتخابکننده میآید. بااینحال، این تابع بررسیِ همهٔ شرطهای استفادهٔ واقعی از کش را انجام نمیدهد.
پرسش دوم: فیلدِ خالی را میتوان حذف کرد؟ پاسخ: در قراردادِ حاضر خیر؛ حضور با رشتهٔ خالی از غیبت متفاوت است. شاهدِ شناسههای سه و چهار همین تفاوت را آشکار میکند. تبدیلِ بیاعلانِ یکی به دیگری میتواند مجموعهٔ نامزدها را عوض کند.
پرسش سوم: ستاره کنارِ یک نامِ معمولی چه میکند؟ پاسخ: همان عضوِ ستاره برای ردِ تطابقِ مستقیم کافی است. این حکم را به ممنوعیتِ همیشگیِ استفاده پس از اعتبارسنجیِ مبدأ تبدیل نمیکنیم؛ آن مسیر در مدل اجرا نشده است.
پرسش چهارم: چند شناسهٔ منطبق یعنی یکی را ارسال کنیم؟ پاسخ: خیر. ترجیحِ شناختهشده، Date، تازگی، سیاستِ ذخیرهسازی، مجوزدهی و اعتبارسنجی مراحلِ جدا هستند. این آزمایش، کارایی، محرمانگی یا سازگاریِ کاملِ یک کشِ واقعی را تأیید نمیکند.
دو سندِ اصلی در ماهِ June سالِ ۲۰۲۲ منتشر شدهاند و بخشهای دقیقِ یادشده در ۳۰ مهر ۱۴۰۵ کامل خوانده شدند؛ تاریخِ دسترسی، انتشارِ تازه نیست. متنهای مرتبط از نسخههای ذخیرهشدهٔ قبلاً منتشرشدهاند و مشاهدهٔ تازهٔ دسترسپذیریِ سایت محسوب نمیشوند. تمرین، آموزشیِ تألیفی و محدود است؛ هیچ اجرای سرویس یا نتیجهٔ اندازهگیریشدهٔ تجهیزات ادعا نمیشود.
منابع و مطالعهٔ بیشتر
بررسی منابع: ۳۰ مهر ۱۴۰۵. تحلیلها و پیشنهادهای اجرایی، جمعبندی نویسندهاند.

