-- fingerprinting example

Write[[<!doctype html>

<title>redbean binary trees</title>

<style>
  body { padding: 1em; }
  h1 a { color: inherit; text-decoration: none; }
  h1 img { border: none; vertical-align: middle; }
  input { margin: 1em; padding: .5em; }
  p { word-break: break-word; max-width: 650px; }
  dt { font-family: monospace; }
  dd { margin-top: 1em; margin-bottom: 1em; }
  .hdr { text-indent: -1em; padding-left: 1em; }
</style>

<h1>
  <a href="/"><img src="/redbean.png"></a>
  <a href="finger.lua">redbean finger demo</a>
</h1>

]]

Write[[
  <h2>Your TCP SYN Packet</h2>
]]
-- See .init.lua hooks which set SYN and SYNERR globals.
if syn then
   if syn ~= '' then
      Write('<dl>\r\n')
      Write('<dt>syn = unix.getsockopt(GetClientFd(), unix.SOL_TCP, unix.TCP_SAVED_SYN)\r\n')
      Write('<dd>')
      Write(EscapeHtml(EncodeLua(syn)))
      Write('\r\n')
      Write('<dt>finger.FingerSyn(syn)\r\n')
      Write('<dd>')
      Write(EscapeHtml(EncodeLua(finger.FingerSyn(syn))))
      Write('\r\n')
      Write('<dt>finger.DescribeSyn(syn)\r\n')
      Write('<dd>')
      Write(EscapeHtml(EncodeLua(finger.DescribeSyn(syn))))
      Write('\r\n')
      Write('<dt>finger.GetSynFingerOs(finger.FingerSyn(syn))\r\n')
      Write('<dd>')
      Write(EscapeHtml(EncodeLua(finger.GetSynFingerOs(finger.FingerSyn(syn)))))
      Write('\r\n')
      Write('</dl>\r\n')
   else
      Write([[
        <p>
          your operating system returned an empty string as the syn
          packet! did you remember to use setsockopt(TCP_SAVE_SYN)?
          did you call getsockopt(TCP_SAVED_SYN) more than once?
        </p>
      ]])
   end
else
   Write([[
     <p>
       your operating system most likely doesn't support TCP_SAVED_SYN
       because getsockopt() returned %s.
     </p>
   ]] % {EscapeHtml(tostring(synerr))})
end