Edit

kc3-lang/kc3/test/http/15_range_large_response.kc3

Branch :

  • Show log

    Commit

  • Author : thodg Thomas de Grivel
    Date : 2026-09-25 19:53:54
    Hash : 5b5973b6
    Message : detect TLS over HTTP connection and refuse to answer with an error log message.

  • test/http/15_range_large_response.kc3
  • require HTTPd.Static
    require Socket
    require Socket.Buf
    require Thread
    
    do
      path = "15_range_large_response_fixture.bin"
      a = "A"
      b = "B"
      c = "C"
      d = "D"
      i = 0
      while i < 16 do
        a = a + a
        b = b + b
        c = c + c
        d = d + d
        i = i + 1
      end
      content = a + b + c + d
      File.write_str(path, content)
    
      first = 4093
      last = 200123
      request = %HTTP.Request{method: GET,
                              headers: [{"Range",
                                         "bytes=#{first}-#{last}"}]}
      response = HTTPd.Static.show(request, ".", "/#{path}")
    
      server = Socket.listen("127.0.0.1", "57005")
      client = Socket.Buf.connect("127.0.0.1", "57005")
      server_client = Socket.Buf.accept(server)
      writer = Thread.new(fn () {
        HTTP.Response.buf_write(response, server_client.buf_rw.w, true)
      })
      received = HTTP.Response.buf_parse(client.buf_rw.r, false)
    
      body_size = last - first + 1
      body_buf = Buf.new_alloc((Uw) body_size)
      remaining = ^ body_size
      chunks = 0
      while remaining > 0 do
        chunk_size = if remaining < 65536 do remaining else 65536 end
        Buf.xfer(body_buf, client.buf_rw.r, (Uw) chunk_size)
        remaining = remaining - chunk_size
        chunks = chunks + 1
      end
      body = Buf.read_to_str(body_buf)
      Buf.delete(body_buf)
      Thread.delete(writer)
    
      expected = Str.slice(content, first, last + 1)
      result = {received.code,
                HTTP.Response.header_get(received, "Accept-Ranges"),
                HTTP.Response.header_get(received, "Content-Length"),
                HTTP.Response.header_get(received, "Content-Range"),
                chunks,
                Str.size(body),
                body == expected,
                Str.slice(body, 61435, 61451),
                Str.slice(body, 126971, 126987),
                Str.slice(body, 192507, 192523)}
    
      Socket.Buf.close(server_client)
      Socket.Buf.close(client)
      Socket.close(server)
      File.unlink(path)
      result
    end