H2O

Language: C · View source on GitHub

Dockerfile

FROM ubuntu:24.04 AS build
RUN apt-get update && apt-get install -y cmake gcc g++ pkg-config libssl-dev zlib1g-dev git ruby bison && rm -rf /var/lib/apt/lists/*
RUN git clone --recurse-submodules --depth 1 https://github.com/h2o/h2o.git /src/h2o
WORKDIR /src/h2o/build
RUN cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DWITH_MRUBY=ON && make -j$(nproc) && make install

FROM ubuntu:24.04
RUN apt-get update && apt-get install -y libssl3t64 && rm -rf /var/lib/apt/lists/*
COPY --from=build /usr/local/bin/h2o /usr/local/bin/
COPY --from=build /usr/local/share/h2o/ /usr/local/share/h2o/
COPY src/Servers/H2OServer/h2o.conf /etc/h2o/h2o.conf
RUN mkdir -p /var/www && echo "OK" > /var/www/index.html
ENTRYPOINT ["h2o", "-c", "/etc/h2o/h2o.conf"]

Source

listen: 8080
hosts:
  default:
    paths:
      /:
        mruby.handler: |
          proc {|env|
            if env["PATH_INFO"] == "/echo"
              body = ""
              env.each do |k, v|
                if k.start_with?("HTTP_")
                  name = k.sub("HTTP_", "").split("_").map(&:capitalize).join("-")
                  body += "#{name}: #{v}\n"
                end
              end
              body += "Content-Type: #{env['CONTENT_TYPE']}\n" if env['CONTENT_TYPE'] && !env['CONTENT_TYPE'].empty?
              body += "Content-Length: #{env['CONTENT_LENGTH']}\n" if env['CONTENT_LENGTH'] && !env['CONTENT_LENGTH'].empty?
              [200, {"content-type" => "text/plain"}, [body]]
            elsif env["PATH_INFO"] == "/cookie"
              body = ""
              if env["HTTP_COOKIE"]
                env["HTTP_COOKIE"].split(";").each do |pair|
                  trimmed = pair.lstrip
                  eq = trimmed.index("=")
                  if eq && eq > 0
                    body += "#{trimmed[0...eq]}=#{trimmed[(eq+1)..]}\n"
                  end
                end
              end
              [200, {"content-type" => "text/plain"}, [body]]
            elsif env["REQUEST_METHOD"] == "POST"
              body = env["rack.input"] ? env["rack.input"].read : ""
              [200, {"content-type" => "text/plain"}, [body]]
            else
              [200, {"content-type" => "text/plain"}, ["OK"]]
            end
          }

Test Results

Loading results...

Compliance

Smuggling

Malformed Input

Caching

Cookies