// called after receaving the uwsgi header (read vars) static ssize_t fr_recv_uwsgi_vars(struct corerouter_peer *main_peer) { struct uwsgi_header *uh = (struct uwsgi_header *) main_peer->in->buf; // better to store it as the original buf address could change uint16_t pktsize = uh->_pktsize; // increase buffer if needed if (uwsgi_buffer_fix(main_peer->in, pktsize+4)) return -1; ssize_t len = cr_read_exact(main_peer, pktsize+4, "fr_recv_uwsgi_vars()"); if (!len) return 0; // headers received, ready to choose the instance if (main_peer->in->pos == (size_t)(pktsize+4)) { struct uwsgi_corerouter *ucr = main_peer->session->corerouter; struct corerouter_peer *new_peer = uwsgi_cr_peer_add(main_peer->session); new_peer->last_hook_read = fr_instance_read; if (!ufr.force_key) { // find the hostname if (uwsgi_hooked_parse(main_peer->in->buf+4, pktsize, fr_get_hostname, (void *) new_peer)) { return -1; } } else { new_peer->key_len = strlen(ufr.force_key); memcpy(new_peer->key, ufr.force_key, new_peer->key_len); } // check the hostname; if (new_peer->key_len == 0) return -1; // find an instance using the key if (ucr->mapper(ucr, new_peer)) return -1; // check instance if (new_peer->instance_address_len == 0) { if (ufr.cr.fallback_on_no_key) { new_peer->failed = 1; new_peer->can_retry = 1; corerouter_close_peer(&ufr.cr, new_peer); return len; } return -1; } new_peer->can_retry = 1; cr_connect(new_peer, fr_instance_connected); } return len; }
// called soon after accept() ssize_t fr_recv_uwsgi_header(struct corerouter_peer *main_peer) { ssize_t len = cr_read_exact(main_peer, 4, "fr_recv_uwsgi_header()"); if (!len) return 0; // header ready if (main_peer->in->pos == 4) { // change the reading default hook main_peer->last_hook_read = fr_recv_uwsgi_vars; return fr_recv_uwsgi_vars(main_peer); } return len; }
// called soon after accept() static ssize_t fr_recv_uwsgi_header(struct corerouter_peer *main_peer) { ssize_t len = cr_read_exact(main_peer, 4, "fr_recv_uwsgi_header()"); if (!len) return 0; // header ready if (main_peer->in->pos == 4) { // change the reading default and current hook (simulate a reset hook but without syscall) // this is a special case for the fastrouter as it changes its hook without changing the event mapping main_peer->last_hook_read = fr_recv_uwsgi_vars; main_peer->hook_read = fr_recv_uwsgi_vars; return fr_recv_uwsgi_vars(main_peer); } return len; }
// called after receaving the uwsgi header (read vars) ssize_t fr_recv_uwsgi_vars(struct corerouter_peer *main_peer) { struct uwsgi_header *uh = (struct uwsgi_header *) main_peer->in->buf; // increase buffer if needed if (uwsgi_buffer_fix(main_peer->in, uh->pktsize+4)) return -1; ssize_t len = cr_read_exact(main_peer, uh->pktsize+4, "fr_recv_uwsgi_vars()"); if (!len) return 0; // headers received, ready to choose the instance if (main_peer->in->pos == (size_t)(uh->pktsize+4)) { struct uwsgi_corerouter *ucr = main_peer->session->corerouter; struct corerouter_peer *new_peer = uwsgi_cr_peer_add(main_peer->session); new_peer->last_hook_read = fr_instance_read; // find the hostname if (uwsgi_hooked_parse(main_peer->in->buf+4, uh->pktsize, fr_get_hostname, (void *) new_peer)) { return -1; } // check the hostname; if (new_peer->key_len == 0) return -1; // find an instance using the key if (ucr->mapper(ucr, new_peer)) return -1; // check instance if (new_peer->instance_address_len == 0) return -1; cr_connect(new_peer, fr_instance_connected); } return len; }