emsApplication/3rdPartner/libhv/http/Http2Parser.h

90 lines
2.2 KiB
C++

#ifndef HV_HTTP2_PARSER_H_
#define HV_HTTP2_PARSER_H_
#ifdef WITH_NGHTTP2
#include "HttpParser.h"
#include "http2def.h"
#include "grpcdef.h"
#include "nghttp2/nghttp2.h"
enum http2_session_state {
H2_SEND_MAGIC,
H2_SEND_SETTINGS,
H2_SEND_PING,
H2_SEND_HEADERS,
H2_SEND_DATA_FRAME_HD,
H2_SEND_DATA,
H2_SEND_DONE,
H2_WANT_SEND,
H2_WANT_RECV,
H2_RECV_SETTINGS,
H2_RECV_PING,
H2_RECV_HEADERS,
H2_RECV_DATA,
};
class Http2Parser : public HttpParser {
public:
static nghttp2_session_callbacks* cbs;
nghttp2_session* session;
http2_session_state state;
HttpMessage* submited;
HttpMessage* parsed;
int error;
int stream_id;
int stream_closed;
int frame_type_when_stream_closed;
// http2_frame_hd + grpc_message_hd
// at least HTTP2_FRAME_HDLEN + GRPC_MESSAGE_HDLEN = 9 + 5 = 14
unsigned char frame_hdbuf[32];
Http2Parser(http_session_type type = HTTP_CLIENT);
virtual ~Http2Parser();
virtual int GetSendData(char** data, size_t* len);
virtual int FeedRecvData(const char* data, size_t len);
virtual int GetState() {
return (int)state;
}
virtual bool WantRecv() {
return state == H2_WANT_RECV;
}
virtual bool WantSend() {
return state <= H2_WANT_SEND;
}
virtual bool IsComplete() {
return stream_closed && (frame_type_when_stream_closed == HTTP2_DATA || frame_type_when_stream_closed == HTTP2_HEADERS);
}
virtual int GetError() {
return error;
}
virtual const char* StrError(int error) {
//return nghttp2_http2_strerror(error);
return nghttp2_strerror(error);
}
// client
// SubmitRequest -> while(GetSendData) {send} -> InitResponse -> do {recv -> FeedRecvData} while(WantRecv)
virtual int SubmitRequest(HttpRequest* req);
virtual int InitResponse(HttpResponse* res);
// server
// InitRequest -> do {recv -> FeedRecvData} while(WantRecv) -> SubmitResponse -> while(GetSendData) {send}
virtual int InitRequest(HttpRequest* req);
virtual int SubmitResponse(HttpResponse* res);
};
#endif
#endif // HV_HTTP2_PARSER_H_