/* R_REQUEST_OK: 200 */ void send_r_request_ok(request * req) { req->response_status = R_REQUEST_OK; if (req->simple) return; req_write(req, "HTTP/1.0 200 OK\r\n"); print_http_headers(req); if (req->is_cgi) { if (req->content_type) print_content_type(req); else if (req->is_cgi) { req_write(req, req->header_line); req_write(req, "\r\n"); } }else { print_content_type(req); print_content_length(req); print_last_modified(req); } req_write(req, "\r\n"); /* terminate header */ }
/* R_REQUEST_OK: 200 */ void send_r_request_ok(request * req) { req->response_status = R_REQUEST_OK; if (req->simple) return; req_write(req, "HTTP/1.0 200 OK\r\n"); print_http_headers(req); if (!req->is_cgi) { print_content_length(req); print_last_modified(req); print_content_type(req); req_write(req, "\r\n"); } }
/* R_REQUEST_OK: 200 */ void send_r_request_ok(request * req) { req->response_status = R_REQUEST_OK; if (req->simple) return; req_write(req, "HTTP/1.0 200 OK\r\n"); print_http_headers(req); print_content_type(req); print_content_length(req); print_last_modified(req); if (req->pcExtraHeader != NULL && req->pcExtraHeader[0] != '\0') req_write(req, req->pcExtraHeader); req_write(req, "\r\n"); /* terminate header */ }
/** * build CANCEL from UAC side */ char *build_uac_cancel(str *headers,str *body,struct cell *cancelledT, unsigned int branch, unsigned int *len, struct dest_info* dst) { char *cancel_buf, *p; char branch_buf[MAX_BRANCH_PARAM_LEN]; str branch_str; struct hostport hp; str content_length, via; LM_DBG("sing FROM=<%.*s>, TO=<%.*s>, CSEQ_N=<%.*s>\n", cancelledT->from.len, cancelledT->from.s, cancelledT->to.len, cancelledT->to.s, cancelledT->cseq_n.len, cancelledT->cseq_n.s); branch_str.s=branch_buf; if (!t_calc_branch(cancelledT, branch, branch_str.s, &branch_str.len )){ LM_ERR("failed to create branch !\n"); goto error; } set_hostport(&hp,0); if (assemble_via(&via, cancelledT, dst, branch) < 0) { LM_ERR("Error while assembling Via\n"); return 0; } /* method, separators, version */ *len=CANCEL_LEN + 2 /* spaces */ +SIP_VERSION_LEN + CRLF_LEN; *len+=cancelledT->uac[branch].uri.len; /*via*/ *len+= via.len; /*From*/ *len+=cancelledT->from.len; /*To*/ *len+=cancelledT->to.len; /*CallId*/ *len+=cancelledT->callid.len; /*CSeq*/ *len+=cancelledT->cseq_n.len+1+CANCEL_LEN+CRLF_LEN; /* User Agent */ if (server_signature) { *len += USER_AGENT_LEN + CRLF_LEN; } /* Content Length */ if (print_content_length(&content_length, body) < 0) { LM_ERR("failed to print content-length\n"); return 0; } /* Content-Length */ *len += (body ? (CONTENT_LENGTH_LEN + content_length.len + CRLF_LEN) : 0); /*Additional headers*/ *len += (headers ? headers->len : 0); /*EoM*/ *len+= CRLF_LEN; /* Message body */ *len += (body ? body->len : 0); cancel_buf=shm_malloc( *len+1 ); if (!cancel_buf) { LM_ERR("no more share memory\n"); goto error01; } p = cancel_buf; memapp( p, CANCEL, CANCEL_LEN ); *(p++) = ' '; memapp( p, cancelledT->uac[branch].uri.s, cancelledT->uac[branch].uri.len); memapp( p, " " SIP_VERSION CRLF, 1+SIP_VERSION_LEN+CRLF_LEN ); /* insert our via */ memapp(p,via.s,via.len); /*other headers*/ memapp( p, cancelledT->from.s, cancelledT->from.len ); memapp( p, cancelledT->callid.s, cancelledT->callid.len ); memapp( p, cancelledT->to.s, cancelledT->to.len ); memapp( p, cancelledT->cseq_n.s, cancelledT->cseq_n.len ); *(p++) = ' '; memapp( p, CANCEL, CANCEL_LEN ); memapp( p, CRLF, CRLF_LEN ); /* User Agent header */ if (server_signature) { memapp(p,USER_AGENT CRLF, USER_AGENT_LEN+CRLF_LEN ); } /* Content Length*/ if (body) { memapp(p, CONTENT_LENGTH, CONTENT_LENGTH_LEN); memapp(p, content_length.s, content_length.len); memapp(p, CRLF, CRLF_LEN); } if(headers && headers->len){ memapp(p,headers->s,headers->len); } /*EoM*/ memapp(p,CRLF,CRLF_LEN); if(body && body->len){ memapp(p,body->s,body->len); } *p=0; pkg_free(via.s); return cancel_buf; error01: pkg_free(via.s); error: return NULL; }
/* * Create a request */ char* build_uac_req(str* method, str* headers, str* body, dlg_t* dialog, int branch, struct cell *t, int* len, struct dest_info* dst) { char* buf, *w, *p; str content_length, cseq, via; unsigned int maxfwd_len; int tbracket, fbracket; str fromtag = STR_NULL; str loc_tag = STR_NULL; if (!method || !dialog) { LM_ERR("invalid parameter value\n"); return 0; } if (dialog->id.loc_tag.len<=0) { /* From Tag is mandatory in RFC3261 - generate one if not provided */ generate_fromtag(&fromtag, &dialog->id.call_id); loc_tag = dialog->id.loc_tag; dialog->id.loc_tag = fromtag; } if (print_content_length(&content_length, body) < 0) { LM_ERR("error while printing content-length\n"); return 0; } if (print_cseq_num(&cseq, dialog) < 0) { LM_ERR("error while printing CSeq number\n"); return 0; } if(headers==NULL || headers->len<15 || _strnstr(headers->s, "Max-Forwards:", headers->len)==NULL) { maxfwd_len = MAXFWD_HEADER_LEN; } else { maxfwd_len = 0; } *len = method->len + 1 + dialog->hooks.request_uri->len + 1 + SIP_VERSION_LEN + CRLF_LEN; if (assemble_via(&via, t, dst, branch) < 0) { LM_ERR("error while assembling Via\n"); return 0; } *len += via.len; if((p=q_memrchr(dialog->rem_uri.s, '>', dialog->rem_uri.len))!=NULL) { if((p==dialog->rem_uri.s + dialog->rem_uri.len - 1) || *(p+1)==';') { tbracket = 0; } else { tbracket = 1; } } else { tbracket = 1; } if((p=q_memrchr(dialog->loc_uri.s, '>', dialog->loc_uri.len))!=NULL) { if((p==dialog->loc_uri.s + dialog->loc_uri.len - 1) || *(p+1)==';') { fbracket = 0; } else { fbracket = 1; } } else { fbracket = 1; } *len += TO_LEN + dialog->rem_uri.len + (dialog->id.rem_tag.len ? (TOTAG_LEN + dialog->id.rem_tag.len) : 0) + CRLF_LEN; /* To */ if(tbracket) *len += 2; /* To-URI < > */ *len += FROM_LEN + dialog->loc_uri.len + (dialog->id.loc_tag.len ? (FROMTAG_LEN + dialog->id.loc_tag.len) : 0) + CRLF_LEN; /* From */ if(fbracket) *len += 2; /* From-URI < > */ *len += CALLID_LEN + dialog->id.call_id.len + CRLF_LEN; /* Call-ID */ *len += CSEQ_LEN + cseq.len + 1 + method->len + CRLF_LEN; /* CSeq */ *len += calculate_routeset_length(dialog); /* Route set */ *len += maxfwd_len; /* Max-forwards */ *len += CONTENT_LENGTH_LEN + content_length.len + CRLF_LEN; /* Content-Length */ *len += ((server_signature && user_agent_hdr.len>0) ? (user_agent_hdr.len + CRLF_LEN) : 0); /* Signature */ if(headers && headers->len>2) { /* Additional headers */ *len += headers->len; /* End of header if missing */ if(headers->s[headers->len - 1] != '\n') *len += CRLF_LEN; } *len += (body ? body->len : 0); /* Message body */ *len += CRLF_LEN; /* End of Header */ buf = shm_malloc(*len + 1); if (!buf) { LM_ERR("no more shared memory (%d)\n", *len); goto error; } w = buf; w = print_request_uri(w, method, dialog, t, branch); /* Request-URI */ memapp(w, via.s, via.len); /* Top-most Via */ w = print_to(w, dialog, t, tbracket); /* To */ w = print_from(w, dialog, t, fbracket); /* From */ if(fromtag.len>0) { dialog->id.loc_tag = loc_tag; } w = print_cseq(w, &cseq, method, t); /* CSeq */ w = print_callid(w, dialog, t); /* Call-ID */ w = print_routeset(w, dialog); /* Route set */ if(maxfwd_len>0) memapp(w, MAXFWD_HEADER, MAXFWD_HEADER_LEN); /* Max-forwards */ /* Content-Length */ memapp(w, CONTENT_LENGTH, CONTENT_LENGTH_LEN); memapp(w, content_length.s, content_length.len); memapp(w, CRLF, CRLF_LEN); /* Server signature */ if (server_signature && user_agent_hdr.len>0) { memapp(w, user_agent_hdr.s, user_agent_hdr.len); memapp(w, CRLF, CRLF_LEN); } if(headers && headers->len>2) { memapp(w, headers->s, headers->len); if(headers->s[headers->len - 1] != '\n') memapp(w, CRLF, CRLF_LEN); } memapp(w, CRLF, CRLF_LEN); if (body) memapp(w, body->s, body->len); #ifdef EXTRA_DEBUG assert(w-buf == *len); #endif memapp(w, "\0", 1); pkg_free(via.s); return buf; error: pkg_free(via.s); return 0; }
/* * Create a request */ char* build_uac_req(str* method, str* headers, str* body, dlg_t* dialog, int branch, struct cell *t, int* len) { char* buf, *w; str content_length, cseq, via; if (!method || !dialog) { LM_ERR("inalid parameter value\n"); return 0; } if (print_content_length(&content_length, body) < 0) { LM_ERR("failed to print content-length\n"); return 0; } if (print_cseq_num(&cseq, dialog) < 0) { LM_ERR("failed to print CSeq number\n"); return 0; } *len = method->len + 1 + dialog->hooks.request_uri->len + 1 + SIP_VERSION_LEN + CRLF_LEN; if (assemble_via(&via, t, dialog->send_sock, branch) < 0) { LM_ERR("failed to assemble Via\n"); return 0; } *len += via.len; /* To */ *len += TO_LEN + (dialog->rem_dname.len ? dialog->rem_dname.len+1 : 0) + dialog->rem_uri.len + (dialog->id.rem_tag.len ? TOTAG_LEN + dialog->id.rem_tag.len : 0) + (dialog->rem_dname.len || dialog->id.rem_tag.len ? 2 : 0) + CRLF_LEN; /* From */ *len += FROM_LEN + (dialog->loc_dname.len ? dialog->loc_dname.len+1 : 0) + dialog->loc_uri.len + (dialog->id.loc_tag.len ? FROMTAG_LEN + dialog->id.loc_tag.len : 0) + (dialog->loc_dname.len || dialog->id.loc_tag.len ? 2 : 0) + CRLF_LEN; /* Call-ID */ *len += CALLID_LEN + dialog->id.call_id.len + CRLF_LEN; /* CSeq */ *len += CSEQ_LEN + cseq.len + 1 + method->len + CRLF_LEN; /* Route set */ *len += calculate_routeset_length(dialog); /* Content-Length */ *len += CONTENT_LENGTH_LEN + content_length.len + CRLF_LEN; /* Signature */ *len += (server_signature ? (user_agent_header.len + CRLF_LEN) : 0); /* Additional headers */ *len += (headers ? headers->len : 0); /* Message body */ *len += (body ? body->len : 0); /* End of Header */ *len += CRLF_LEN; buf = shm_malloc(*len + 1); if (!buf) { LM_ERR("no more share memory\n"); goto error; } w = buf; w = print_request_uri(w, method, dialog, t, branch); /* Request-URI */ append_string(w, via.s, via.len); /* Top-most Via */ w = print_to(w, dialog, t); /* To */ w = print_from(w, dialog, t); /* From */ w = print_cseq(w, &cseq, method, t); /* CSeq */ w = print_callid(w, dialog, t); /* Call-ID */ w = print_routeset(w, dialog); /* Route set */ /* Content-Length */ append_string(w, CONTENT_LENGTH, CONTENT_LENGTH_LEN); append_string(w, content_length.s, content_length.len); append_string(w, CRLF, CRLF_LEN); /* Server signature */ if (server_signature) { append_string(w, user_agent_header.s, user_agent_header.len); append_string(w, CRLF, CRLF_LEN); } if (headers) { t->uac[branch].extra_headers.s = w; t->uac[branch].extra_headers.len = headers->len; append_string(w, headers->s, headers->len); } append_string(w, CRLF, CRLF_LEN); if (body) { t->uac[branch].body.s = w; t->uac[branch].body.len = body->len; append_string(w, body->s, body->len); } #ifdef EXTRA_DEBUG if (w-buf != *len ) abort(); #endif pkg_free(via.s); return buf; error: pkg_free(via.s); return 0; }