Exemple #1
0
static void resp_handler(int err, const struct sip_msg *msg, void *arg)
{
    struct sip_req *sr = arg;

    info("baresip.sipreq.resp_handler()\n");

    if (err || sip_request_loops(&sr->ls, msg->scode))
        goto out;

    if (msg->scode < 200) {
        return;
    }
    else if (msg->scode < 300) {
        ;
    }
    else {
        switch (msg->scode) {

        case 401:
        case 407:
            err = sip_auth_authenticate(sr->auth, msg);
            if (err) {
                err = (err == EAUTH) ? 0 : err;
                break;
            }

            err = request(sr);
            if (err)
                break;

            return;

        case 403:
            sip_auth_reset(sr->auth);
            break;
        }
    }

out:
    if (sr->resph)
        sr->resph(err, msg, sr->arg);

    /* destroy now */
    mem_deref(sr);
}
Exemple #2
0
static void response_handler(int err, const struct sip_msg *msg, void *arg)
{
	const struct sip_hdr *minexp;
	struct sipreg *reg = arg;

	reg->wait = failwait(reg->failc + 1);

	if (err || sip_request_loops(&reg->ls, msg->scode)) {
		reg->failc++;
		goto out;
	}

	if (msg->scode < 200) {
		return;
	}
	else if (msg->scode < 300) {
		reg->registered = true;
		reg->wait = reg->expires;
		sip_msg_hdr_apply(msg, true, SIP_HDR_CONTACT, contact_handler,
				  reg);
		reg->wait *= 900;
		reg->failc = 0;

		if (reg->regid > 0 && !reg->terminated && !reg->ka)
			start_outbound(reg, msg);
	}
	else {
		if (reg->terminated && !reg->registered)
			goto out;

		switch (msg->scode) {

		case 401:
		case 407:
			err = sip_auth_authenticate(reg->auth, msg);
			if (err) {
				err = (err == EAUTH) ? 0 : err;
				break;
			}

			err = request(reg, false);
			if (err)
				break;

			return;

		case 403:
			sip_auth_reset(reg->auth);
			break;

		case 423:
			minexp = sip_msg_hdr(msg, SIP_HDR_MIN_EXPIRES);
			if (!minexp || !pl_u32(&minexp->val) || !reg->expires)
				break;

			reg->expires = pl_u32(&minexp->val);

			err = request(reg, false);
			if (err)
				break;

			return;
		}

		++reg->failc;
	}

 out:
	if (!reg->expires) {
		mem_deref(reg);
	}
	else if (reg->terminated) {
		if (!reg->registered || request(reg, true))
			mem_deref(reg);
	}
	else {
		tmr_start(&reg->tmr, reg->wait, tmr_handler, reg);
		reg->resph(err, msg, reg->arg);
	}
}