Commit 0420bd65 authored by Viacheslav Demydiuk's avatar Viacheslav Demydiuk

add header Require

parent d40ae3a8
......@@ -748,6 +748,20 @@ 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"
/******************************
* Require header object inherent from header
*
******************************/
typedef struct _belle_sip_header_require belle_sip_header_require_t;
BELLESIP_EXPORT belle_sip_header_require_t* belle_sip_header_require_new(void);
BELLESIP_EXPORT belle_sip_header_require_t* belle_sip_header_require_parse(const char* require) ;
BELLESIP_EXPORT belle_sip_header_require_t* belle_sip_header_require_create(const char* require);
BELLESIP_EXPORT void belle_sip_header_require_add_require(belle_sip_header_require_t* require, const char* value);
BELLESIP_EXPORT void belle_sip_header_require_set_require(belle_sip_header_require_t* require, belle_sip_list_t* require_values);
BELLESIP_EXPORT belle_sip_list_t* belle_sip_header_require_get_require(const belle_sip_header_require_t* require);
#define BELLE_SIP_HEADER_REQUIRE(t) BELLE_SIP_CAST(t,belle_sip_header_require_t)
#define BELLE_SIP_REQUIRE "Require"
/******************************
* Content Disposition header object inherent from header
*
......
......@@ -144,6 +144,7 @@ BELLE_SIP_DECLARE_TYPES_BEGIN(belle_sip,1)
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_require_t),
BELLE_SIP_TYPE_ID(belle_sip_header_content_disposition_t),
BELLE_SIP_TYPE_ID(belle_sip_header_accept_t),
BELLE_SIP_TYPE_ID(belle_sip_header_reason_t),
......
......@@ -79,6 +79,7 @@ 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_REQUIRE, (header_parse_func)belle_sip_header_require_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}
,{PROTO_SIP, BELLE_SIP_REASON, (header_parse_func)belle_sip_header_reason_parse}
......@@ -1959,6 +1960,12 @@ belle_sip_header_event_t* belle_sip_header_event_create (const char* package_nam
******************************/
PRIVACY_LIKE_HEADER(supported,BELLE_SIP_SUPPORTED,",")
/******************************
* Require header inherits from header
*
******************************/
PRIVACY_LIKE_HEADER(require,BELLE_SIP_REQUIRE,",")
/******************************
* Content-Disposition header inherits from header
*
......
......@@ -225,6 +225,7 @@ BELLE_SIP_DECLARE_VPTR(belle_tls_crypto_config_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_require_t);
BELLE_SIP_DECLARE_VPTR(belle_sip_header_content_disposition_t);
BELLE_SIP_DECLARE_VPTR(belle_sip_header_accept_t);
BELLE_SIP_DECLARE_VPTR(belle_sip_header_reason_t);
......
......@@ -1520,6 +1520,19 @@ catch [ANTLR3_RECOGNITION_EXCEPTION]
}
supported_val: token {belle_sip_header_supported_add_supported($header_supported::current,(const char*)$token.text->chars);};
//**********************************Require*******************************//
header_require returns [belle_sip_header_require_t* ret]
scope { belle_sip_header_require_t* current; }
@init { $header_require::current = belle_sip_header_require_new();$ret = $header_require::current;}
: {IS_TOKEN(Require)}? token /*'Require'*/ hcolon require_val (comma require_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;
}
require_val: token {belle_sip_header_require_add_require($header_require::current,(const char*)$token.text->chars);};
//**********************************Content-Disposition*******************************//
content_disposition_value: token ;
......
......@@ -1018,26 +1018,39 @@ static void test_replaces_escaped_header(void) {
}
static void test_require(const char* header_name, const char * header_value) {
belle_sip_header_t* L_tmp;
belle_sip_header_t* L_require;
char header[256];
char* l_raw_header = NULL;
snprintf(header, sizeof(header), "%s:%s", header_name, header_value);
L_require = belle_sip_header_parse(header);
l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_require));
static void test_require(const char* header_name, const char * header_value, const char* values[],size_t number_values){
belle_sip_list_t* list;
belle_sip_header_require_t* L_tmp;
belle_sip_header_require_t* L_require = BELLE_SIP_HEADER_REQUIRE(belle_sip_header_create(header_name,header_value));
char* l_raw_header = belle_sip_object_to_string(BELLE_SIP_OBJECT(L_require));
size_t i=0;
belle_sip_object_unref(BELLE_SIP_OBJECT(L_require));
L_tmp = belle_sip_header_parse(l_raw_header);
L_require = BELLE_SIP_HEADER(belle_sip_object_clone(BELLE_SIP_OBJECT(L_tmp)));
L_tmp = belle_sip_header_require_parse(l_raw_header);
L_require = BELLE_SIP_HEADER_REQUIRE(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_get_unparsed_value(L_require), header_value);
belle_sip_object_unref(L_require);
list = belle_sip_header_require_get_require(L_require);
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_require));
BC_ASSERT_PTR_NULL(belle_sip_header_require_parse("nimportequoi"));
}
static void test_header_require(void) {
test_require("Require", "100rel");
const char* value1[] ={"user","critical"};
const char* value2[] ={"id"};
const char* value3[] ={"100rel"};
test_require("Require","user, critical",value1,2);
test_require("Require", "id",value2,1);
test_require("Require", "100rel", value3, 1);
}
#ifndef _WIN32
......
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