Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-07.03

Headers, bodies ve media types

Mesajın nerede bittiği, bytes’ın nasıl decode edildiği ve oluşan verinin kabul edilmesi ayrı kararlardır. Çay içeren küçük bir request ile bu katmanları takip et.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

UTF-8 JSON: 200

  1. Serialized content hazır

    Duru’nun benign content’i UTF-8 olarak hazırlanır; byte ve code point ölçüsü ayrı.

    Browser / Duru
    {"title":"Çay"}; 16 byte; response bekleniyor
    Atlas Application
    Request yok
    Resource / yerel state
    Title: Draft
  2. Complete request ulaştı

    Content-Length ile eşleşen complete content Application’da; henüz parse veya commit yapılmadı.

    Browser / Duru
    {"title":"Çay"}; 16 byte; response bekleniyor
    Atlas Application
    Complete 16 byte; application/json
    Resource / yerel state
    Title: Draft
  3. Media policy

    Endpoint yalnız application/json kabul eder. Bu format supported.

    Browser / Duru
    Response bekleniyor
    Atlas Application
    Media allowed; parse bekleniyor
    Resource / yerel state
    Title: Draft
  4. JSON parse

    JSON syntax geçerlidir ve title string Çay olarak parse edilir; schema kararı ve record commit henüz yapılmaz.

    Browser / Duru
    Response bekleniyor
    Atlas Application
    Parsed; title string
    Resource / yerel state
    Title: Draft
  5. Schema ve action kararı

    String schema şartı sağlanır ve bu örnekte izin verilmiştir; title commit edilir.

    Browser / Duru
    Response bekleniyor
    Atlas Application
    Accepted
    Resource / yerel state
    Title: Çay
  6. Response formatını seç

    Status 200 ve text/plain result 4 byte; response request type’ından kopyalanmaz.

    Browser / Duru
    Response bekleniyor
    Atlas Application
    200 hazır; text/plain; 4 byte
    Resource / yerel state
    Title: Çay
  7. Result Browser’a ulaştı

    Response headers ve content Browser’da; title state’i yalnız accepted branch’te değişti.

    Browser / Duru
    200 alındı; Çay
    Atlas Application
    200 hazır; text/plain; 4 byte
    Resource / yerel state
    Title: Çay

Media policy: 415

  1. Serialized content hazır

    Duru’nun benign content’i UTF-8 olarak hazırlanır; byte ve code point ölçüsü ayrı.

    Browser / Duru
    {"title":"Çay"}; 16 byte; response bekleniyor
    Atlas Application
    Request yok
    Resource / yerel state
    Title: Draft
  2. Complete request ulaştı

    Content-Length ile eşleşen complete content Application’da; henüz parse veya commit yapılmadı.

    Browser / Duru
    {"title":"Çay"}; 16 byte; response bekleniyor
    Atlas Application
    Complete 16 byte; text/plain
    Resource / yerel state
    Title: Draft
  3. Media policy

    Endpoint yalnız application/json kabul eder. text/plain unsupported; parser çağrılmaz.

    Browser / Duru
    Response bekleniyor
    Atlas Application
    Media rejected; 415 seçildi
    Resource / yerel state
    Title: Draft
  4. Schema ve yazma atlandı

    Media type reddedildiği için parser ve schema çalıştırılmaz; title alanına yazma yapılmaz. Mevcut Draft değeri korunur. Bu aşama yapılmamış schema kontrolünün sonucu değildir.

    Browser / Duru
    Response bekleniyor
    Atlas Application
    Rejected; no commit
    Resource / yerel state
    Title: Draft
  5. Response formatını seç

    Status 415 ve text/plain result 22 byte; response request type’ından kopyalanmaz.

    Browser / Duru
    Response bekleniyor
    Atlas Application
    415 hazır; text/plain; 22 byte
    Resource / yerel state
    Title: Draft
  6. Result Browser’a ulaştı

    Response headers ve content Browser’da; title state’i yalnız accepted branch’te değişti.

    Browser / Duru
    415 alındı; Unsupported media type
    Atlas Application
    415 hazır; text/plain; 22 byte
    Resource / yerel state
    Title: Draft

Schema: 422

  1. Serialized content hazır

    Duru’nun benign content’i UTF-8 olarak hazırlanır; byte ve code point ölçüsü ayrı.

    Browser / Duru
    {"title":123}; 13 byte; response bekleniyor
    Atlas Application
    Request yok
    Resource / yerel state
    Title: Draft
  2. Complete request ulaştı

    Content-Length ile eşleşen complete content Application’da; henüz parse veya commit yapılmadı.

    Browser / Duru
    {"title":123}; 13 byte; response bekleniyor
    Atlas Application
    Complete 13 byte; application/json
    Resource / yerel state
    Title: Draft
  3. Media policy

    Endpoint yalnız application/json kabul eder. Bu format supported.

    Browser / Duru
    Response bekleniyor
    Atlas Application
    Media allowed; parse bekleniyor
    Resource / yerel state
    Title: Draft
  4. JSON parse

    Syntax valid; title number 123; syntax yine valid.

    Browser / Duru
    Response bekleniyor
    Atlas Application
    Parsed; title number
    Resource / yerel state
    Title: Draft
  5. Schema ve action kararı

    title alanı beklenen string schema’yı sağlamaz; bu fixture 422 hazırlar ve mevcut record’u değiştirmez.

    Browser / Duru
    Response bekleniyor
    Atlas Application
    Rejected; no commit
    Resource / yerel state
    Title: Draft
  6. Response formatını seç

    Status 422 ve text/plain result 13 byte; response request type’ından kopyalanmaz.

    Browser / Duru
    Response bekleniyor
    Atlas Application
    422 hazır; text/plain; 13 byte
    Resource / yerel state
    Title: Draft
  7. Result Browser’a ulaştı

    Response headers ve content Browser’da; title state’i yalnız accepted branch’te değişti.

    Browser / Duru
    422 alındı; Invalid title
    Atlas Application
    422 hazır; text/plain; 13 byte
    Resource / yerel state
    Title: Draft

ROLLER · STATE · VERİ AKIŞI

Header bir field’dır; her değer aynı kuralla birleşmez

HTTP fields name/value metadata taşır. Field name case-insensitive’dır: Content-Type ile content-type aynı tanımlı field’ı işaretler. Value yorumu ise field’ın sözleşmesine bağlıdır; tüm value’ları lowercase yapmak veya her tekrarlanan field’ı aynı biçimde comma ile birleştirmek doğru genel kural değildir. Bazı fields list syntax kullanır, bazıları tek değer ister; Content-Type singleton’dır.

Request’te Content-Type gönderilen content’in media format’ını bildirir; Accept client’ın response tercihlerini anlatır. Response Content-Type server’ın döndürdüğü representation’ı niteler. Birinin değeri diğerine otomatik kopyalanmaz. Content-Length message content’in octet uzunluğuyla ilgilidir; title metninin business uzunluğu veya media type değildir.

Headers control/metadata taşırken content uygulamanın işleyeceği bytes’ı taşır. Trailer fields ayrıca var olabilir, fakat header section’a keyfi sonradan eklenmiş eşdeğer veri sayılmaz. Bu fixture trailer kullanmaz. HTTP/1.1 header/body sınırındaki boş satır yalnız header’ın bittiğini gösterir; content’in nerede bittiği ayrıca framing kurallarına bağlıdır.

Request body: bytes → format → veri → policy

Duru POST /note-titles ile {"title":"Çay"} gönderir. UTF-8 serialization’daki Ç iki byte’tır. Body 15 Unicode code point ama 16 byte’tır; Content-Length: 16 body’nin UTF-8 bytes’ından hesaplanır. JS string.length de genel byte ölçüsü değildir; UTF-16 code units sayar. Başlıkların veya boş satırın byte’ları bu Content-Length hesabına eklenmez.

Application complete content’i aldıktan sonra allowed media type ve supported coding policy’sini uygular. application/json için JSON parser data structure üretir. Sonraki schema title’ın string olmasını, ürün policy’si ise bu harmless action’ın kabulünü kontrol eder. Content-Type: application/json header’ı JSON syntax’ın doğru olduğunu veya title’ın yetkili/uygun olduğunu kanıtlamaz.

Unsupported-media branch’inde aynı JSON’a benzeyen bytes text/plain olarak bildirilmiştir; bu endpoint sadece application/json kabul ettiği için 415 seçer ve parser çağırmaz. Schema branch’inde {"title":123} geçerli JSON’dır: parser başarılıdır ama string title şartı sağlanmaz, bu API 422 seçer. Bu örnek status mapping’idir; bütün JSON API’lerinin aynı validation status’unu zorunlu kullanacağı iddia edilmez.

Response body request’in aynası değildir

Normal action title state’ini Çay yapar ve result olarak Çay text’ini döndürür. Request media type application/json olsa da response Content-Type: text/plain; charset=utf-8’dır. Bu response content’i 3 code point, 4 byte’tır. Server’ın seçtiği response formatı ve client’ın onu okuma biçimi birbirine uygun olmalıdır; response.json() her başarılı request’in doğal devamı değildir.

Media type type/subtype ve tanımlı parameters içerir. text/plain için charset=utf-8 metin encoding’ini bildirir. application/json, application/x-www-form-urlencoded, multipart/form-data ve application/octet-stream farklı data biçimlerini veya processing context’lerini anlatır; bir file extension bunların güvenilir yerine geçmez. Multipart boundary parametresi parçaları ayırmak içindir, HTTP message framing’iyle aynı boundary değildir.

Response type doğru verilmelidir; Browser bazı context’lerde MIME sniffing yapabilir. nosniff özellikle script/style loading gibi belirli Fetch kontrollerini etkiler; bütün bytes’ı güvenli veri yapmaz, server input validation veya output-context korumasının yerine geçmez. Bu ders inert text gösterir; script evaluation veya sniffing denemesi çalıştırmaz.

Framing, content coding ve media format ayrı katmanlar

HTTP/1.1 fixture Content-Length ile content uzunluğunu önden bildirir; Transfer-Encoding kullanmaz. Chunked transfer coding farklı message delimitation sağlayabilir. Content-Encoding: gzip gibi coding ise representation data’nın üzerine uygulanan dönüşümdür; Content-Type decoded representation format’ını anlatır. Coding varsa Content-Length genellikle aktarılacak coded octets’ı sayar; sonradan açılmış metnin karakter sayısını değil.

Content-Type framing kararı vermez. Gönderici HTTP/1.1’de Content-Length ile Transfer-Encoding’i birlikte üretmemelidir. Bu ders çelişkili framing örneği veya parser differential çalıştırmaz; yalnız complete, tek framing kullanan benign messages ile kavramı öğretir. HTTP/2–3 ise text CRLF/chunked framing’ini aynen kullanmaz; version-specific stream framing ile content aktarır.

Application kararı parsing ile bitmez: resource ownership, izin verilen action, size/depth limits ve persistence ayrıca değerlendirilir. Burada permissionAllows=true ve küçük, sınırlandırılmış content verilmiştir. Gerçek limit enforcement, authentication veya store transaction çalıştırılmaz. Message’ın geçerli olması ile business action’ın kabul edilmesi ayrı başarı koşullarıdır.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Media gate

  1. Content label ile business data ayrıldı

    unsupported-media text/plain body JSON benzeri görünür. supportedRequestMediaTypes yalnız application/json’dur; görünüm media contract’ını değiştirmez.

    Content evidence
    text/plain / JSON-looking body
    Media/schema gate
    Kabul kararı bekliyor
    Title-state boundary
    Title state Draft
  2. Gate nedenleri sıralı ve ayrı

    Message tamamlanmıştır, fakat endpoint text/plain request media type’ını kabul etmez. JSON parser bu branch’te çağrılmaz. Bu yüzden syntax ve schema sonuçları null kalır; yapılmamış check’e başarılı veya başarısız sonucu uydurulmaz.

    Content evidence
    text/plain / JSON-looking body
    Media/schema gate
    Media false / parser not called
    Title-state boundary
    Title state Draft
  3. Reject branch state değiştirmedi

    Request kabul edilmediği için title state’i Draft olarak kalır; commit yapılmaz. Permission’ın verilmiş olması media veya schema failure’ını telafi etmez. Her zorunlu gate kendi koşulunu sağlamalıdır.

    Content evidence
    text/plain / JSON-looking body
    Media/schema gate
    Media false / parser not called
    Title-state boundary
    Draft unchanged / accepted=false
  4. Byte framing format değildir

    Normal request’te title değeri Çay olan JSON body, 15 code point ve 16 UTF-8 byte taşır. Çay response’u ise 3 code point ve 4 byte’tır. Content-Length byte sayısını, Content-Type interpreter seçimini belirtir; iki control farklı soruları yanıtlar.

    Content evidence
    Length bytes / media interpretation separate
    Media/schema gate
    Media false / parser not called
    Title-state boundary
    Draft unchanged / accepted=false
  5. Error response kendi type’ını taşır

    Media failure, 415 status ve text/plain türünde Unsupported media type döndürür. Bu rejection normal contract sonucu olabilir; tek başına saldırgan kimliği veya niyeti göstermez.

    Content evidence
    Length bytes / media interpretation separate
    Media/schema gate
    415 / Unsupported media type
    Title-state boundary
    Draft unchanged / accepted=false
  6. Business boundary korunarak bitti

    Reddedilen request title değerini değiştirmez. Content-Length’i HTTP stack yönetir; browser Fetch bu header’ı script’in belirlemesine izin vermez. Draft’ın korunduğu kararı application’ın beforeTitle ve afterTitle kayıtlarına dayanır.

    Content evidence
    Length bytes / media interpretation separate
    Media/schema gate
    415 / Unsupported media type
    Title-state boundary
    Reject / Draft retained

Schema gate

  1. Content label ile business data ayrıldı

    schema-rejected application/json body title=123 verir. JSON syntax valid olabilir, fakat title string schema’sını karşılamaz.

    Content evidence
    application/json / numeric title
    Media/schema gate
    Kabul kararı bekliyor
    Title-state boundary
    Title state Draft
  2. Gate nedenleri sıralı ve ayrı

    Message ve media koşulları uygundur; JSON parser da başarılıdır. Ancak title alanındaki sayı, string isteyen schema’ya uymaz. Parser başarısı, business schema veya permission başarısı değildir.

    Content evidence
    application/json / numeric title
    Media/schema gate
    Schema false / syntax true
    Title-state boundary
    Title state Draft
  3. Reject branch state değiştirmedi

    Request kabul edilmediği için title state’i Draft olarak kalır; commit yapılmaz. Permission’ın verilmiş olması media veya schema failure’ını telafi etmez. Her zorunlu gate kendi koşulunu sağlamalıdır.

    Content evidence
    application/json / numeric title
    Media/schema gate
    Schema false / syntax true
    Title-state boundary
    Draft unchanged / accepted=false
  4. Byte framing format değildir

    Normal request’te title değeri Çay olan JSON body, 15 code point ve 16 UTF-8 byte taşır. Çay response’u ise 3 code point ve 4 byte’tır. Content-Length byte sayısını, Content-Type interpreter seçimini belirtir; iki control farklı soruları yanıtlar.

    Content evidence
    Length bytes / media interpretation separate
    Media/schema gate
    Schema false / syntax true
    Title-state boundary
    Draft unchanged / accepted=false
  5. Error response kendi type’ını taşır

    Schema failure, 422 status ve text/plain türünde Invalid title döndürür. Request application/json diye response aynı parser’la okunmaz; response’un media contract’ı ayrıca değerlendirilir.

    Content evidence
    Length bytes / media interpretation separate
    Media/schema gate
    422 / Invalid title / text/plain
    Title-state boundary
    Draft unchanged / accepted=false
  6. Business boundary korunarak bitti

    Reddedilen request title değerini değiştirmez. Content-Length’i HTTP stack yönetir; browser Fetch bu header’ı script’in belirlemesine izin vermez. Draft’ın korunduğu kararı application’ın beforeTitle ve afterTitle kayıtlarına dayanır.

    Content evidence
    Length bytes / media interpretation separate
    Media/schema gate
    422 / Invalid title / text/plain
    Title-state boundary
    Reject / Draft retained

VARSAYIM · SINIR · KONTROL

Format etiketi güven kararı olamaz

Client Content-Type seçebilir; normal endpoint bunu uygun parser ve policy seçimi için kullanır. Sadece label’a güvenerek schema validation veya resource permission atlanırsa taşınan verinin beklenmedik business etkisi olabilir. Etki action ve persistence kapsamına bağlıdır; application/json bütün fields’ın trusted olduğu anlamına gelmez.

Kontrol ordered boundary’leri açık tutar: complete content, supported media/coding, syntax parse, schema, trusted action policy ve commit. Reject branch’inde commit olmamalıdır. Burada media rejection ve numeric title benign hatalardır; failure’ın nedeni “saldırgan bulundu” değil, endpoint contract’ının sağlanmamasıdır.

Byte sınırı ve processing context birlikte korunur

Unicode metni karakter sayısıyla frame etmek veya coded content’i decoded uzunlukla karşılaştırmak yanlış completeness varsayımı kurar. Ayrı bir hata da response type’ını request type’ından kopyalayıp client’ı farklı parser’a yönlendirmektir. Bu karışıklıklar reliability ve güven sınırlarının yanlış yorumlanmasına yol açabilir.

Serialization/framing established HTTP stack’e bırakılır; application bytes, encoding ve seçilen parser contract’ını belgeler. Browser Fetch bazı framing headers’ını application script’in yazmasına izin vermez; küçük örneğin raw metni gerçek Browser request üretim kodu sayılmamalıdır. Defensive inceleme declared ve observed formatı ayırır, uyuşmazlığı safe error ile sonlandırır.

3. Blue · Güvenli geliştirme ve savunma

Hareket olmadan bütün senaryoları oku

UTF-8 ledger

  1. Exact serialization bytes seçildi

    title değeri Çay olan request body’nin UTF-8 hex’i 7b227469746c65223a22c3876179227d, bodyOctets değeri 16’dır. Pretty-print sırasında eklenen bir newline bile byte sayısını değiştirir. Yeniden biçimlenmiş display, capture’daki byte’ların yerine geçmez.

    Serialization evidence
    Request15 points /16 bytes
    Decision review
    Decision review yok
    State-effect review
    State receipt yok
  2. Response encoding ayrı hesaplandı

    Çay response’u 3 code point ve 4 UTF-8 byte taşır. Content-Type değeri text/plain; charset=utf-8’dir. Request application/json olsa bile response’un JSON olduğu varsayılmaz.

    Serialization evidence
    Request15 points /16 bytes
    Decision review
    Response3 points /4 bytes / text/plain
    State-effect review
    State receipt yok
  3. Reject decision reason ayrı okundu

    unsupported-media case’inde 415 döner ve parserCalled false olur. schema-rejected case’inde ise 422 döner; syntaxValid true, schemaValid false’tur. Bunlar farklı failure location’larıdır. Karar reason’ı, secret veya bütün body audit’e kopyalanmadan korunur.

    Serialization evidence
    Request15 points /16 bytes
    Decision review
    415 media vs422 schema
    State-effect review
    State receipt yok
  4. State effect observation bağımsız

    Rejected rows beforeTitle=Draft, afterTitle=Draft verir. Normal accepted row Draft→Çay değişir; her iki outcome birlikte policy regression’a aittir.

    Serialization evidence
    Request15 points /16 bytes
    Decision review
    415 media vs422 schema
    State-effect review
    Reject Draft→Draft / normal Draft→Çay
  5. Inconsistency predicate coverage değildir

    accepted=false, stateChanged=true verilmiş positive inconsistency fixture’dır. XPath zero result eksik observation’dan da çıkabilir; body/framing/schema enforcement başarılı diye kaydedilmez.

    Serialization evidence
    Predicate mismatch / missing coverage separate
    Decision review
    415 media vs422 schema
    State-effect review
    Reject Draft→Draft / normal Draft→Çay
  6. Regression conclusion gereken evidence’ta

    UTF-8 serializer byte sayısını, JSON parser ise syntax sonucunu üretebilir. Media/schema kararı ve beforeTitle/afterTitle application’a aittir. Aynı /note-titles işleminin bu kayıtlarını ilişkilendir; HTTP status tek başına title’ın yazıldığını göstermez.

    Serialization evidence
    Predicate mismatch / missing coverage separate
    Decision review
    415 media vs422 schema
    State-effect review
    Serialization/decision/state consistent

State kanıtı yok

  1. Exact serialization bytes seçildi

    Bu incelemede rejected satırın afterTitle gözlemi erişilebilir değildir. beforeTitle=Draft ve accepted=false bilinir; verilen tam örnekteki afterTitle değerini eksik kaydın yerine kullanmayacağız. Önce hangi alanın gerçekten görüldüğünü ayır.

    Serialization evidence
    beforeTitle Draft / afterTitle gözlenmedi
    Decision review
    Decision review yok
    State-effect review
    State receipt yok
  2. Response encoding ayrı hesaplandı

    Çay response’u 3 code point ve 4 UTF-8 byte taşır. Content-Type değeri text/plain; charset=utf-8’dir. Request application/json olsa bile response’un JSON olduğu varsayılmaz.

    Serialization evidence
    Request15 points /16 bytes
    Decision review
    Response3 points /4 bytes / text/plain
    State-effect review
    State receipt yok
  3. Reject decision reason ayrı okundu

    unsupported-media case’inde 415 döner ve parserCalled false olur. schema-rejected case’inde ise 422 döner; syntaxValid true, schemaValid false’tur. Bunlar farklı failure location’larıdır. Karar reason’ı, secret veya bütün body audit’e kopyalanmadan korunur.

    Serialization evidence
    Request15 points /16 bytes
    Decision review
    415 media vs422 schema
    State-effect review
    State receipt yok
  4. State effect observation bağımsız

    Bu inceleme branch’i afterTitle observation’ını sunmaz. accepted=false decision’dan gerçek state unchanged sonucu tek başına çıkarılmaz; before/after observation gerekir.

    Serialization evidence
    Request15 points /16 bytes
    Decision review
    415 media vs422 schema
    State-effect review
    UNKNOWN: afterTitle
  5. Inconsistency predicate coverage değildir

    accepted=false, stateChanged=true verilmiş positive inconsistency fixture’dır. XPath zero result eksik observation’dan da çıkabilir; body/framing/schema enforcement başarılı diye kaydedilmez.

    Serialization evidence
    Predicate mismatch / missing coverage separate
    Decision review
    415 media vs422 schema
    State-effect review
    UNKNOWN: afterTitle
  6. Regression conclusion gereken evidence’ta

    UTF-8 ve reject decision fields bilinir, gerçek state effect UNKNOWN kalır. Tamamlanmış kontrol için aynı operation’a ait state observation istenir.

    Serialization evidence
    Predicate mismatch / missing coverage separate
    Decision review
    415 media vs422 schema
    State-effect review
    Bytes known / state unknown

UYGULAMA · GÜVENLİK KONTROLÜ · DOĞRULAMA

Byte hesabını gerçek serialization üzerinde yap

Artifact UTF-8 hex, Unicode code point count ve bodyOctets’ı birlikte verir. {"title":"Çay"} için 15/16; response Çay için 3/4 ayrımı görülebilir. Sadece JSON pretty-print’e yeni satır eklemek bile bytes’ı değiştirir; yeniden serialize edilen bir görünüm capture’daki content uzunluğu olmayabilir.

Manual exercise’de body’yi UTF-8 bytes olarak say, Content-Length ile eşleştir ve response media type’ını ayrı oku. Ardından schema branch’inde parser success ile commit decision’ını karşılaştır. Burada Python UTF-8 encoding ve JSON parser üzerinde local fixture doğrulaması yapılabilir; tam HTTP parser, server veya Browser testi değildir.

Reject kararında state değişmediğini kontrol et

Teaching observations accepted ve stateChanged alanlarını birlikte taşır. XPath accepted=false ama stateChanged=true fixture’ını seçer. Normal rows sıfır, purposely inconsistent pozitif fixture bir sonuç verir. Eksik observation ise “kontrol doğru” sonucu değil evidence gap’tir; production log şeması iddia edilmez.

Gerçek instrumentation’da media rejection, syntax failure ve semantic validation failure ayrı reason’lar olmalıdır; secret veya bütün request body loglanmaz. Body sample sadece gerekli ve sanitized ise değerlendirilir. Size ve parser resource limit’leri endpoint ihtiyacına göre ölçülür; buradaki küçük sayılar production budget önerisi değildir.

Server pipeline’ında request boyutunu buffering/parsing’den önce sınırla; ardından desteklenen media type, parser sonucu ve parsed object’in schema’sını kontrol et. Bu örnekte title string koşulu sağlanmadan Draft state’ini değiştirme. Content-Type application/json olması, title’ın geçerli olduğunu söylemez; numeric title syntax bakımından JSON olsa da 422 dalında kalır. 415 dalında parser çağrılmaması, 422 dalında ise storage değişmemesi ayrı doğrulama koşullarıdır. Normal Çay güncellemesi bu kontroller geçtikten sonra korunmalıdır.

ŞİMDİ VAKAYA UYGULA

Media, syntax, schema ve state effect hangi ayrı gate’lerde oluşur?

Not başlığı Çay olarak güncellenmek isteniyor. JSON body UTF-8 ile 16 byte taşır. Unsupported media type 415, sayı türündeki title ise 422 sonucu üretirken Draft state’i korunur. Response’un 4 byte’lık text/plain body’si request parser’ından ayrı okunur.

Vakadaki 200, media type ve parse error kayıtlarını ayrı değerlendir. Bu dersteki representation kurallarıyla usable data için henüz hangi koşulun gerektiğini açıkla.

Bağlı vaka dosyasını aç ↗

ÖRNEĞİ BİRLİKTE OKUYALIM

Çay serialization: bytes, media ve karar

Bir alan seç; hangi sonucu desteklediğini ve nerede yetersiz kaldığını incele.

Ham kaydı ve alan açıklamalarını oku
{
  "requestHttp11": "POST /note-titles HTTP/1.1\r\nHost: library.atlas.example\r\nContent-Type: application/json\r\nContent-Length: 16\r\n\r\n{\"title\":\"Çay\"}",
  "responseHttp11": "HTTP/1.1 200 OK\r\nDate: Thu, 08 Oct 2026 00:00:00 GMT\r\nContent-Type: text/plain; charset=utf-8\r\nContent-Length: 4\r\n\r\nÇay",
  "encoding": "UTF-8",
  "dateIsSynthetic": true,
  "contentEncoding": null,
  "transferEncoding": null,
  "supportedRequestMediaTypes": [
    "application/json"
  ],
  "schema": {
    "type": "object",
    "required": [
      "title"
    ],
    "properties": {
      "title": {
        "type": "string"
      }
    }
  },
  "rows": [
    {
      "case": "normal",
      "requestContentType": "application/json",
      "requestBody": "{\"title\":\"Çay\"}",
      "requestCodePoints": 15,
      "requestBodyOctets": 16,
      "requestContentLengthField": 16,
      "requestUtf8Hex": "7b227469746c65223a22c3876179227d",
      "messageComplete": true,
      "mediaAllowed": true,
      "parserCalled": true,
      "syntaxValid": true,
      "schemaValid": true,
      "permissionAllows": true,
      "accepted": true,
      "beforeTitle": "Draft",
      "afterTitle": "Çay",
      "status": 200,
      "responseContentType": "text/plain; charset=utf-8",
      "responseBody": "Çay",
      "responseCodePoints": 3,
      "responseBodyOctets": 4,
      "responseContentLengthField": 4
    },
    {
      "case": "unsupported-media",
      "requestContentType": "text/plain",
      "requestBody": "{\"title\":\"Çay\"}",
      "requestCodePoints": 15,
      "requestBodyOctets": 16,
      "requestContentLengthField": 16,
      "requestUtf8Hex": "7b227469746c65223a22c3876179227d",
      "messageComplete": true,
      "mediaAllowed": false,
      "parserCalled": false,
      "syntaxValid": null,
      "schemaValid": null,
      "permissionAllows": true,
      "accepted": false,
      "beforeTitle": "Draft",
      "afterTitle": "Draft",
      "status": 415,
      "responseContentType": "text/plain; charset=utf-8",
      "responseBody": "Unsupported media type",
      "responseCodePoints": 22,
      "responseBodyOctets": 22,
      "responseContentLengthField": 22
    },
    {
      "case": "schema-rejected",
      "requestContentType": "application/json",
      "requestBody": "{\"title\":123}",
      "requestCodePoints": 13,
      "requestBodyOctets": 13,
      "requestContentLengthField": 13,
      "requestUtf8Hex": "7b227469746c65223a3132337d",
      "messageComplete": true,
      "mediaAllowed": true,
      "parserCalled": true,
      "syntaxValid": true,
      "schemaValid": false,
      "permissionAllows": true,
      "accepted": false,
      "beforeTitle": "Draft",
      "afterTitle": "Draft",
      "status": 422,
      "responseContentType": "text/plain; charset=utf-8",
      "responseBody": "Invalid title",
      "responseCodePoints": 13,
      "responseBodyOctets": 13,
      "responseContentLengthField": 13
    }
  ],
  "selector": {
    "language": "XPath",
    "xml": "<observations><decision accepted=\"true\" stateChanged=\"true\"/><decision accepted=\"false\" stateChanged=\"false\"/></observations>",
    "xpath": "count(/observations/decision[@accepted=\"false\" and @stateChanged=\"true\"])",
    "expected": 0,
    "positiveFixtureXml": "<observations><decision accepted=\"false\" stateChanged=\"true\"/></observations>",
    "positiveExpected": 1,
    "scope": "Only authored protocol-decision observations, not product log field names or a live HTTP capture.",
    "missingFieldBehavior": "Missing observation is insufficient evidence; zero matches is not proof of correct runtime behavior."
  }
}
requestBodyOctets / requestCodePoints
UTF-8 bytes ile Unicode code points ayrı ölçülür; fixture’da 16/15.
parserCalled / schemaValid
Supported format syntax parse’tan, parse sonucu schema kararından ayrı.
responseContentType
Request application/json iken response text/plain olabilir.
afterTitle
Commit yalnız bütün acceptance kapıları geçildiğinde; iki rejection Draft’ı korur.
requestUtf8Hex
Body’nin inert UTF-8 byte gösterimi; parser/execution instruction değildir.

Özgün benign text ve valid JSON fixture’ları; contradictory framing veya executable payload yok. Permission supplied; parser/counter local doğrulaması gerçek HTTP service, Browser Fetch veya production limit testi değildir.

İki yanlış kanı

Content-Length JSON’daki karakter sayısıdır.

Serialization sonrası content octets’ını sayar. Bu UTF-8 örneğinde 15 code point 16 byte’tır; headers sayılmaz.

Content-Type application/json ise request geçerlidir ve response da JSON’dır.

Media declaration syntax, schema veya permission’ı kanıtlamaz. Response formatı ayrıca seçilir; normal fixture text/plain döndürür.

SIRA SENDE

Bu hikâyeyi sen çöz.

Sonucu tahmin et, kanıtın sınırını bul ve nedenini kendi cümlenle anlat.

JSON syntax geçerli, fakat title number. Schema-rejected branch state’i değiştirir mi?

  1. Evet. Parse edilen JSON otomatik business-valid olur.
  2. Hayır. 422 döner; Draft→Draft kalır.
Gerekçeli cevabı oku

Hayır. 422 döner; Draft→Draft kalır. — syntaxValid=true, schemaValid=false. Bu handler reddedilen input ile title yazmaz.

Çay üç code point içeriyor. Content-Length neden 4?

Dersten seçilen artifact alanları; öğretim örneği

rows[0].responseBody
Çay
rows[0].responseCodePoints
3
rows[0].responseBodyOctets
4
  1. Ç iki octet; a ve y birer octet.
  2. Uzunluk yanlış. Her Unicode karakter bir byte’tır.
Gerekçeli cevabı oku

Ç iki octet; a ve y birer octet. — Sıkıştırılmamış content 2+1+1=4 byte’tır. Framing uzunluğu code point sayısı değildir.

Content-Type=text/plain ile JSON’a benzeyen body gönderildi. Bu handler neden parser’ı çağırmadan 415 üretir?

Gerekçeli cevabı oku

Bu endpoint yalnız application/json kabul eder. Message tamamlanmış olsa da mediaAllowed=false olduğunda parserCalled=false kalır. Schema sonucu null’dır ve Draft state korunur. Bu sonuç bütün server’ların davranışını değil, bu endpoint’in sözleşmesini açıklar.

□ Media type kontrolü ile parsing’i ayırdım.

□ Reddedilen branch’te mutation olmadığını belirttim.

Uygulama konsolunu aç · request / response / browser
Request, URL, cookie ve DOM örneklerini ayrıca aç

Kaynaklar ve kapsam