<!DOCTYPE html><html lang="en"><head><title>index | repl</title><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="theme-color" content="#2d4247"><meta name="author" content="James Bowes"><meta name="twitter:site" content="@jrbowes"><meta name="twitter:creator" content="@jrbowes"><meta name="twitter:card" content="summary_large_image"><meta name="description" content="Articles about web programming, distributed systems, and security, by James Bowes"><meta property="og:description" content="Articles about web programming, distributed systems, and security, by James Bowes"><meta property="og:title" content="index"><meta property="og:site_name" content="repl"><meta property="og:url" content="https://repl.ca///"><meta property="og:type" content="website"><meta property="og:image" content="https://repl.ca/social-mushroom.jpg"><meta name="twitter:image" content="https://repl.ca/social-mushroom.jpg"><link rel="canonical" href="https://repl.ca///"><style>html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}h1{font-size:2em;margin:.67em 0}a{background-color:transparent}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}a,article,body,div,footer,h1,header,html,li,main,p,ul{box-sizing:border-box}.bb{border-bottom-style:solid;border-bottom-width:1px}.bw3{border-width:.5rem}.flex{display:flex}.flex-auto{flex:1 1 auto;min-height:0;min-width:0}.flex-none{flex:none}.flex-column{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.self-center{align-self:center}.order-1{order:1}.order-2{order:2}.fw3{font-weight:300}.fw4{font-weight:400}.fw5{font-weight:500}.tracked{letter-spacing:.1em}.tracked-tight{letter-spacing:-.05em}.tracked-mega{letter-spacing:.25em}.lh-solid{line-height:1}.link{text-decoration:none}.list{list-style-type:none}.w-90{width:90%}.red{color:#ff4136}.blue{color:#357edd}.pl0{padding-left:0}.pl1{padding-left:.25rem}.pl3{padding-left:1rem}.pv3{padding-bottom:1rem;padding-top:1rem}.ph3{padding-left:1rem;padding-right:1rem}.mv0{margin-bottom:0;margin-top:0}.mh3{margin-left:1rem;margin-right:1rem}.ttu{text-transform:uppercase}.f1{font-size:3rem}.f3{font-size:1.5rem}.f6{font-size:.875rem}.center{margin-left:auto;margin-right:auto}.dim{opacity:1}@media screen and (min-width:30em){.w-two-thirds-ns{width:66.66667%}.ph3-ns,.pl3-ns{padding-left:1rem}.ph3-ns{padding-right:1rem}.f-headline-ns{font-size:6rem}.f2-ns{font-size:2.25rem}.nowrap-ns{white-space:nowrap}}@media screen and (min-width:30em) and (max-width:60em){.mh4-m{margin-left:2rem;margin-right:2rem}.tc-m{text-align:center}}@media screen and (min-width:60em){.br-l{border-right-style:solid;border-right-width:1px}.bw3-l{border-width:.5rem}.bb-0-l{border-bottom-width:0}.flex-column-l{flex-direction:column}.flex-row-l{flex-direction:row}.self-start-l{align-self:flex-start}.order-last-l{order:99999}.pl2-l{padding-left:.5rem}.pl5-l{padding-left:4rem}.ph4-l{padding-left:2rem;padding-right:2rem}.mh5-l{margin-left:4rem;margin-right:4rem}.f-subheadline-l{font-size:5rem}}:root{--blue:#2d4247;--red:#a90f0a;--green:#2a5540;--beige:#cec8a8;--light-blue:#92b0c2;--light-red:#f88a87;--light-green:#8cc298;--light-orange:#f88f00;--light-yellow:#bab215;background-color:var(--beige);color:var(--blue);font-family:helvetica neue,helvetica,sans-serif}body{min-height:100vh}.blue{color:var(--blue)}.red{color:var(--red)}</style>
    <link rel="stylesheet" href="/css/style.css" media="print" onload="this.media='all'"><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"><script async="" src="https://www.googletagmanager.com/gtag/js?id=UA-103396477-1"></script><script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments);}
    gtag('js', new Date());

    gtag('config', 'UA-103396477-1');
  </script></head><body class="flex flex-column"><header class="bb bw3 mh5-l mh4-m mh3 flex flex-column flex-row-l ttu"><div class="bb bw3 bb-0-l br-l bw3-l flex-none ph3 ph4-l pv3 flex flex-row flex-column-l flex-wrap"><h1 class="mv0 fw4 tracked-mega f6 pl2-l flex-none order-2 self-center self-start-l"><a href="/" class="link blue">James Bowes</a></h1><h1 class="f3 f-subheadline-l lh-solid tracked-tight mv0 flex-auto order-1 order-last-l"><a href="/" class="link blue">repl</a></h1></div><div class="flex-auto pl3 pl5-l pv3 tc-m"><h1 class="f1 f-headline-ns lh-solid tracked mv0">website</h1><h1 class="f6 lh-solid mv0 fw5 tracked-mega pl1 pl3-ns nowrap-ns">1/128 scale realistic detail programming</h1></div></header><main class="flex-auto w-90 w-two-thirds-ns center ph3-ns"><ul class="list pl0"><li><article class="pv3"><header><h1 class="mv0 lh-solid f2-ns f3"><a class="link dim blue" href="one-sided-idempotence/">One-Sided Idempotence</a></h1><date class="f6 fw3 lh-solid ttu">03 Apr 2021</date></header><p>In the last post, we discussed the idempotency-key header, and how this header can be used to add
idempotence to otherwise non-idempotent HTTP methods (like POST) in REST APIs. We also touched on how many
HTTP methods are inherently idempotent, like DELETE. But just how idempotent is it, in practice?
</p><footer class="ttu f6"><a href="one-sided-idempotence/" class="red link dim">More &gt;</a></footer></article></li><li><article class="pv3"><header><h1 class="mv0 lh-solid f2-ns f3"><a class="link dim blue" href="what-is-the-idempotency-key-header/">What is the idempotency-key header?</a></h1><date class="f6 fw3 lh-solid ttu">24 Mar 2021</date></header><p>In Computer Science (and in its cooler older sibling, Mathematics) idempotence is a property of an action
(e.g. an API call) such that doing the action again with the same inputs produces the same result. In the context
of HTTP, a GET request is usually idempotent...
</p><footer class="ttu f6"><a href="what-is-the-idempotency-key-header/" class="red link dim">More &gt;</a></footer></article></li><li><article class="pv3"><header><h1 class="mv0 lh-solid f2-ns f3"><a class="link dim blue" href="modern-webhook-signatures/">Modern webhook signatures in 2021</a></h1><date class="f6 fw3 lh-solid ttu">20 Mar 2021</date></header><p>It&#x27;s 2021, and you work for Cat Bonnets Online. The bigwigs up on the top floor
just finished telling you over Zoom that the company is modernizing its strategy.
While half the company is converting the bonnets to NFTs (Nice Feline Toppings),
and the rest is working on a Clubhouse strategy, your team is adding
webhooks...
</p><footer class="ttu f6"><a href="modern-webhook-signatures/" class="red link dim">More &gt;</a></footer></article></li><li><article class="pv3"><header><h1 class="mv0 lh-solid f2-ns f3"><a class="link dim blue" href="what-is-x-hub-signature/">What is x-hub-signature?</a></h1><date class="f6 fw3 lh-solid ttu">19 Mar 2021</date></header><p>TL;DR x-hub-signature is an HTTP body only signing scheme from the WebSub standard...
</p><footer class="ttu f6"><a href="what-is-x-hub-signature/" class="red link dim">More &gt;</a></footer></article></li><li><article class="pv3"><header><h1 class="mv0 lh-solid f2-ns f3"><a class="link dim blue" href="fresh-start/">Fresh Start</a></h1><date class="f6 fw3 lh-solid ttu">24 Jul 2017</date></header><p>I&#x27;m redoing this website and not bothering to bring forward the old content...
</p><footer class="ttu f6"><a href="fresh-start/" class="red link dim">More &gt;</a></footer></article></li></ul></main><footer class="bt bw2 mh5-l mh3 mh4-m mt5 pt4 flex flex-column f7"><div class="flex flex-auto flex-wrap justify-center"><section class="flex-none ph2"><a class="dim black-60" href="https://github.com/jbowes">github</a></section><section class="flex-none ph2"><a class="dim black-60" href="https://github.com/jbowes/repl">source</a></section><section class="flex-none ph2"><a class="dim black-60" href="https://twitter.com/jrbowes">twitter</a></section><section class="flex-none ph2"><a class="dim black-60" href="https://www.linkedin.com/in/jbowes/">linkedin</a></section><section class="flex-none ph2"><a class="dim black-60" href="https://stackoverflow.com/story/jbowes">stack overflow</a></section></div><section class="flex-auto mv3 tc i black-60">Copyright © 2017 — 2021 James Bowes</section></footer></body></html>