<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>http on Ikoma's Blog</title><link>https://blog.yusukeikoma.com/tags/http/</link><description>Recent content in http on Ikoma's Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 10 Sep 2026 11:23:25 +0900</lastBuildDate><atom:link href="https://blog.yusukeikoma.com/tags/http/index.xml" rel="self" type="application/rss+xml"/><item><title>A WebSocket Origin Check Blocks Other Websites, Not Other Clients</title><link>https://blog.yusukeikoma.com/posts/websocket-origin-check-is-not-authentication/</link><pubDate>Thu, 10 Sep 2026 11:23:25 +0900</pubDate><guid>https://blog.yusukeikoma.com/posts/websocket-origin-check-is-not-authentication/</guid><description>The Origin header on a WebSocket handshake is set by browsers and can be set to anything by every other client. So an allow-list protects a cookie-authenticated browser session from other sites, and it proves nothing about who is connecting. A runnable server, a real headless-browser attack, and the handshake rule that follows.</description></item><item><title>Cancel the Stream, Not the Connection, When One HTTP/2 Request Times Out</title><link>https://blog.yusukeikoma.com/posts/http2-timeout-stream-vs-connection/</link><pubDate>Tue, 08 Sep 2026 12:56:00 +0900</pubDate><guid>https://blog.yusukeikoma.com/posts/http2-timeout-stream-vs-connection/</guid><description>A request deadline fired on a connection that carries many requests at once. Do you close the connection, or only the request? In a small Node lab, closing the HTTP/2 session failed two innocent requests, while cancelling only the stream let them finish on the same TCP connection. The same lab shows the one case where cancelling is not enough: a lost packet stalls every stream on a TCP connection, and a connection-level PING is the right way to tell.</description></item><item><title>Resuming an Event Stream with a Cursor, a Bounded Log and a Snapshot</title><link>https://blog.yusukeikoma.com/posts/resumable-streams-cursors-last-event-id-snapshots/</link><pubDate>Fri, 04 Sep 2026 19:26:37 +0900</pubDate><guid>https://blog.yusukeikoma.com/posts/resumable-streams-cursors-last-event-id-snapshots/</guid><description>How a client catches up after a reconnect without losing state, without duplicates, and without re-reading history. Built in steps (versions 0 to 4), from &amp;ldquo;read everything again&amp;rdquo; to a bounded log with a snapshot fallback, with what a real browser&amp;rsquo;s EventSource does on reconnect and on a non-200 response, a snapshot-ordering bug, and a decision tree.</description></item><item><title>Retries Duplicate Your Writes, and Exactly-Once Won't Save You</title><link>https://blog.yusukeikoma.com/posts/exactly-once-delivery-idempotency-and-backoff/</link><pubDate>Fri, 28 Aug 2026 10:07:45 +0900</pubDate><guid>https://blog.yusukeikoma.com/posts/exactly-once-delivery-idempotency-and-backoff/</guid><description>When a request times out, the client cannot tell whether the request or only its acknowledgement was lost. This is why exactly-once delivery cannot be built, and why effectively-once processing is at-least-once delivery plus a receiver that deduplicates. A runnable experiment with a flaky network, the bug that still duplicates 89 of 200 requests, an atomic dedupe store, and a jitter simulation.</description></item></channel></rss>