This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
tango-tfe/plugin/protocol/http2/include/internal/http2_stream.h

180 lines
4.4 KiB
C
Raw Normal View History

/*************************************************************************
> File Name: http_stream.h
> Author:
> Mail:
> Created Time: 2018<EFBFBD><EFBFBD>?09<EFBFBD><EFBFBD>?12<EFBFBD><EFBFBD>? <EFBFBD><EFBFBD>? 15<EFBFBD><EFBFBD>?56<EFBFBD><EFBFBD>?05<EFBFBD><EFBFBD>?
************************************************************************/
#ifndef _HTTP_STREAM_H
#define _HTTP_STREAM_H
#include <tfe_http.h>
#include <tfe_stream.h>
#include <nghttp2/nghttp2.h>
#include <sys/queue.h>
typedef int (*event_cb)(struct tfe_h2_half_private * hf_private,
tfe_http_event ev, const unsigned char * data,
size_t len, void * user);
enum h2_read_state
{
H2_READ_STATE_BEGIN,
H2_READ_STATE_READING,
H2_READ_STATE_COMPLETE,
};
struct tfe_h2_payload
{
int gzip;
uint8_t flags;
ssize_t padlen;
struct z_stream_st *inflate;
struct z_stream_st *deflate;
struct evbuffer * evbuf_body;
};
struct tfe_h2_field{
TAILQ_ENTRY(tfe_h2_field) next;
nghttp2_nv nv;
struct http_field_name *field;
};
struct tfe_h2_header{
TAILQ_HEAD(h2_field_list_head, tfe_h2_field) h2_field_list;
int nvlen;
uint8_t flag;
};
struct tfe_h2_half_private
{
/* PUBLIC STRUCTURE */
struct tfe_http_half half_public;
struct http_frame_session_ctx *frame_ctx;
/* UNDERLAY BUFFER */
int method_or_status;
int by_stream;
char * url_storage;
struct tfe_h2_payload body;
struct tfe_h2_header header;
struct tfe_h2_header promised;
/*Read Cache**/
int32_t stream_id;
nghttp2_session *session;
struct tfe_h2_session *father_session;
enum h2_read_state body_state;
enum h2_read_state message_state;
/* Callback Function */
int (*event_cb)(struct tfe_h2_half_private * half_private, tfe_http_event ev,
const unsigned char * data, size_t len, void * user);
/* Callback Function User Pointer */
void * event_cb_user;
/* Callback Function User Pointer Deleter */
void (* event_cb_user_deleter)(void *);
};
struct cache_trapper_t{
int spd_set;
int spd_valid;
int rse_set;
int spd_set_cnt;
int spd_cnt;
tfe_http_event spd_event;
};
struct tfe_h2_session{
struct tfe_http_session tfe_session;
TAILQ_ENTRY(tfe_h2_session) next;
const struct tfe_stream *tf_stream;
int32_t ngh2_stream_id;
nghttp2_session *session;
struct tfe_h2_stream *father_stream;
struct cache_trapper_t cache;
struct http_frame_session_ctx *frame_ctx;
struct tfe_h2_half_private *req, *plugin_built_req;
struct tfe_h2_half_private *resp, *plugin_built_resp;
};
struct tfe_h2_stream
{
TAILQ_HEAD(list_head, tfe_h2_session) h2_session_list;
int goaway;
enum tfe_stream_action stream_action;
unsigned int thread_id;
/** for down stream as server */
nghttp2_session *as_server;
/** for up stream as client*/
nghttp2_session *as_client;
const struct tfe_stream *tf_stream;
};
struct stream_tap_info_t
{
/** IS PREEMPTED */
unsigned int preempted;
/** sess manage */
struct tfe_h2_stream *h2_stream_info;
};
#define ACTION_USER_DATA 3
static inline const struct tfe_h2_half_private *
nghttp2_to_half_private(const struct tfe_http_half * half_public)
{
if(!half_public)
return NULL;
return container_of(half_public, struct tfe_h2_half_private, half_public);
}
static inline struct tfe_h2_half_private *
nghttp2_to_half_private(struct tfe_http_half * half_public)
{
if(!half_public)
return NULL;
return container_of(half_public, struct tfe_h2_half_private, half_public);
}
static inline struct tfe_h2_session *
nghttp2_to_stream_data(struct tfe_http_session * hs_public)
{
if (hs_public == NULL)
return NULL;
return container_of(hs_public, struct tfe_h2_session, tfe_session);
}
extern struct tfe_h2_stream* tfe_session_info_init();
extern void sess_data_ctx_fini(struct tfe_h2_stream *h2_stream_info, const struct tfe_stream * stream,
unsigned int thread_id);
extern enum tfe_stream_action
detect_down_stream_protocol(struct tfe_h2_stream *h2_stream_info, const struct tfe_stream *tfe_stream,
unsigned int thread_id, const unsigned char *data, size_t len);
extern enum tfe_stream_action
detect_up_stream_protocol(struct tfe_h2_stream *h2_stream_info, const struct tfe_stream *tfe_stream,
unsigned int thread_id, const unsigned char *data, size_t len);
enum tfe_stream_action
nghttp2_client_mem_send(struct tfe_h2_stream *h2_stream_info);
enum tfe_stream_action
nghttp2_server_mem_send(struct tfe_h2_stream *h2_stream_info);
/*for test **/
#endif