Hacker DirectoryHacker Directory
Öğrenmeye devam et
ENHTML kaydet ↓

WEB / WEB-16.03

Routing, middleware ve handler

Method/path router seçimini, middleware’in local continuation kararını ve handler’ın response sahibi olmasını ayrı izle.

CORE · RED · BLUE · ARTIFACT · PRACTICE

1. Core · Mekanizma

Hareket olmadan bütün senaryoları oku

Sıralı GET

  1. Public GET hazır

    Client GET /notes?view=plain request’ini hazırlar; body yoktur ve server context’i henüz oluşmamıştır.

    Client / Duru
    GET hazır
    HTTP server
    Request yok
    Router / middleware
    Context yok
    Handler / result
    Sonuç yok
  2. Request ulaştı

    HTTP request server’a ulaşır; GET method ve target local request context’ini oluşturmak için kullanılabilir.

    Client / Duru
    Response bekliyor
    HTTP server
    GET target alındı
    Router / middleware
    Context bekliyor
    Handler / result
    Sonuç yok
  3. Local request ref

    Middleware local read-a correlation referansını oluşturur; next continuation network message değildir.

    Client / Duru
    Response bekliyor
    HTTP server
    Request context aktif
    Router / middleware
    request-ref tamamlandı
    Handler / result
    Sonuç yok
  4. Local route seçimi

    Router pathname /notes’i query view=plain’den ayırır; GET için noteRead handler’ını seçer.

    Client / Duru
    Response bekliyor
    HTTP server
    Request context aktif
    Router / middleware
    Route seçildi: noteRead
    Handler / result
    Handler bekliyor
  5. Local presentation

    Presentation middleware view state’ini hazırlar; handler’ın kullandığı preconditions artık tamamlanmıştır.

    Client / Duru
    Response bekliyor
    HTTP server
    Request context aktif
    Router / middleware
    Presentation hazır; sıralı trace
    Handler / result
    Handler hazır
  6. Local handler

    noteRead, Routed note içeren 200 response’u hazırlar; bu read akışında storage write veya commit yoktur.

    Client / Duru
    Response bekliyor
    HTTP server
    200 response hazırlandı
    Router / middleware
    Cycle tamamlandı
    Handler / result
    Routed note; 11 byte
  7. Local response end

    Terminal owner bir kez end çağırır; response’un OS’a verilmesi client’ın body’yi aldığı anlamına gelmez.

    Client / Duru
    Response bekliyor
    HTTP server
    end once; finish OS handoff
    Router / middleware
    Cycle tamamlandı
    Handler / result
    Persistence operation yok
  8. Response ulaştı

    200 response ve body client’a ulaşır; alınan content transport sonucudur, database commit kanıtı değildir.

    Client / Duru
    200 Routed note alındı
    HTTP server
    Exchange tamamlandı
    Router / middleware
    Cycle tamamlandı
    Handler / result
    Commit iddiası yok

Method uyuşmazlığı

  1. Public girdi hazır

    Client POST /notes request’ini hazırlar; örnek yalnız route/method kararını inceler ve application mutation içermez.

    Client / Duru
    Request hazır
    HTTP server
    Request yok
    Router / middleware
    Context yok
    Handler / result
    Sonuç yok
  2. Request ulaştı

    HTTP request server’a ulaşır; target ve method bilgisi local route seçimi için kullanılabilir.

    Client / Duru
    Response bekliyor
    HTTP server
    POST /notes alındı
    Router / middleware
    Context bekliyor
    Handler / result
    Sonuç yok
  3. Local request ref

    Middleware request correlation context’ini kurar; normal handler henüz çağrılmamıştır.

    Client / Duru
    Response bekliyor
    HTTP server
    Request context aktif
    Router / middleware
    request-ref tamamlandı
    Handler / result
    Handler çağrılmadı
  4. Local route seçimi

    Örneğin route sözleşmesi 405 seçer: /notes için GET route vardır, fakat gelen method eşleşmez; normal handler çağrılmaz.

    Client / Duru
    Response bekliyor
    HTTP server
    405 response seçildi
    Router / middleware
    GET route var; method eşleşmiyor
    Handler / result
    Handler çağrılmadı
  5. Local terminal

    Fallback, status 405, Allow: GET ve Method not allowed body’sini taşıyan tek terminal response’u hazırlar. Handler ve presentation aşamalarına geçilmez; bu, örneğin manual method policy’sidir.

    Client / Duru
    Response bekliyor
    HTTP server
    405 hazır; tek end
    Router / middleware
    Cycle tamamlandı
    Handler / result
    Handler çağrılmadı
  6. Response ulaştı

    HTTP 405 response ve Method not allowed metni client’a ulaşır; bu status bir network error değildir.

    Client / Duru
    405 Method not allowed alındı
    HTTP server
    Exchange tamamlandı
    Router / middleware
    Cycle tamamlandı
    Handler / result
    Handler çağrılmadı

Route yok

  1. Public girdi hazır

    Client GET /absent request’ini hazırlar; örnek route yokluğu kararını inceler ve mutation içermez.

    Client / Duru
    Request hazır
    HTTP server
    Request yok
    Router / middleware
    Context yok
    Handler / result
    Sonuç yok
  2. Request ulaştı

    HTTP request server’a ulaşır; target ve method bilgisi local route seçimi için kullanılabilir.

    Client / Duru
    Response bekliyor
    HTTP server
    GET /absent alındı
    Router / middleware
    Context bekliyor
    Handler / result
    Sonuç yok
  3. Local request ref

    Middleware request correlation context’ini kurar; normal handler henüz çağrılmamıştır.

    Client / Duru
    Response bekliyor
    HTTP server
    Request context aktif
    Router / middleware
    request-ref tamamlandı
    Handler / result
    Handler çağrılmadı
  4. Local route seçimi

    Örneğin route sözleşmesi 404 seçer; /absent için eşleşen route bulunmadığından normal handler çağrılmaz.

    Client / Duru
    Response bekliyor
    HTTP server
    404 response seçildi
    Router / middleware
    Eşleşen route yok
    Handler / result
    Handler çağrılmadı
  5. Local terminal

    Fallback 404 ve Route not found içeren tek terminal response hazırlar; ikinci completion engellenir.

    Client / Duru
    Response bekliyor
    HTTP server
    404 hazır; tek end
    Router / middleware
    Cycle tamamlandı
    Handler / result
    Handler çağrılmadı
  6. Response ulaştı

    HTTP 404 response ve Route not found metni client’a ulaşır; network transport hatası olarak yorumlanmaz.

    Client / Duru
    404 Route not found alındı
    HTTP server
    Exchange tamamlandı
    Router / middleware
    Cycle tamamlandı
    Handler / result
    Handler çağrılmadı

Handler error

  1. Error read hazır

    Client örneğin GET /notes/fail error route’unu seçer; request body yoktur ve henüz handler sonucu oluşmamıştır.

    Client / Duru
    GET fail hazır
    HTTP server
    Request yok
    Router / middleware
    Context yok
    Handler / result
    Sonuç yok
  2. Request ulaştı

    HTTP GET server’a ulaşır; method ve target local pipeline’ın request context’i kurması için hazırdır.

    Client / Duru
    Response bekliyor
    HTTP server
    GET fail alındı
    Router / middleware
    Context bekliyor
    Handler / result
    Sonuç yok
  3. Local preconditions

    Request-ref, route ve presentation stage’leri sırayla çalışır; /notes/fail için örnekteki error handler seçilir.

    Client / Duru
    Response bekliyor
    HTTP server
    Headers gönderilmedi
    Router / middleware
    Preconditions hazır
    Handler / result
    Error handler seçildi
  4. Local handler error

    Handler headers gönderilmeye başlamadan örnekteki error’u üretir; response veya body henüz gönderilmemiştir.

    Client / Duru
    Response bekliyor
    HTTP server
    Headers gönderilmedi
    Router / middleware
    Error continuation
    Handler / result
    Headers öncesi örnek error
  5. Local error map

    Error mapper kontrollü 500 ve Service unavailable response’unu hazırlar; body stack veya secret içermez.

    Client / Duru
    Response bekliyor
    HTTP server
    500 response hazır
    Router / middleware
    Terminal owner: error-map
    Handler / result
    Persistence operation yok
  6. Local terminal

    Tek terminal response için end çağrılır; bu akış headers gönderildikten sonraki stream recovery’yi modellemez.

    Client / Duru
    Response bekliyor
    HTTP server
    end once; finish OS handoff
    Router / middleware
    Cycle tamamlandı
    Handler / result
    Commit iddiası yok
  7. Response ulaştı

    Kontrollü 500 response client’a ulaşır; HTTP status ile response completion ayrı sonuçlar olarak okunur.

    Client / Duru
    500 Service unavailable alındı
    HTTP server
    Exchange tamamlandı
    Router / middleware
    Cycle tamamlandı
    Handler / result
    Commit iddiası yok

ROLLER · STATE · VERİ AKIŞI

Framework request execution’ını düzenler

Web framework runtime üzerinde request/response handling’i düzenleyen abstractions sağlar: router, middleware composition, handler/controller ve error path gibi. HTTP parsing veya JavaScript execution framework adından türemez. Express’in resmi guide’ı routing/middleware’i request-response cycle içindeki function call dizisi olarak anlatır. Bu dersin küçük manual Node pipeline’ı aynı görev ayrımını gösterir; Express’in bütün matching/error kurallarını uygulamaz.

Router hangi HTTP method ve route path için hangi handler’ın çalışacağını seçer. GET /notes?view=plain örneğinde pathname /notes ile query view=plain ayrı girdilerdir. Express route path query string içermez; başka framework’lerde matching, normalization ve sürüm kuralları değişebilir. URL path bir application object permission değildir; route eşleşmesi yalnız çalışacak code target’ını seçer.

Örneğin route table’ı yalnız GET /notes ve GET /notes/fail içerir. /notes’e farklı method geldiğinde bu manual sözleşme 405 ve Allow: GET döndürür; bütün framework’lerin otomatik aynı status’u seçtiği varsayılmaz. /absent için 404 sonucu çıkar. İki akış da handler’a geçmeden tamamlanır; bu kararlar route table’a ve method policy’sine bağlıdır.

Middleware state üretir veya cycle’ı kapatır

Middleware request context’ini okuyabilir veya değiştirebilir, response hazırlayabilir, error üretebilir ya da next continuation’a geçebilir. Express’te normal middleware cycle’ı bitirmiyorsa next() ile kontrolü ileri vermelidir; ikisini de yapmamak hanging request bırakabilir. Middleware’in mevcut olması bu request’te doğru sırada çalıştığını göstermez. Mount/path, method ve önceki component’in cycle’ı kapatması execution’ı etkiler.

Atlas pipeline önce requestRef üretir, sonra router method/path seçer, eşleşen route için presentation context’ini hazırlar ve handler’ı çağırır. Handler requestRef ile normalized view state’ini tüketir. Bu preconditions çalışma sırasıyla kurulur. Local next veya handler call HTTP packet değildir; aynı application process içindeki control flow’dur. Sahne client/server transfer ile local stage’leri bu yüzden ayırır.

Handler response ile cycle’ı kapattığında sonraki normal handler’a devam edilmez. Route yokluğu veya method mismatch fallback response’a gider. /notes/fail handler’ı headers başlamadan örnekteki error’u üretir; local error mapper kontrollü 500 ve Service unavailable metnini seçer. Bu, bütün Node/Express async exception’larının otomatik yakalandığı anlamına gelmez. Error contract, framework sürümü ve Promise/stream lifecycle ayrıca belirlenir.

Response’ın tek sahibi ve completion sınırları

Handler/controller input’u uygulama mantığına bağlar, domain sonucu ve representation’ı HTTP response’a dönüştürür. Controller adı database write veya transaction garantisi vermez. Public note handler yalnız Routed note okur; persistence operation yoktur. Stateful action’da commit, response preparation ve client observation aynı event değildir; storage sözleşmesi ayrı uygulanır.

Node response headersSent headers’in gönderildiğini, writableEnded end() çağrıldığını, writableFinished ise underlying system’e flush completion’ı anlatır. ServerResponse finish son response segment’inin transmission için OS’a verilmesidir; client received/read veya business commit kanıtı değildir. Örnekte final status ile client body ayrı okunur. Routed note 11 UTF-8 byte’dır; string character sayısı genel byte hesabı değildir.

Application terminal decision’ı tek bir bileşen sahiplenmelidir. Headers başladıktan sonra farklı status/body ile ikinci normal response üretmek geçerli lifecycle değildir; stream/error sonucuna göre connection handling farklı olabilir. Örneğin terminal guard’ı ikinci logical completion denemesini gönderimden önce durdurur. Header sonrası network abort veya persistence failure için pre-header error mapper’ın aynı çözüm olduğu söylenemez.

2. Red · Güven ve etki

Hareket olmadan bütün senaryoları oku

Method mismatch

  1. Method ve pathname seçildi

    MethodMismatch POST /notes için hazırlanmıştır. Path’in routeTable’da görünmesi method gate’inin de geçtiği anlamına gelmez.

    Request/completion context
    POST /notes
    Selection/runtime boundary
    Route selection yok
    Handler/business outcome
    Handler çağrılmadı
  2. Route table method’u okundu

    RouteTable /notes için GET ve noteRead eşleştirir. Bu finite public route contract POST’u handler’a yönlendirmez.

    Request/completion context
    POST /notes
    Selection/runtime boundary
    Expected method=GET
    Handler/business outcome
    Handler çağrılmadı
  3. Method gate’i handler’dan önce durdu

    handlerInvoked=false ve status=405 verilir. Allow=GET bu seçili route’un desteklediği method’u belirtir; object permission değildir.

    Request/completion context
    Method mismatch
    Selection/runtime boundary
    405; Allow=GET
    Handler/business outcome
    Handler invoked=false
  4. Presentation query permission sayılmadı

    Normal GET target’ında view=plain query’si pathname’den ayrıdır. Bu harmless presentation seçimi method veya authentication gate’ini değiştirmez.

    Request/completion context
    Method mismatch
    Selection/runtime boundary
    Query ≠ method/permission
    Handler/business outcome
    Handler invoked=false
  5. Response owner’ı açık kaldı

    Method not allowed body’si route selection boundary’sine aittir. RouteAbsent 404 ile methodMismatch 405 farklı nedenler taşır; ikisinde de handler çağrılmamıştır.

    Request/completion context
    Method not allowed
    Selection/runtime boundary
    Selection-level response
    Handler/business outcome
    No handler grant inferred
  6. Routing hükmü authorization’a büyümedi

    Bu case yalnız method/path dispatch sonucunu açıklamaktadır. Bir middleware’in listede bulunması bütün protected route’larda handler öncesi access kontrolü yaptığı kanıtı değildir.

    Request/completion context
    Known: method mismatch
    Selection/runtime boundary
    Known: no handler dispatch
    Handler/business outcome
    Authorization requires separate evidence

Finish sınırı

  1. Response completion metadata seçildi

    Completion endCalls=1 ve secondLogicalCompletionBlocked=true taşır. Terminal response state’i business commit veya client receipt ile aynı field değildir.

    Request/completion context
    Completion record
    Selection/runtime boundary
    Transport state okunmadı
    Handler/business outcome
    Business/receipt bilinmiyor
  2. Sent ve ended state okundu

    headersSentAfterTerminal ve writableEndedAfterTerminal true’dur. Bu local API state’leri ikinci logical completion guard’ından ayrı okunur.

    Request/completion context
    Terminal response
    Selection/runtime boundary
    Headers sent; writable ended
    Handler/business outcome
    Business/receipt bilinmiyor
  3. Finish boundary doğru yorumlandı

    finishMeansOSHandOff=true, finishProvesClientReceived=false’tur. Server’ın OS’ye teslimi remote browser’ın bütün body’yi okuduğunu göstermez.

    Request/completion context
    Terminal response
    Selection/runtime boundary
    OS handoff only
    Handler/business outcome
    Client receipt not proven
  4. Persistence evidence yokluğu korundu

    persistenceOperation=null ve commitProven=false’tur. Read response hazırlanması storage mutation veya committed transaction sonucu üretmez.

    Request/completion context
    Read completion
    Selection/runtime boundary
    No persistence operation
    Handler/business outcome
    Commit not proven
  5. Unsupported success claim durduruldu

    Finish observation’a committed=true eklemek business state’i uydurur. Client success göstergesi ve storage success kendi source result’larını ister.

    Request/completion context
    Known: terminal response state
    Selection/runtime boundary
    Transport/persistence separate
    Handler/business outcome
    No inferred commit/receipt
  6. Terminal guard’ın scope’u korundu

    İkinci logical completion bloke edilmiştir; gerçek malformed response üretilmez. Bu local guard tek başına network delivery veya tüm error handling garantisi değildir.

    Request/completion context
    One logical completion
    Selection/runtime boundary
    Second completion blocked
    Handler/business outcome
    UNKNOWN: client receipt

VARSAYIM · SINIR · KONTROL

Route eşleşmesi permission değildir

Method/path eşleşmesi request’in hangi code’a ulaşacağını seçer; user, tenant veya object authorization’ını kendiliğinden doğrulamaz. Middleware’in mevcut olması da kontrolün o route’ta handler’dan önce çalıştığının kanıtı değildir. Yanlış varsayım routing/presentation context’ini authoritative access decision saymaktır. Personalized operation’daki etki uygulamanın kontrol zincirine bağlıdır; bu dersin public read handler’ı identity kabul etmez.

Yanlış ordering handler’ın henüz üretilmemiş context’i kullanmasına veya early terminal response’un sonraki observation stage’ini atlamasına yol açabilir. Kontrol, dependency’leri ve hangi stage’in next veya terminal seçtiğini açık tutmaktır. Public note için beklenen trace request-ref→route→presentation→handler’dir. Normal trace uyuşmazlığı debugging kanıtıdır; otomatik policy bypass veya compromise hükmü değildir.

Completion’a taşıdığından fazla anlam yükleme

Server finish event’ini client successful action veya committed transaction diye yorumlamak gözlem sınırını aşar. Normal read için body arrival client tarafında doğrulanabilir; persistence için ayrıca storage result gerekir. Sorun transport/local lifecycle ile business state’i tek success alanına indirmektir. Etki operation’a bağlı stale UI, yanlış confirmation veya error handling karışıklığı olabilir.

Pre-header handler error’unu kontrollü 500’a çevirmek bir failure sınırıdır. Headers başladıktan sonra aynı çözümü denemek duplicate response veya truncated transfer sorunlarına gidebilir. Terminal owner, sent/ended/finished state ve exception phase birlikte tutulur; ikinci completion gönderimden önce durdurulur. Bu kontrolün varlığıyla 500 gözlemi de ayrı değerlendirilir: status tek başına data leak veya saldırı kanıtı değildir.

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

Hareket olmadan bütün senaryoları oku

Pre-header error

  1. Handler error evidence seçildi

    GET /notes/fail için handlerError kaydı incelenir. Hatanın beforeHeaders=true olması error response üretiminin belirleyici koşuludur.

    Route/error observation
    GET /notes/fail
    Stage/owner review
    Stage trace okunmadı
    Outcome evidence scope
    Final outcome bilinmiyor
  2. Expected stage trace karşılaştırıldı

    Trace request-ref, route, presentation, handler ve error-map sırasını taşır. Error-map handler’dan sonraki terminal owner’dır; aynı handler success sonucu değildir.

    Route/error observation
    GET /notes/fail
    Stage/owner review
    Handler → error-map
    Outcome evidence scope
    Final outcome bilinmiyor
  3. Pre-header error mapping okundu

    status=500 ve body=Service unavailable olarak verilmiştir. Bu controlled mapping, headers başladıktan sonraki streaming error’larına otomatik uygulanmış sayılmaz.

    Route/error observation
    Known: beforeHeaders=true
    Stage/owner review
    Terminal owner=error-map
    Outcome evidence scope
    500 Service unavailable
  4. Error status attack evidence sayılmadı

    500 bir server-side failure sonucu olabilir; bu kayıttan data leak veya kötü niyetli actor teşhisi çıkarılmaz. İç cause ile dış response farklı observation alanlarıdır.

    Route/error observation
    Known: controlled error mapping
    Stage/owner review
    Internal cause not established
    Outcome evidence scope
    No actor attribution
  5. Client delivery kanıtı ayrı bırakıldı

    Terminal status/body server sonucudur. Server finish, client receipt ve DOM feedback için ayrıca gözlem gerekir; burada bu eksik alanlar tamamlanmaz.

    Route/error observation
    Declared 500 response
    Stage/owner review
    Before-header scope retained
    Outcome evidence scope
    UNKNOWN: actual client receipt
  6. Error boundary hükmü kapandı

    Bu row handler error’unun error-map’e before-headers koşuluyla geçtiğini gösterir. Post-header termination veya transaction rollback sonucu bu fixture’ın dışındadır.

    Route/error observation
    Known: handler/error-map order
    Stage/owner review
    Known: controlled response
    Outcome evidence scope
    Other error phases unknown

Trace eksik

  1. Normal trace inceleme kapsamı daraltıldı

    Bu branch normal trace’in request-ref ve route prefix’ini inceler. Presentation ve handler observation’ları verilmediğinde source yokluğu ayrı işaretlenir.

    Route/error observation
    Normal trace prefix
    Stage/owner review
    Later-stage evidence missing
    Outcome evidence scope
    Handler sonucu bilinmiyor
  2. Route selection kanıtı okundu

    GET /notes?view=plain için pathname=/notes seçilmiştir. Handler adı noteRead olması, handler’ın bu kısmi observation’da çalıştığını göstermez.

    Route/error observation
    GET pathname=/notes
    Stage/owner review
    Selected handler=noteRead
    Outcome evidence scope
    Handler execution unknown
  3. Dependency state eksikliği korundu

    Presentation hazır olduktan sonra handler’a geçilmesi beklenir. Missing presentation kaydı, stage atlandı veya tamamlandı diye iki yönde de kesin yorumlanmaz.

    Route/error observation
    Selected normal route
    Stage/owner review
    Presentation evidence missing
    Outcome evidence scope
    UNKNOWN: stage progression
  4. Missing log bypass sayılmadı

    Middleware listesi veya eksik event, protected route permission kontrolünün sonucu değildir. Public read fixture authentication kabul etmez; grant icat edilmez.

    Route/error observation
    Selected normal route
    Stage/owner review
    Incomplete stage trace
    Outcome evidence scope
    No authorization inference
  5. Tam source trace istendi

    Aynı requestRef ve terminal owner scope’undaki presentation, handler ve completion observation’ları gerekir. Raw credential veya tüm response body eklemek stage boşluğunu çözmez.

    Route/error observation
    Request correlation scope
    Stage/owner review
    Complete trace evidence required
    Outcome evidence scope
    UNKNOWN: execution outcome
  6. Kısmi trace hükmü kapsamlı kaldı

    Route seçimi bilinir; handler execution ve terminal outcome bu kısmi kapsamda UNKNOWN’dur. Expected trace, gözlenmiş trace yerine kullanılamaz.

    Route/error observation
    Known: selected route
    Stage/owner review
    UNKNOWN: later stages
    Outcome evidence scope
    UNKNOWN: terminal outcome

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

Route selection ile stage trace’ini ilişkilendir

RequestRef ile method, parsed pathname, query view ve seçilen handler’ı ilişkilendir. GET /notes?view=plain için pathname /notes, handler noteRead ve beklenen stage trace kaydedilir. Method mismatch akışında handlerInvoked=false ile 405 ve Allow: GET; route yokluğunda handlerInvoked=false ile 404 ayrı sonuçlardır. Gerçek telemetry field mapping server/framework’e bağlıdır; artifact bir runtime access-log formatı değildir.

Middleware pass, terminal ve error kararlarını aynı request context’inde incele. Request-ref ve presentation hazır olmadan handler’a girilmemesi beklenir. Log eksikse stage çalışmadı diye hüküm verme; source field’in absent olduğunu belirt. Router’ın doğru route’u seçmesi authorization kontrolünün yapıldığını göstermez. Personalized handler envanterinde gereken access decision ayrıca izlenir.

Final response ile business sonucunu ayır

Handler’ın terminal owner’ını, final status’unu ve body byte sayısını aynı exchange’e bağla. Normal Routed note response’u status=200 ve 11 byte body içerir. Fail route 500/Service unavailable, method mismatch 405/Method not allowed, missing route ise 404/Route not found verir. Error akışının beforeHeaders koşulunu koru; header sonrası stream sonucunu bu örnekten çıkarma.

Server writableEnded ve finish gözlemini client’ın body’yi almasından ayrı kaydet. Guard’ın ikinci logical completion’ı durdurduğu ve tek response end çağrısı olduğu local decision metadata’sından okunur. Bu read örneğinde persistence operation yoktur. Stateful service’te storage’ın commit/error sonucu ayrıca gözleneceği için transport finish’e committed=true eklenmez.

Artifact XPath’i persistenceObserved=false iken commitClaim=true yazılan response kayıtlarını sayar. Normal read sonucunda 0, desteklenmeyen commit yorumunda 1 eşleşme verir. Correlation yalnız response elementi içindedir; database audit veya distributed transaction query değildir. Element eksikken sonuç 0 olsa da commit’in doğru veya yanlış olduğu söylenemez.

Pass ve terminal kararını tek akışta uygula

Route ve middleware sırası yalnız log düzeni değildir: sonraki handler’a geçişi belirler. Gerekli request context hazır olmadan kişiselleştirilmiş handler’ı çalıştırma; access kararı gerekiyorsa bunu handler’dan önce ayrıca tamamla. Middleware ya akışı bitirir ya da açıkça sonraki aşamaya geçirir. Ret veya error sonucu üretildikten sonra normal handler’a devam edilmemeli; ortak response owner ikinci bir tamamlamayı kabul etmemelidir. Express kullanılıyorsa next ve error-handling middleware sözleşmesi izlenir; bu örneğin sade dispatcher’ı Express çalıştırıldığı anlamına gelmez.

Normal route’ta beklenen stage sırasını ve tek terminal sonucu doğrula. Method uyuşmazlığında 405 ile Allow: GET, bulunamayan route’ta 404 ve beforeHeaders error dalında 500 korunurken handler’ın çağrılmadığını ya da normal sonuç vermediğini kontrol et. Bu status’lar örneğin açık dispatch politikasıdır; her framework’ün kendiliğinden aynı kararı verdiği varsayılmaz. Stage kaydı eksikse sonuç bilinmiyordur; yalnız son status üzerinden middleware’in veya authorization kontrolünün çalıştığını kanıtlama.

ŞİMDİ VAKAYA UYGULA

Route match ve finish hangi business sonucunu kanıtlamaz?

Public read route’u method/path ile seçilir; middleware context, terminal owner ve client knowledge kendi boundaries’ında kalır.

Vakadaki input, server işleme ve response için karar sırasını çıkar. Parsed veya valid data ile completed operation aynı sonuç değildir; hangi owner’ın hangi koşulu değerlendirdiğini belirt.

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

ÖRNEĞİ BİRLİKTE OKUYALIM

Route selection ve terminal response defteri

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

Ham kaydı ve alan açıklamalarını oku
{
  "routeTable": [
    {
      "method": "GET",
      "pathname": "/notes",
      "handler": "noteRead"
    },
    {
      "method": "GET",
      "pathname": "/notes/fail",
      "handler": "fixtureReadFailure"
    }
  ],
  "normal": {
    "method": "GET",
    "target": "/notes?view=plain",
    "pathname": "/notes",
    "query": {
      "view": "plain"
    },
    "requestRef": "read-a",
    "trace": [
      "request-ref",
      "route",
      "presentation",
      "handler"
    ],
    "handlerInvoked": true,
    "status": 200,
    "body": "Routed note",
    "contentOctets": 11,
    "terminalOwner": "noteRead"
  },
  "methodMismatch": {
    "method": "POST",
    "pathname": "/notes",
    "bodyOctets": 0,
    "status": 405,
    "allow": "GET",
    "body": "Method not allowed",
    "handlerInvoked": false
  },
  "routeAbsent": {
    "method": "GET",
    "pathname": "/absent",
    "status": 404,
    "body": "Route not found",
    "handlerInvoked": false
  },
  "handlerError": {
    "method": "GET",
    "pathname": "/notes/fail",
    "trace": [
      "request-ref",
      "route",
      "presentation",
      "handler",
      "error-map"
    ],
    "beforeHeaders": true,
    "status": 500,
    "body": "Service unavailable",
    "terminalOwner": "error-map"
  },
  "completion": {
    "endCalls": 1,
    "secondLogicalCompletionBlocked": true,
    "headersSentAfterTerminal": true,
    "writableEndedAfterTerminal": true,
    "finishMeansOSHandOff": true,
    "finishProvesClientReceived": false,
    "persistenceOperation": null,
    "commitProven": false
  },
  "selector": {
    "language": "XPath",
    "xml": "<observations><response finish=\"true\" persistenceObserved=\"false\" commitClaim=\"false\"/></observations>",
    "xpath": "count(/observations/response[@persistenceObserved=\"false\" and @commitClaim=\"true\"])",
    "expected": 0,
    "positiveFixtureXml": "<observations><response finish=\"true\" persistenceObserved=\"false\" commitClaim=\"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."
  }
}
routeTable / normal
Method/path selection query’den ayrıdır; local stage sırası ayrıca tanımlanır.
methodMismatch / routeAbsent
Handler’a ulaşmadan tamamlanan farklı fallback kararları.
handlerError / completion
Headers başlamadan verilen kontrollü error ile transport/business completion ayrımı.

Public-read pipeline’ını anlatan inert örnektir. Exact matching, 405 ve error policy manual Node sözleşmesine aittir; Express execution veya database transaction kanıtı değildir.

İki yanlış kanı

Route eşleşti ve middleware var ise permission doğrulanmıştır.

Selection code target’ını belirler; gerekli access decision’ın doğru route ve sırada uygulanması ayrı sözleşmedir.

ServerResponse finish client success ve database commit’i kanıtlar.

Finish OS’a transmission handoff’tur; client body ve persistence result ayrı observation ister.

SIRA SENDE

Bu hikâyeyi sen çöz.

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

POST /notes için pathname biliniyor, fakat route table yalnız GET tanımlıyor. Handler çağrılır mı?

  1. Evet. Pathname eşleşmesi bütün method’ları açar.
  2. Hayır. 405 ve Allow: GET döner.
Gerekçeli cevabı oku

Hayır. 405 ve Allow: GET döner. — Path bulunuyor, fakat method eşleşmiyor; handlerInvoked=false. Hiç bulunmayan route için 404 ayrı bir branch’tir.

Response finish olayı, client’ın response aldığını kanıtlar mı?

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

completion.endCalls
1
completion.finishMeansOSHandOff
true
completion.finishProvesClientReceived
false
  1. Hayır. finish burada OS handoff sınırını gösterir.
  2. Evet. finish, client’ın body’yi parse ettiğini bildiren ACK’tir.
Gerekçeli cevabı oku

Hayır. finish burada OS handoff sınırını gösterir. — finishProvesClientReceived=false. Server’daki yerel tamamlanma, client’tan teslim onayı değildir.

Headers yazılmadan oluşan handler hatası 500’e dönüştürülüyor. İkinci response neden engellenmeli? Business commit hakkında ne bilinmiyor?

Gerekçeli cevabı oku

Hata headers’tan önce oluştuğu için error-map response’u oluşturabilir. endCalls=1 ve secondLogicalCompletionBlocked, ikinci terminal sonucu engeller. persistenceOperation=null olduğu için finish, 500 veya 200 business commit kanıtı değildir. Bu sıralı örnek, bütün framework’lerin error handling davranışını doğrulamaz.

□ Tek terminal response kararını açıkladım.

□ Response’un bitmesini business commit saymadım.

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

Kaynaklar ve kapsam