iocaine 3.0.0

The deadliest poison known to AI
Documentation
-- SPDX-FileCopyrightText: 2025 Gergely Nagy
-- SPDX-FileContributor: Gergely Nagy
--
-- SPDX-License-Identifier: MIT

function output(request, decision)
   local decision = decision or "default"

   local response = iocaine.Response()
   if decision == "default" then
      response.status = 421
   else
      make_garbage_response(request, response)
      METRIC_GARBAGE_GENERATED:inc_by(response.content_length, request:header("host"))
   end

   return response
end

function make_garbage_response(request, response)
   local context = generate_garbage(request)

   response.status = 200
   response:set_header("content-type", "text/html")
   response.body = ENGINE:render(TEMPLATE_HTML, context)
   if iocaine.config.minify then
      response:minify()
   end
end

function generate_garbage(request)
   local cfg = iocaine.config
   local rng = iocaine.generator.Rng:from_request(request, "default")
   local html_escape = iocaine.html_escape
   local urlencode = iocaine.urlencode

   local paragraphs = {}
   local paragraph_count = rng:in_range(
      cfg.garbage.paragraphs["min-count"],
      cfg.garbage.paragraphs["max-count"]
   )
   for i = 1, paragraph_count do
      paragraphs[i] = html_escape(
         MARKOV:generate(
            rng,
            rng:in_range(
               cfg.garbage.paragraphs["min-words"],
               cfg.garbage.paragraphs["max-words"]
            )
         )
      )
   end

   local links = {}
   local link_count = rng:in_range(
      cfg.garbage.links["min-count"],
      cfg.garbage.links["max-count"]
   )
   for i = 1, link_count do
      links[i] = {
         path = urlencode(
            WORDLIST:generate(
               rng,
               rng:in_range(
                  cfg.garbage.links["min-uri-parts"],
                  cfg.garbage.links["max-uri-parts"]
               ),
               cfg.garbage.links["uri-separator"]
            )
         ),
         text = html_escape(
            MARKOV:generate(
               rng,
               rng:in_range(
                  cfg.garbage.links["min-text-words"],
                  cfg.garbage.links["max-text-words"]
               )
            )
         )
      }
   end

   return {
      title = MARKOV:generate(
         rng,
         rng:in_range(
            cfg.garbage.title["min-words"],
            cfg.garbage.title["max-words"]
         )
      ),
      random_year = rng:in_range(895, 4269),
      random_author = html_escape(MARKOV:generate(rng, rng:in_range(1, 4))),
      request = {
         host = request:header("host"),
         uri = request.path,
      },
      garbage = {
         back_link = {
            enable = request.path == "/",
            text = html_escape(
               MARKOV:generate(
                  rng,
                  rng:in_range(
                     cfg.garbage.links["min-text-words"],
                     cfg.garbage.links["max-text-words"]
                  )
               )
            )
         },
         paragraphs = paragraphs,
         links = links,
      },
   }
end

return output