3cd12006bb
Signed-off-by: Dean Troyer <dtroyer@gmail.com>
56 lines
1.7 KiB
Diff
56 lines
1.7 KiB
Diff
---
|
|
http.c | 25 ++++++++++++++++++-------
|
|
1 file changed, 18 insertions(+), 7 deletions(-)
|
|
|
|
--- a/http.c
|
|
+++ b/http.c
|
|
@@ -1325,6 +1325,9 @@ evhttp_error_cb(struct bufferevent *bufe
|
|
struct evhttp_connection *evcon = arg;
|
|
struct evhttp_request *req = TAILQ_FIRST(&evcon->requests);
|
|
|
|
+ if (evcon->fd == -1)
|
|
+ evcon->fd = bufferevent_getfd(bufev);
|
|
+
|
|
switch (evcon->state) {
|
|
case EVCON_CONNECTING:
|
|
if (what & BEV_EVENT_TIMEOUT) {
|
|
@@ -1390,6 +1393,9 @@ evhttp_connection_cb(struct bufferevent
|
|
int error;
|
|
ev_socklen_t errsz = sizeof(error);
|
|
|
|
+ if (evcon->fd == -1)
|
|
+ evcon->fd = bufferevent_getfd(bufev);
|
|
+
|
|
if (!(what & BEV_EVENT_CONNECTED)) {
|
|
/* some operating systems return ECONNREFUSED immediately
|
|
* when connecting to a local address. the cleanup is going
|
|
@@ -2189,16 +2195,21 @@ evhttp_connection_connect(struct evhttp_
|
|
EVUTIL_ASSERT(!(evcon->flags & EVHTTP_CON_INCOMING));
|
|
evcon->flags |= EVHTTP_CON_OUTGOING;
|
|
|
|
- evcon->fd = bind_socket(
|
|
- evcon->bind_address, evcon->bind_port, 0 /*reuse*/);
|
|
- if (evcon->fd == -1) {
|
|
- event_debug(("%s: failed to bind to \"%s\"",
|
|
- __func__, evcon->bind_address));
|
|
- return (-1);
|
|
+ if (evcon->bind_address || evcon->bind_port) {
|
|
+ evcon->fd = bind_socket(
|
|
+ evcon->bind_address, evcon->bind_port, 0 /*reuse*/);
|
|
+ if (evcon->fd == -1) {
|
|
+ event_debug(("%s: failed to bind to \"%s\"",
|
|
+ __func__, evcon->bind_address));
|
|
+ return (-1);
|
|
+ }
|
|
+
|
|
+ bufferevent_setfd(evcon->bufev, evcon->fd);
|
|
+ } else {
|
|
+ bufferevent_setfd(evcon->bufev, -1);
|
|
}
|
|
|
|
/* Set up a callback for successful connection setup */
|
|
- bufferevent_setfd(evcon->bufev, evcon->fd);
|
|
bufferevent_setcb(evcon->bufev,
|
|
NULL /* evhttp_read_cb */,
|
|
NULL /* evhttp_write_cb */,
|