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