Browse Source

Allow non EOL data to be stored in read_socket_line

master
Con Kolivas 9 years ago
parent
commit
96e6f83d57
  1. 11
      src/ckpool.c
  2. 5
      src/generator.c

11
src/ckpool.c

@ -512,6 +512,10 @@ void empty_buffer(connsock_t *cs)
cs->buflen = cs->bufofs = 0; cs->buflen = cs->bufofs = 0;
} }
/* If there is any cs->buflen it implies a full line was received on the last
* pass through read_socket_line and subsequently processed, leaving
* unprocessed data beyond cs->bufofs. Otherwise a zero buflen means there is
* only unprocessed data of bufos length. */
static void clear_bufline(connsock_t *cs) static void clear_bufline(connsock_t *cs)
{ {
if (unlikely(!cs->buf)) if (unlikely(!cs->buf))
@ -522,8 +526,7 @@ static void clear_bufline(connsock_t *cs)
cs->bufofs = cs->buflen; cs->bufofs = cs->buflen;
cs->buflen = 0; cs->buflen = 0;
cs->buf[cs->bufofs] = '\0'; cs->buf[cs->bufofs] = '\0';
} else }
cs->bufofs = 0;
} }
static void add_buflen(connsock_t *cs, const char *readbuf, const int len) static void add_buflen(connsock_t *cs, const char *readbuf, const int len)
@ -571,7 +574,9 @@ static int recv_available(connsock_t *cs)
/* Read from a socket into cs->buf till we get an '\n', converting it to '\0' /* Read from a socket into cs->buf till we get an '\n', converting it to '\0'
* and storing how much extra data we've received, to be moved to the beginning * and storing how much extra data we've received, to be moved to the beginning
* of the buffer for use on the next receive. */ * of the buffer for use on the next receive. Returns length of the line if a
* whole line is received, zero if none/some data is received without an EOL
* and -1 on error. */
int read_socket_line(connsock_t *cs, float *timeout) int read_socket_line(connsock_t *cs, float *timeout)
{ {
bool proxy = cs->ckp->proxy; bool proxy = cs->ckp->proxy;

5
src/generator.c

@ -1949,11 +1949,8 @@ static void *passthrough_recv(void *arg)
* process. Possibly parse parameters sent by upstream pool * process. Possibly parse parameters sent by upstream pool
* here */ * here */
if (likely(ret > 0)) { if (likely(ret > 0)) {
if (strchr(cs->buf, '\n')) {
LOGDEBUG("Passthrough recv received upstream msg: %s", cs->buf); LOGDEBUG("Passthrough recv received upstream msg: %s", cs->buf);
send_proc(ckp->connector, cs->buf); send_proc(ckp->connector, cs->buf);
} else
LOGDEBUG("Passthrough recv received partial message");
} else if (ret < 0) { } else if (ret < 0) {
/* Read failure */ /* Read failure */
LOGWARNING("Passthrough %d:%s failed to read_socket_line in passthrough_recv, attempting reconnect", LOGWARNING("Passthrough %d:%s failed to read_socket_line in passthrough_recv, attempting reconnect",
@ -1961,7 +1958,7 @@ static void *passthrough_recv(void *arg)
alive = proxi->alive = false; alive = proxi->alive = false;
Close(cs->fd); Close(cs->fd);
reconnect_generator(ckp); reconnect_generator(ckp);
} else /* Idle, likely no clients */ } else /* No messages during timeout */
LOGDEBUG("Passthrough %d:%s no messages received", proxi->id, proxi->url); LOGDEBUG("Passthrough %d:%s no messages received", proxi->id, proxi->url);
cksem_post(&cs->sem); cksem_post(&cs->sem);
} }

Loading…
Cancel
Save