static ngx_int_t
ngx_http_upstream_get_zeromq_peer(ngx_peer_connection_t *pc, void *data)
{
    ngx_http_upstream_zeromq_peer_data_t  *zp = data;
    ngx_int_t                              rc;

    if (zp->recv.endpoint != zp->send.endpoint) {
        pc->data = &zp->recv;
        rc = ngx_zeromq_connect(pc);
        pc->data = data;

        if (rc != NGX_OK) {
            return rc;
        }

        zp->recv.connection.data = zp->request;
    }

    pc->data = &zp->send;
    rc = ngx_zeromq_connect(pc);
    pc->data = data;

    if (rc != NGX_OK) {
        return rc;
    }

    zp->send.connection.data = zp->request;

    if (zp->recv.endpoint != zp->send.endpoint) {
        zp->send.recv = zp->recv.recv;
        zp->recv.send = zp->send.send;
    }

    if (zp->recv.endpoint->rand && zp->headers) {
        ngx_zeromq_headers_set_http(zp->headers->buf, zp->recv.endpoint);
    }

    return NGX_DONE;
}
static ngx_int_t
ngx_http_upstream_get_zeromq_peer(ngx_peer_connection_t *pc, void *data)
{
    ngx_http_upstream_zeromq_peer_data_t  *zp = data;
    ngx_int_t                              rc;
    u_char                                *zmq_peer;
    size_t                                 len;

    rc = ngx_http_upstream_get_round_robin_peer(pc, data);
    if (rc != NGX_OK) {
        return rc;
    }

    len = sizeof("tcp://") + pc->name->len;

    zmq_peer = ngx_pnalloc(zp->request->pool, len);
    if (zmq_peer == NULL) {
        return NGX_ERROR;
    }

    (void) ngx_snprintf(zmq_peer, len - 1, "tcp://%V", pc->name);
    zmq_peer[len - 1] = '\0';

    pc->data = zmq_peer;

    rc = ngx_zeromq_connect(pc);

    pc->data = data;

    if (rc != NGX_OK) {
        return rc;
    }

    zp->zmq = pc->connection->data;
    ngx_http_set_ctx(zp->request, zp->zmq, ngx_zeromq_module);

    return NGX_DONE;
}