#!perl
use Cassandane::Tiny;

sub test_http_request_drop_connection ($self)
{
    $self->{store}->disconnect();
    my $sock = create_client_socket($self->{store}->{address_family},
                                    $self->{store}->{host},
                                    $self->{store}->{port});

    my @request = split /\n/, << 'FIN';
POST /some/url HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (redacted) Gecko/20100101 Firefox/130.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
Origin: http://www.example.com
DNT: 1
Connection: keep-alive
Referer: http://www.example.com/
Cookie: chocolate=chips

foo=bar&baz=qux
FIN
    foreach my $line (@request) {
        $sock->send("$line\015\012") or die "send: $!";
        last if not $sock->connected();
    }

    # if the connection hasn't been dropped already, send a logout so the
    # test doesn't hang
    $sock->send(". logout\015\012") if $sock->connected();

    my @response;
    while (defined(my $line = $sock->getline())) {
        $line =~ s/\015?\012//;
        push @response, $line;
    }

    # double check that our request contained more lines than cyrus'
    # syntax error limit of 10
    $self->assert_num_gt(10, scalar @request);

    # cyrus should have dropped the connection before we sent all the lines
    $self->assert_num_lt(scalar @request, scalar @response);

    # cyrus should have dropped the connection at the POST in first line
    $self->assert_not_contains(qr{^\* BAD}, \@response);

    # snarky last response back from the server
    $self->assert_matches(qr{This is an IMAP server}, $response[-1]);
}
