SalBodyHandler * sal_op_get_body_handler(SalOp *op, belle_sip_message_t *msg) { belle_sip_body_handler_t *body_handler = belle_sip_message_get_body_handler(msg); if (body_handler != NULL) { belle_sip_header_content_type_t *content_type = belle_sip_message_get_header_by_type(msg, belle_sip_header_content_type_t); belle_sip_header_content_length_t *content_length = belle_sip_message_get_header_by_type(msg, belle_sip_header_content_length_t); belle_sip_header_t *content_encoding = belle_sip_message_get_header(msg, "Content-Encoding"); if (content_type != NULL) belle_sip_body_handler_add_header(body_handler, BELLE_SIP_HEADER(content_type)); if (content_length != NULL) belle_sip_body_handler_add_header(body_handler, BELLE_SIP_HEADER(content_length)); if (content_encoding != NULL) belle_sip_body_handler_add_header(body_handler, content_encoding); } return (SalBodyHandler *)body_handler; }
void sal_body_handler_set_encoding(SalBodyHandler *body_handler, const char *encoding) { belle_sip_header_t *content_encoding = sal_body_handler_find_header(body_handler, "Content-Encoding"); if (content_encoding != NULL) { belle_sip_body_handler_remove_header_from_ptr(BELLE_SIP_BODY_HANDLER(body_handler), content_encoding); } belle_sip_body_handler_add_header(BELLE_SIP_BODY_HANDLER(body_handler), belle_sip_header_create("Content-Encoding", encoding)); }
void sal_body_handler_set_subtype(SalBodyHandler *body_handler, const char *subtype) { belle_sip_header_content_type_t *content_type = BELLE_SIP_HEADER_CONTENT_TYPE(sal_body_handler_find_header(body_handler, "Content-Type")); if (content_type == NULL) { content_type = belle_sip_header_content_type_new(); belle_sip_body_handler_add_header(BELLE_SIP_BODY_HANDLER(body_handler), BELLE_SIP_HEADER(content_type)); } belle_sip_header_content_type_set_subtype(content_type, subtype); }
void sal_body_handler_set_size(SalBodyHandler *body_handler, size_t size) { belle_sip_header_content_length_t *content_length = BELLE_SIP_HEADER_CONTENT_LENGTH(sal_body_handler_find_header(body_handler, "Content-Length")); if (content_length == NULL) { content_length = belle_sip_header_content_length_new(); belle_sip_body_handler_add_header(BELLE_SIP_BODY_HANDLER(body_handler), BELLE_SIP_HEADER(content_length)); } belle_sip_header_content_length_set_content_length(content_length, size); belle_sip_body_handler_set_size(BELLE_SIP_BODY_HANDLER(body_handler), size); }
void belle_sip_multipart_body_handler_progress_cb(belle_sip_body_handler_t *obj, belle_sip_message_t *msg, void *user_data, size_t transfered, size_t expected_total) { if (transfered == expected_total) { /* The full multipart body has been received, we can now parse it and split the different parts, * creating a belle_sip_memory_body_handler for each part and adding them to the belle_sip_multipart_body_handler * parts list. */ belle_sip_multipart_body_handler_t *obj_multipart = (belle_sip_multipart_body_handler_t *)obj; belle_sip_memory_body_handler_t *memorypart; belle_sip_header_t *header; uint8_t *end_part_cursor; uint8_t *end_headers_cursor; uint8_t *end_header_cursor; uint8_t *cursor = obj_multipart->buffer; char *boundary = belle_sip_strdup_printf("--%s", obj_multipart->boundary); if (strncmp((char *)cursor, boundary, strlen(boundary))) { belle_sip_warning("belle_sip_multipart_body_handler [%p]: body not starting by specified boundary '%s'", obj_multipart, obj_multipart->boundary); belle_sip_free(boundary); return; } cursor += strlen(boundary); do { if (strncmp((char *)cursor, "\r\n", 2)) { belle_sip_warning("belle_sip_multipart_body_handler [%p]: no new-line after boundary", obj_multipart); return; } cursor += 2; end_part_cursor = (uint8_t *)strstr((char *)cursor, boundary); if (end_part_cursor == NULL) { belle_sip_warning("belle_sip_multipart_body_handler [%p]: cannot find next boundary", obj_multipart); return; } else { *end_part_cursor = 0; end_headers_cursor = (uint8_t *)strstr((char *)cursor, "\r\n\r\n"); if (end_headers_cursor == NULL) { memorypart = belle_sip_memory_body_handler_new_copy_from_buffer(cursor, strlen((char *)cursor), NULL, NULL); } else { uint8_t *begin_body_cursor = end_headers_cursor + 4; memorypart = belle_sip_memory_body_handler_new_copy_from_buffer(begin_body_cursor, strlen((char *)begin_body_cursor), NULL, NULL); do { end_header_cursor = (uint8_t *)strstr((char *)cursor, "\r\n"); *end_header_cursor = 0; header = belle_sip_header_parse((char *)cursor); if (header != NULL) { belle_sip_body_handler_add_header(BELLE_SIP_BODY_HANDLER(memorypart), header); } cursor = end_header_cursor + 2; } while (end_header_cursor != end_headers_cursor); } belle_sip_multipart_body_handler_add_part(obj_multipart, BELLE_SIP_BODY_HANDLER(memorypart)); cursor = end_part_cursor + strlen(boundary); } } while (strcmp((char *)cursor, "--\r\n")); belle_sip_free(boundary); } }