У меня есть ответы SAML 1.1 и SAML 1.0 в буферах utf-8 char *
, и я хотел бы преобразовать их в объекты Rampart / C saml_response_t *
. У меня вопрос такой:
Как правильно создать saml_response_t
из строки?
В идеале я хотел бы получить пример кода на C, который делает это, а затем располагает различные инструменты синтаксического анализа в правильном порядке, поскольку Axis2 / C имеет некоторые странные идеи о том, как освободить память.
Мои усилия по достижению этой цели потерпели неудачу, что в основном привело к сбоям памяти, но вот что я имею. Имейте в виду, что метод deserialize_buffer()
делает именно то, что говорит - преобразует буфер в axiom_node_t *
, но я также готов заменить его.
/* : get the raw XML from the SAML assertion */
xml_data = Tcl_GetStringFromObj (objv[2], &xml_length);
/* : parse the response XML for processing */
stream = gstream_mem_create (xml_data, xml_length);
node = Axis2_axiom_deserialize_buffer (env, stream);
/* : build a SAML response from the parsed XML */
saml_response = saml_response_create (env);
saml_response_build (saml_response, node, env);
arraylist = saml_response_get_assertions (saml_response, env);
/* : create our return value object */
obj = Tcl_NewListObj (0, NULL);
/* :- convert the SAML assertion into a string */
for (i = 0;
i < axutil_array_list_size (arraylist, env);
i++) {
saml_assertion = (saml_assertion_t *) axutil_array_list_get (arraylist, env, i);
if (saml_assertion != NULL) {
assertion_node = saml_assertion_to_om (saml_assertion, NULL, env);
element = Tcl_NewStringObj (axiom_node_to_string (node, env), -1);
Tcl_ListObjAppendElement (interp, obj, element);
axiom_node_free_tree (assertion_node, env);
}
}