Commit 81cb1c15 authored by jehan's avatar jehan

Revert "Revert "add support for header Content-Disposition""

This reverts commit d90ee741.
parent ad9f2ca3
......@@ -701,6 +701,37 @@ BELLESIP_EXPORT belle_sip_list_t* belle_sip_header_supported_get_supported(const
#define BELLE_SIP_HEADER_SUPPORTED(t) BELLE_SIP_CAST(t,belle_sip_header_supported_t)
#define BELLE_SIP_SUPPORTED "Supported"
/******************************
* Content Disposition header object inherent from header
*
******************************/
typedef struct _belle_sip_header_content_disposition belle_sip_header_content_disposition_t;
BELLESIP_EXPORT belle_sip_header_content_disposition_t* belle_sip_header_content_disposition_new();
BELLESIP_EXPORT belle_sip_header_content_disposition_t* belle_sip_header_content_disposition_parse(const char* content_disposition) ;
BELLESIP_EXPORT belle_sip_header_content_disposition_t* belle_sip_header_content_disposition_create(const char* content_disposition);
BELLESIP_EXPORT void belle_sip_header_content_disposition_add_content_disposition(belle_sip_header_content_disposition_t* content_disposition, const char* value);
BELLESIP_EXPORT void belle_sip_header_content_disposition_set_content_disposition(belle_sip_header_content_disposition_t* content_disposition, belle_sip_list_t* content_disposition_values);
BELLESIP_EXPORT belle_sip_list_t* belle_sip_header_content_disposition_get_content_disposition(const belle_sip_header_content_disposition_t* content_disposition);
#define BELLE_SIP_HEADER_CONTENT_DISPOSITION(t) BELLE_SIP_CAST(t,belle_sip_header_content_disposition_t)
#define BELLE_SIP_CONTENT_DISPOSITION "Content-Disposition"
/******************************
* Accept header object inherent from parameters
*
******************************/
typedef struct _belle_sip_header_accept belle_sip_header_accept_t;
BELLESIP_EXPORT belle_sip_header_accept_t* belle_sip_header_accept_new();
BELLESIP_EXPORT belle_sip_header_accept_t* belle_sip_header_accept_parse (const char* accept) ;
BELLESIP_EXPORT belle_sip_header_accept_t* belle_sip_header_accept_create (const char* type,const char* sub_type) ;
BELLESIP_EXPORT belle_sip_header_accept_t* belle_sip_header_accept_parse (const char* accept) ;
BELLESIP_EXPORT const char* belle_sip_header_accept_get_type(const belle_sip_header_accept_t* accept);
BELLESIP_EXPORT void belle_sip_header_accept_set_type(belle_sip_header_accept_t* accept,const char* type);
BELLESIP_EXPORT const char* belle_sip_header_accept_get_subtype(const belle_sip_header_accept_t* accept);
BELLESIP_EXPORT void belle_sip_header_accept_set_subtype(belle_sip_header_accept_t* accept,const char* sub_type);
#define BELLE_SIP_HEADER_ACCEPT(t) BELLE_SIP_CAST(t,belle_sip_header_accept_t)
#define BELLE_SIP_ACCEPT "Accept"
BELLE_SIP_END_DECLS
......
......@@ -132,7 +132,9 @@ BELLE_SIP_DECLARE_TYPES_BEGIN(belle_sip,1)
BELLE_SIP_TYPE_ID(belle_sip_file_body_handler_t),
BELLE_SIP_TYPE_ID(belle_sip_multipart_body_handler_t),
BELLE_SIP_TYPE_ID(belle_sip_header_event_t),
BELLE_SIP_TYPE_ID(belle_sip_header_supported_t)
BELLE_SIP_TYPE_ID(belle_sip_header_supported_t),
BELLE_SIP_TYPE_ID(belle_sip_header_content_disposition_t),
BELLE_SIP_TYPE_ID(belle_sip_header_accept_t)
BELLE_SIP_DECLARE_TYPES_END
......
......@@ -79,6 +79,8 @@ static struct header_name_func_pair header_table[] = {
,{PROTO_SIP, BELLE_SIP_EVENT, (header_parse_func)belle_sip_header_event_parse}
,{PROTO_SIP, BELLE_SIP_SUPPORTED, (header_parse_func)belle_sip_header_supported_parse}
,{PROTO_SIP, "k", (header_parse_func)belle_sip_header_supported_parse}
,{PROTO_SIP, BELLE_SIP_CONTENT_DISPOSITION, (header_parse_func)belle_sip_header_content_disposition_parse}
,{PROTO_SIP, BELLE_SIP_ACCEPT, (header_parse_func)belle_sip_header_accept_parse}
};
static belle_sip_header_t* belle_header_create(const char* name,const char* value,int protocol) {
......@@ -1774,51 +1776,54 @@ belle_sip_header_p_preferred_identity_t* belle_sip_header_p_preferred_identity_c
return header;
}
#define PRIVACY_LIKE_HEADER(header_name, string_name,separator) \
struct _belle_sip_header_##header_name { \
belle_sip_header_t header;\
belle_sip_list_t* header_name;\
}; \
\
static void belle_sip_header_##header_name##_destroy(belle_sip_header_##header_name##_t* p) {\
belle_sip_header_##header_name##_set_##header_name(p,NULL);\
}\
\
static void belle_sip_header_##header_name##_clone(belle_sip_header_##header_name##_t* p, const belle_sip_header_##header_name##_t* orig){\
belle_sip_list_t* list=orig->header_name;\
for(;list!=NULL;list=list->next){\
belle_sip_header_##header_name##_add_##header_name(p,(const char *)list->data);\
}\
}\
\
belle_sip_error_code belle_sip_header_##header_name##_marshal(belle_sip_header_##header_name##_t* p, char* buff, size_t buff_size, size_t *offset) {\
belle_sip_error_code error=BELLE_SIP_OK;\
belle_sip_list_t* list = p->header_name;\
error=belle_sip_header_marshal(BELLE_SIP_HEADER(p), buff, buff_size, offset);\
if (error!=BELLE_SIP_OK) return error;\
for(;list!=NULL;list=list->next){\
error=belle_sip_snprintf(buff,buff_size,offset,list==p->header_name ? "%s" : separator" %s",(const char *)list->data);\
if (error!=BELLE_SIP_OK) return error;\
}\
return error;\
}\
\
BELLE_SIP_NEW_HEADER(header_##header_name,header,string_name)\
BELLE_SIP_PARSE(header_##header_name)\
belle_sip_list_t* belle_sip_header_##header_name##_get_##header_name(const belle_sip_header_##header_name##_t* p) {\
return p->header_name;\
}\
SET_ADD_STRING_LIST(belle_sip_header_##header_name,header_name)\
\
belle_sip_header_##header_name##_t* belle_sip_header_##header_name##_create(const char* header_name) {\
belle_sip_header_##header_name##_t* header=belle_sip_header_##header_name##_new();\
belle_sip_header_##header_name##_add_##header_name(header,header_name);\
return header;\
}
/******************************
* Privacy header inherits from header
*
******************************/
struct _belle_sip_header_privacy {
belle_sip_header_t header;
belle_sip_list_t* privacy;
};
static void belle_sip_header_privacy_destroy(belle_sip_header_privacy_t* p) {
belle_sip_header_privacy_set_privacy(p,NULL);
}
static void belle_sip_header_privacy_clone(belle_sip_header_privacy_t* p, const belle_sip_header_privacy_t* orig){
belle_sip_list_t* list=orig->privacy;
for(;list!=NULL;list=list->next){
belle_sip_header_privacy_add_privacy(p,(const char *)list->data);
}
}
belle_sip_error_code belle_sip_header_privacy_marshal(belle_sip_header_privacy_t* p, char* buff, size_t buff_size, size_t *offset) {
belle_sip_error_code error=BELLE_SIP_OK;
belle_sip_list_t* list = p->privacy;
error=belle_sip_header_marshal(BELLE_SIP_HEADER(p), buff, buff_size, offset);
if (error!=BELLE_SIP_OK) return error;
for(;list!=NULL;list=list->next){
error=belle_sip_snprintf(buff,buff_size,offset,list==p->privacy ? "%s" : ";%s",(const char *)list->data);
if (error!=BELLE_SIP_OK) return error;
}
return error;
}
BELLE_SIP_NEW_HEADER(header_privacy,header,BELLE_SIP_PRIVACY)
BELLE_SIP_PARSE(header_privacy)
belle_sip_list_t* belle_sip_header_privacy_get_privacy(const belle_sip_header_privacy_t* p) {
return p->privacy;
}
SET_ADD_STRING_LIST(belle_sip_header_privacy,privacy)
belle_sip_header_privacy_t* belle_sip_header_privacy_create(const char* privacy) {
belle_sip_header_privacy_t* privacy_header=belle_sip_header_privacy_new();
belle_sip_header_privacy_add_privacy(privacy_header,privacy);
return privacy_header;
}
PRIVACY_LIKE_HEADER(privacy,BELLE_SIP_PRIVACY,";")
/**************************
* Event header object inherent from parameters
****************************
......@@ -1861,46 +1866,54 @@ belle_sip_header_event_t* belle_sip_header_event_create (const char* package_nam
* Supported header inherits from header
*
******************************/
struct _belle_sip_header_supported {
belle_sip_header_t header;
belle_sip_list_t* supported;
PRIVACY_LIKE_HEADER(supported,BELLE_SIP_SUPPORTED,",")
/******************************
* Content-Disposition header inherits from header
*
******************************/
PRIVACY_LIKE_HEADER(content_disposition,BELLE_SIP_CONTENT_DISPOSITION,";")
/******************************
* Accept header inherits from parameters
*
******************************/
struct _belle_sip_header_accept {
belle_sip_parameters_t params_list;
const char* type;
const char* subtype;
};
static void belle_sip_header_supported_destroy(belle_sip_header_supported_t* p) {
belle_sip_header_supported_set_supported(p,NULL);
static void belle_sip_header_accept_destroy(belle_sip_header_accept_t* accept) {
if (accept->type) belle_sip_free((void*)accept->type);
if (accept->subtype) belle_sip_free((void*)accept->subtype);
}
static void belle_sip_header_supported_clone(belle_sip_header_supported_t* p, const belle_sip_header_supported_t* orig){
belle_sip_list_t* list=orig->supported;
for(;list!=NULL;list=list->next){
belle_sip_header_supported_add_supported(p,(const char *)list->data);
}
static void belle_sip_header_accept_clone(belle_sip_header_accept_t* accept, const belle_sip_header_accept_t* orig){
CLONE_STRING(belle_sip_header_accept,type,accept,orig);
CLONE_STRING(belle_sip_header_accept,subtype,accept,orig);
}
belle_sip_error_code belle_sip_header_supported_marshal(belle_sip_header_supported_t* p, char* buff, size_t buff_size, size_t *offset) {
belle_sip_error_code error=BELLE_SIP_OK;
belle_sip_list_t* list = p->supported;
error=belle_sip_header_marshal(BELLE_SIP_HEADER(p), buff, buff_size, offset);
belle_sip_error_code belle_sip_header_accept_marshal(belle_sip_header_accept_t* accept, char* buff, size_t buff_size, size_t *offset) {
belle_sip_error_code error=belle_sip_header_marshal(BELLE_SIP_HEADER(accept), buff, buff_size, offset);
if (error!=BELLE_SIP_OK) return error;
error=belle_sip_snprintf(buff,buff_size,offset,"%s/%s",accept->type, accept->subtype);
if (error!=BELLE_SIP_OK) return error;
error=belle_sip_parameters_marshal(&accept->params_list, buff, buff_size, offset);
if (error!=BELLE_SIP_OK) return error;
for(;list!=NULL;list=list->next){
error=belle_sip_snprintf(buff,buff_size,offset,list==p->supported ? "%s" : ", %s",(const char *)list->data);
if (error!=BELLE_SIP_OK) return error;
}
return error;
}
BELLE_SIP_NEW_HEADER(header_supported,header,BELLE_SIP_SUPPORTED)
BELLE_SIP_PARSE(header_supported)
belle_sip_list_t* belle_sip_header_supported_get_supported(const belle_sip_header_supported_t* p) {
return p->supported;
}
SET_ADD_STRING_LIST(belle_sip_header_supported,supported)
belle_sip_header_supported_t* belle_sip_header_supported_create(const char* supported) {
belle_sip_header_supported_t* supported_header=belle_sip_header_supported_new();
belle_sip_header_supported_add_supported(supported_header,supported);
return supported_header;
BELLE_SIP_NEW_HEADER(header_accept,parameters,BELLE_SIP_ACCEPT)
BELLE_SIP_PARSE(header_accept)
belle_sip_header_accept_t* belle_sip_header_accept_create (const char* type,const char* sub_type) {
belle_sip_header_accept_t* header = belle_sip_header_accept_new();
belle_sip_header_accept_set_type(header,type);
belle_sip_header_accept_set_subtype(header,sub_type);
return header;
}
GET_SET_STRING(belle_sip_header_accept,type);
GET_SET_STRING(belle_sip_header_accept,subtype);
......@@ -206,6 +206,8 @@ BELLE_SIP_DECLARE_VPTR(belle_tls_verify_policy_t);
BELLE_SIP_DECLARE_VPTR(belle_http_header_authorization_t);
BELLE_SIP_DECLARE_VPTR(belle_sip_header_event_t);
BELLE_SIP_DECLARE_VPTR(belle_sip_header_supported_t);
BELLE_SIP_DECLARE_VPTR(belle_sip_header_content_disposition_t);
BELLE_SIP_DECLARE_VPTR(belle_sip_header_accept_t);
BELLE_SIP_DECLARE_CUSTOM_VPTR_BEGIN(belle_sip_resolver_context_t,belle_sip_source_t)
void (*cancel)(belle_sip_resolver_context_t *);
......
......@@ -1418,7 +1418,42 @@ catch [ANTLR3_RECOGNITION_EXCEPTION]
}
supported_val: token {belle_sip_header_supported_add_supported($header_supported::current,(const char*)$token.text->chars);};
//**********************************Content-Disposition*******************************//
header_content_disposition returns [belle_sip_header_content_disposition_t* ret]
scope { belle_sip_header_content_disposition_t* current; }
@init { $header_content_disposition::current = belle_sip_header_content_disposition_new();$ret = $header_content_disposition::current;}
: {IS_TOKEN(Content-Disposition)}? token /*'Content-Disposition'*/ hcolon content_disposition_val (semi content_disposition_val)*;
catch [ANTLR3_RECOGNITION_EXCEPTION]
{
belle_sip_message("[\%s] reason [\%s]",(const char*)EXCEPTION->name,(const char*)EXCEPTION->message);
belle_sip_object_unref($ret);
$ret=NULL;
}
content_disposition_val: token {belle_sip_header_content_disposition_add_content_disposition($header_content_disposition::current,(const char*)$token.text->chars);};
//**********************************Accept*******************************//
accept_token : {IS_TOKEN(Accept)}? token;
header_accept returns [belle_sip_header_accept_t* ret=NULL]
scope { belle_sip_header_accept_t* current;}
@init { $header_accept::current = belle_sip_header_accept_new();$ret=$header_accept::current; }
: accept_token/* ( 'Accept')*/ hcolon accept_media_type;
catch [ANTLR3_RECOGNITION_EXCEPTION]
{
belle_sip_message("[\%s] reason [\%s]",(const char*)EXCEPTION->name,(const char*)EXCEPTION->message);
belle_sip_object_unref($header_accept::current);
$ret=NULL;
}
accept_media_type
: accept_main_media_type {belle_sip_header_accept_set_type($header_accept::current,(const char*)$accept_main_media_type.text->chars);}
slash
accept_sub_media_type {belle_sip_header_accept_set_subtype($header_accept::current,(const char*)$accept_sub_media_type.text->chars);}
(semi generic_param [BELLE_SIP_PARAMETERS($header_accept::current)])*;
accept_main_media_type: token;
accept_sub_media_type: token;
header returns [belle_sip_header_t* ret=NULL]
......
......@@ -1042,6 +1042,80 @@ static void test_supported_header(void) {
test_supported("Supported", "id",value2,1);
}
static void test_content_disposition(const char* header_name, const char * header_value, const char* values[],size_t number_values) {
belle_sip_list_t* list;
belle_sip_header_content_disposition_t* L_tmp;
belle_sip_header_content_disposition_t* L_content_disposition = BELLE_SIP_HEADER_CONTENT_DISPOSITION(belle_sip_header_create(header_name,header_value));
char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_content_disposition));
size_t i=0;
belle_sip_object_unref(BELLE_SIP_OBJECT(L_content_disposition));
L_tmp = belle_sip_header_content_disposition_parse(l_raw_header);
L_content_disposition = BELLE_SIP_HEADER_CONTENT_DISPOSITION(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp)));
belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp));
belle_sip_free(l_raw_header);
list = belle_sip_header_content_disposition_get_content_disposition(L_content_disposition);
for(i=0;i<number_values;i++){
BC_ASSERT_PTR_NOT_NULL(list);
if (list) {
BC_ASSERT_STRING_EQUAL((const char *)(list->data),values[i]);
list=list->next;
}
}
belle_sip_object_unref(BELLE_SIP_OBJECT(L_content_disposition));
BC_ASSERT_PTR_NULL(belle_sip_header_content_disposition_parse("nimportequoi"));
}
static void test_content_disposition_header(void) {
const char* value1[] ={"user","critical"};
const char* value2[] ={"recipient-list"};
test_content_disposition(BELLE_SIP_CONTENT_DISPOSITION, "recipient-list",value2,1);
test_content_disposition("Content-Disposition","user; critical",value1,2);
}
static void test_accept(const char* header_name, const char * header_value, const char* values[],size_t number_values) {
belle_sip_header_accept_t* L_tmp;
belle_sip_header_accept_t* L_accept = BELLE_SIP_HEADER_ACCEPT(belle_sip_header_create("Accept", "text/html; charset=ISO-8859-4"));
char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_accept));
belle_sip_object_unref(BELLE_SIP_OBJECT(L_accept));
L_tmp = belle_sip_header_accept_parse(l_raw_header);
L_accept = BELLE_SIP_HEADER_ACCEPT(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp)));
belle_sip_object_unref(BELLE_SIP_OBJECT(L_tmp));
belle_sip_free(l_raw_header);
BC_ASSERT_STRING_EQUAL(belle_sip_header_accept_get_type(L_accept),"text");
BC_ASSERT_STRING_EQUAL(belle_sip_header_accept_get_subtype(L_accept),"html");
BC_ASSERT_STRING_EQUAL(belle_sip_parameters_get_parameter(BELLE_SIP_PARAMETERS(L_accept),"charset"),"ISO-8859-4");
belle_sip_object_unref(BELLE_SIP_OBJECT(L_accept));
L_accept = belle_sip_header_accept_parse("Accept: application/sdp");
l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_accept));
belle_sip_object_unref(BELLE_SIP_OBJECT(L_accept));
L_accept = belle_sip_header_accept_parse(l_raw_header);
belle_sip_free(l_raw_header);
BC_ASSERT_STRING_EQUAL(belle_sip_header_accept_get_type(L_accept),"application");
BC_ASSERT_STRING_EQUAL(belle_sip_header_accept_get_subtype(L_accept),"sdp");
belle_sip_object_unref(BELLE_SIP_OBJECT(L_accept));
L_accept = belle_sip_header_accept_parse("Accept: application/pkcs7-mime; smime-type=enveloped-data; \r\n name=smime.p7m");
l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_accept));
belle_sip_object_unref(BELLE_SIP_OBJECT(L_accept));
L_accept = belle_sip_header_accept_parse(l_raw_header);
belle_sip_free(l_raw_header);
belle_sip_object_unref(BELLE_SIP_OBJECT(L_accept));
BC_ASSERT_PTR_NULL(belle_sip_header_accept_parse("nimportequoi"));
}
static void test_accept_header(void) {
const char* value1[] ={"user","critical"};
const char* value2[] ={"recipient-list"};
test_accept(BELLE_SIP_ACCEPT, "recipient-list",value2,1);
test_accept("Accept","user; critical",value1,2);
}
test_t headers_tests[] = {
{ "Address", test_address_header },
......@@ -1082,7 +1156,9 @@ test_t headers_tests[] = {
{ "Header extension", test_header_extension_1 },
{ "Header extension 2", test_header_extension_2 },
{ "Header event", test_event_header },
{ "Header Supported", test_supported_header }
{ "Header Supported", test_supported_header },
{ "Header Content-Disposition", test_content_disposition_header },
{ "Header Accept", test_accept_header }
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment