allow to reuse redirections
A redirection can be reused up to max_clients times.master
parent
0be142b8c9
commit
5a7d9644e4
|
@ -246,6 +246,7 @@ static int tip_client_redirect_create(const struct tip_client *cli)
|
||||||
redir->addr = cli->addr;
|
redir->addr = cli->addr;
|
||||||
redir->addr.sin_port = htons(9999);
|
redir->addr.sin_port = htons(9999);
|
||||||
redir->uri = strdup(cli->uri);
|
redir->uri = strdup(cli->uri);
|
||||||
|
redir->users = max_clients;
|
||||||
list_add_tail(&redir->list, &client_redirect_list);
|
list_add_tail(&redir->list, &client_redirect_list);
|
||||||
|
|
||||||
ev_timer_init(&redir->timer, tip_client_redirect_timer_cb, 60, 0.);
|
ev_timer_init(&redir->timer, tip_client_redirect_timer_cb, 60, 0.);
|
||||||
|
@ -386,10 +387,15 @@ bool tip_client_redirect(struct tip_client *cli)
|
||||||
inet_ntoa(redir->addr.sin_addr), htons(redir->addr.sin_port),
|
inet_ntoa(redir->addr.sin_addr), htons(redir->addr.sin_port),
|
||||||
cli->uri);
|
cli->uri);
|
||||||
|
|
||||||
|
list_del(&redir->list);
|
||||||
|
if (--redir->users == 0) {
|
||||||
free((void *)redir->uri);
|
free((void *)redir->uri);
|
||||||
ev_timer_stop(tip_main_loop, &redir->timer);
|
ev_timer_stop(tip_main_loop, &redir->timer);
|
||||||
list_del(&redir->list);
|
|
||||||
free(redir);
|
free(redir);
|
||||||
|
} else {
|
||||||
|
/* reinsert at the end to round-robin redirections. */
|
||||||
|
list_add_tail(&redir->list, &client_redirect_list);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,6 +84,7 @@ struct tip_client_redirect {
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
const char *uri;
|
const char *uri;
|
||||||
struct ev_timer timer;
|
struct ev_timer timer;
|
||||||
|
uint32_t users;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue