Fix http_request

trace-sqes
Vitaliy Filippov 2020-04-12 02:08:00 +03:00
parent d11e8dcb5e
commit edf6d6f897
2 changed files with 19 additions and 10 deletions

View File

@ -276,7 +276,7 @@ restart:
else
{
auto & cb = epoll_handlers[events[i].data.fd];
cb(events[i].events, events[i].data.fd);
cb(events[i].data.fd, events[i].events);
}
}
}

View File

@ -80,6 +80,7 @@ void http_co_t::resume()
int r;
if ((r = inet_pton(AF_INET, host.c_str(), &addr.sin_addr)) != 1)
{
code = ENXIO;
delete this;
return;
}
@ -88,6 +89,7 @@ void http_co_t::resume()
peer_fd = socket(AF_INET, SOCK_STREAM, 0);
if (peer_fd < 0)
{
code = errno;
delete this;
return;
}
@ -95,6 +97,7 @@ void http_co_t::resume()
r = connect(peer_fd, (sockaddr*)&addr, sizeof(addr));
if (r < 0 && errno != EINPROGRESS)
{
code = errno;
delete this;
return;
}
@ -105,14 +108,17 @@ void http_co_t::resume()
ev.events = EPOLLOUT | EPOLLIN | EPOLLRDHUP | EPOLLET;
if (epoll_ctl(osd->epoll_fd, EPOLL_CTL_ADD, peer_fd, &ev) < 0)
{
throw std::runtime_error(std::string("epoll_ctl: ") + strerror(errno));
code = errno;
delete this;
return;
}
epoll_events = 0;
st = 1;
return;
}
if (st == 1)
{
if (epoll_events & EPOLLOUT)
if (epoll_events & (EPOLLOUT | EPOLLERR))
{
int result = 0;
socklen_t result_len = sizeof(result);
@ -122,6 +128,7 @@ void http_co_t::resume()
}
if (result != 0)
{
code = result;
delete this;
return;
}
@ -133,7 +140,9 @@ void http_co_t::resume()
ev.events = EPOLLIN | EPOLLRDHUP | EPOLLET;
if (epoll_ctl(osd->epoll_fd, EPOLL_CTL_MOD, peer_fd, &ev) < 0)
{
throw std::runtime_error(std::string("epoll_ctl: ") + strerror(errno));
code = errno;
delete this;
return;
}
st = 2;
epoll_events = 0;
@ -192,7 +201,12 @@ void http_co_t::resume()
// Read response
if (st == 5)
{
if (epoll_events & EPOLLIN)
if (epoll_events & (EPOLLRDHUP|EPOLLERR))
{
delete this;
return;
}
else if (epoll_events & EPOLLIN)
{
response.resize(received + 9000);
io_uring_sqe *sqe = osd->ringloop->get_sqe();
@ -212,11 +226,6 @@ void http_co_t::resume()
st = 6;
epoll_events = 0;
}
else if (epoll_events & EPOLLRDHUP)
{
delete this;
return;
}
}
if (st == 6)
{