ib_status_t ib_parsed_tx_each_header( ib_parsed_name_value_pair_list_wrapper_t *headers, ib_parsed_tx_each_header_callback callback, void* user_data) { IB_FTRACE_INIT(); assert(headers!=NULL); ib_status_t rc = IB_OK; /* Loop over headers elements until the end of the list is reached or * IB_OK is not returned by the callback. */ for(const ib_parsed_name_value_pair_list_t *le = headers->head; le != NULL && rc == IB_OK; le = le->next) { rc = callback((const char *)ib_bytestr_const_ptr(le->name), ib_bytestr_size(le->name), (const char *)ib_bytestr_const_ptr(le->value), ib_bytestr_size(le->value), user_data); } IB_FTRACE_RET_STATUS(rc); }
/** * Feed a collection of byte strings from an @ref ib_data_t to automata. * * @param[in] ib IronBee engine; used for logging. * @param[in] eudoxus Eudoxus engine; used for ia_eudoxus_error(). * @param[in] state Current Eudoxus execution state; updated. * @param[in] data Data source. * @param[in] collection Collection to feed. * @return * - IB_OK on success. * - IB_EINVAL on IronAutomata failure; will emit log message. * - IB_EOTHER on IronBee failure; will emit log message. */ static ib_status_t fast_feed_data_collection( const ib_engine_t *ib, const ia_eudoxus_t *eudoxus, ia_eudoxus_state_t *state, const ib_data_t *data, const fast_collection_spec_t *collection ) { assert(ib != NULL); assert(eudoxus != NULL); assert(state != NULL); assert(data != NULL); assert(collection != NULL); ib_field_t *field; const ib_list_t *subfields; const ib_list_node_t *node; const ib_field_t *subfield; const ib_bytestr_t *bs; ib_status_t rc; rc = ib_data_get(data, collection->name, &field); if (rc == IB_ENOENT) { ib_log_error( ib, "fast: No such data %s", collection->name ); return IB_EOTHER; } else if (rc != IB_OK) { ib_log_error( ib, "fast: Error fetching data %s: %s", collection->name, ib_status_to_string(rc) ); return IB_EOTHER; } rc = ib_field_value_type( field, ib_ftype_list_out(&subfields), IB_FTYPE_LIST ); if (rc != IB_OK) { ib_log_error( ib, "fast: Error loading data field %s: %s", collection->name, ib_status_to_string(rc) ); return IB_EOTHER; } IB_LIST_LOOP_CONST(subfields, node) { subfield = (const ib_field_t *)ib_list_node_data_const(node); assert(subfield != NULL); rc = ib_field_value_type( subfield, ib_ftype_bytestr_out(&bs), IB_FTYPE_BYTESTR ); if (rc != IB_OK) { ib_log_error( ib, "fast: Error loading data subfield %s of %s: %s", subfield->name, collection->name, ib_status_to_string(rc) ); return IB_EOTHER; } rc = fast_feed( ib, eudoxus, state, (const uint8_t *)subfield->name, subfield->nlen ); if (rc != IB_OK) { return rc; } rc = fast_feed( ib, eudoxus, state, (const uint8_t *)collection->separator, strlen(collection->separator) ); if (rc != IB_OK) { return rc; } if (ib_bytestr_const_ptr(bs) != NULL && ib_bytestr_size(bs) > 0) { rc = fast_feed( ib, eudoxus, state, ib_bytestr_const_ptr(bs), ib_bytestr_size(bs) ); if (rc != IB_OK) { return rc; } } rc = fast_feed( ib, eudoxus, state, (const uint8_t *)c_data_separator, strlen(c_data_separator) ); if (rc != IB_OK) { return rc; } }
/** * Feed a byte string from an @ref ib_data_t to the automata. * * @param[in] ib IronBee engine; used for logging. * @param[in] eudoxus Eudoxus engine; used for * ia_eudoxus_error(). * @param[in] state Current Eudoxus execution state; updated. * @param[in] data Data source. * @param[in] bytestring_field_name Name of data field to feed. * @return * - IB_OK on success. * - IB_EINVAL on IronAutomata failure; will emit log message. * - IB_EOTHER on IronBee failure; will emit log message. */ static ib_status_t fast_feed_data_bytestring( const ib_engine_t *ib, const ia_eudoxus_t *eudoxus, ia_eudoxus_state_t *state, const ib_data_t *data, const char *bytestring_field_name ) { assert(ib != NULL); assert(eudoxus != NULL); assert(state != NULL); assert(data != NULL); assert(bytestring_field_name != NULL); ib_field_t *field; const ib_bytestr_t *bs; ib_status_t rc; rc = ib_data_get(data, bytestring_field_name, &field); if (rc == IB_ENOENT) { ib_log_error( ib, "fast: No such data %s", bytestring_field_name ); return IB_EOTHER; } else if (rc != IB_OK) { ib_log_error( ib, "fast: Error fetching data %s: %s", bytestring_field_name, ib_status_to_string(rc) ); return IB_EOTHER; } rc = ib_field_value_type( field, ib_ftype_bytestr_out(&bs), IB_FTYPE_BYTESTR ); if (rc != IB_OK) { ib_log_error( ib, "fast: Error loading data field %s: %s", bytestring_field_name, ib_status_to_string(rc) ); return IB_EOTHER; } if (ib_bytestr_const_ptr(bs) == NULL || ib_bytestr_size(bs) == 0) { return IB_OK; } return fast_feed( ib, eudoxus, state, ib_bytestr_const_ptr(bs), ib_bytestr_size(bs) ); }