增加简单的HTTP协议插件管理层,基本联通HTTP解析层与业务层插件。
This commit is contained in:
@@ -14,34 +14,51 @@ struct tfe_http_half * tfe_http_response_create(int major_version, int resp_code
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct ht_frame_session_ctx
|
||||
struct http_frame_session_ctx
|
||||
{
|
||||
void ** pmes;
|
||||
unsigned int nr_pmes;
|
||||
struct tfe_plugin * preempt_plugin;
|
||||
struct http_frame_plugin_status * plugin_status;
|
||||
unsigned int nr_plugin_status;
|
||||
|
||||
struct tfe_plugin * calling_plugin;
|
||||
struct http_frame_plugin_status * calling_plugin_status;
|
||||
};
|
||||
|
||||
struct ht_frame_session_ctx * http_frame_raise_session_begin(const struct tfe_stream * stream,
|
||||
struct http_frame_plugin_status * http_frame_current_plugin_status(struct http_frame_session_ctx * ht_frame)
|
||||
{
|
||||
return ht_frame->calling_plugin_status;
|
||||
}
|
||||
|
||||
struct http_frame_session_ctx * http_frame_raise_session_begin(const struct tfe_stream * stream,
|
||||
struct tfe_http_session * ht_session, unsigned int thread_id)
|
||||
{
|
||||
struct ht_frame_session_ctx * ss_ctx = ALLOC(struct ht_frame_session_ctx, 1);
|
||||
ss_ctx->nr_pmes = tfe_plugin_total_counts();
|
||||
ss_ctx->pmes = ALLOC(void *, ss_ctx->nr_pmes);
|
||||
struct http_frame_session_ctx * ht_frame = ALLOC(struct http_frame_session_ctx, 1);
|
||||
ht_frame->nr_plugin_status = tfe_plugin_total_counts();
|
||||
ht_frame->plugin_status = ALLOC(struct http_frame_plugin_status, ht_frame->nr_plugin_status);
|
||||
|
||||
unsigned int __for_each_iterator = 0;
|
||||
unsigned int __plugin_id = 0;
|
||||
struct tfe_plugin * plugin_info_iter;
|
||||
|
||||
struct tfe_plugin * plugin_info_iter;
|
||||
TFE_PLUGIN_FOREACH(plugin_info_iter, &__for_each_iterator)
|
||||
{
|
||||
if (plugin_info_iter->on_session_begin == NULL) continue;
|
||||
plugin_info_iter->on_session_begin(stream, ht_session, thread_id, &ss_ctx->pmes[__plugin_id]);
|
||||
|
||||
/* Calling ctx, in callback can fetch by calling frame_plugin_status_get_XXX */
|
||||
ht_frame->calling_plugin = plugin_info_iter;
|
||||
ht_frame->calling_plugin_status = &ht_frame->plugin_status[__plugin_id];
|
||||
|
||||
/* Call session begin */
|
||||
void ** calling_pme = &ht_frame->calling_plugin_status->pme;
|
||||
plugin_info_iter->on_session_begin(stream, ht_session, thread_id, calling_pme);
|
||||
}
|
||||
|
||||
return ss_ctx;
|
||||
/* Clear calling ctx */
|
||||
ht_frame->calling_plugin = NULL;
|
||||
ht_frame->calling_plugin_status = NULL;
|
||||
return ht_frame;
|
||||
};
|
||||
|
||||
void http_frame_raise_session_end(struct ht_frame_session_ctx * ss_ctx, struct tfe_stream * stream,
|
||||
void http_frame_raise_session_end(struct http_frame_session_ctx * ht_frame, struct tfe_stream * stream,
|
||||
struct tfe_http_session * ht_session, unsigned int thread_id)
|
||||
{
|
||||
unsigned int __for_each_iterator = 0;
|
||||
@@ -51,14 +68,24 @@ void http_frame_raise_session_end(struct ht_frame_session_ctx * ss_ctx, struct t
|
||||
TFE_PLUGIN_FOREACH(plugin_info_iter, &__for_each_iterator)
|
||||
{
|
||||
if (plugin_info_iter->on_session_end == NULL) continue;
|
||||
plugin_info_iter->on_session_end(stream, ht_session, thread_id, &ss_ctx->pmes[__plugin_id]);
|
||||
|
||||
/* Calling ctx, in callback can fetch by calling frame_plugin_status_get_XXX */
|
||||
ht_frame->calling_plugin = plugin_info_iter;
|
||||
ht_frame->calling_plugin_status = &ht_frame->plugin_status[__plugin_id];
|
||||
|
||||
/* Call session end */
|
||||
void ** calling_pme = &ht_frame->calling_plugin_status->pme;
|
||||
plugin_info_iter->on_session_end(stream, ht_session, thread_id, calling_pme);
|
||||
}
|
||||
|
||||
free(ss_ctx->pmes);
|
||||
free(ss_ctx);
|
||||
ht_frame->calling_plugin = NULL;
|
||||
ht_frame->calling_plugin_status = NULL;
|
||||
|
||||
free(ht_frame->plugin_status);
|
||||
free(ht_frame);
|
||||
}
|
||||
|
||||
void http_frame_raise_event(struct ht_frame_session_ctx * ht_frame,
|
||||
void http_frame_raise_event(struct http_frame_session_ctx * ht_frame,
|
||||
const struct tfe_stream * stream, struct tfe_http_session * ht_session, enum tfe_http_event event,
|
||||
const unsigned char * data, size_t datalen, unsigned int thread_id)
|
||||
{
|
||||
@@ -68,12 +95,34 @@ void http_frame_raise_event(struct ht_frame_session_ctx * ht_frame,
|
||||
struct tfe_plugin * plugin_info_iter;
|
||||
TFE_PLUGIN_FOREACH(plugin_info_iter, &__for_each_iterator)
|
||||
{
|
||||
if (plugin_info_iter->on_session_data == NULL)
|
||||
continue;
|
||||
if (plugin_info_iter->on_session_data == NULL) continue;
|
||||
|
||||
plugin_info_iter->on_session_data(stream, ht_session, event, data,
|
||||
datalen, thread_id, &ht_frame->pmes[__plugin_id]);
|
||||
/* Calling ctx, in callback can fetch by calling frame_plugin_status_get_XXX */
|
||||
ht_frame->calling_plugin = plugin_info_iter;
|
||||
ht_frame->calling_plugin_status = &ht_frame->plugin_status[__plugin_id];
|
||||
|
||||
void ** calling_pme = &ht_frame->calling_plugin_status->pme;
|
||||
plugin_info_iter->on_session_data(stream, ht_session, event, data, datalen, thread_id, calling_pme);
|
||||
}
|
||||
|
||||
return;
|
||||
ht_frame->calling_plugin = NULL;
|
||||
ht_frame->calling_plugin_status = NULL;
|
||||
}
|
||||
|
||||
void http_frame_currect_plugin_detach(struct http_frame_session_ctx * ht_frame)
|
||||
{
|
||||
ht_frame->calling_plugin_status->detached = 1;
|
||||
}
|
||||
|
||||
int http_frame_currect_plugin_preempt(struct http_frame_session_ctx * ht_frame)
|
||||
{
|
||||
for(unsigned int i = 0; i < ht_frame->nr_plugin_status; i++)
|
||||
{
|
||||
struct http_frame_plugin_status * __plugin_status = &ht_frame->plugin_status[i];
|
||||
if (__plugin_status->preempt) return -1;
|
||||
}
|
||||
|
||||
assert(ht_frame->calling_plugin_status != NULL);
|
||||
ht_frame->calling_plugin_status->preempt = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user