1
0

Http2Parser.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. #ifndef HV_HTTP2_PARSER_H_
  2. #define HV_HTTP2_PARSER_H_
  3. #ifdef WITH_NGHTTP2
  4. #include "HttpParser.h"
  5. #include "http2def.h"
  6. #include "grpcdef.h"
  7. #include "nghttp2/nghttp2.h"
  8. enum http2_session_state {
  9. H2_SEND_MAGIC,
  10. H2_SEND_SETTINGS,
  11. H2_SEND_PING,
  12. H2_SEND_HEADERS,
  13. H2_SEND_DATA_FRAME_HD,
  14. H2_SEND_DATA,
  15. H2_SEND_DONE,
  16. H2_WANT_SEND,
  17. H2_WANT_RECV,
  18. H2_RECV_SETTINGS,
  19. H2_RECV_PING,
  20. H2_RECV_HEADERS,
  21. H2_RECV_DATA,
  22. };
  23. class Http2Parser : public HttpParser {
  24. public:
  25. static nghttp2_session_callbacks* cbs;
  26. nghttp2_session* session;
  27. http2_session_state state;
  28. HttpMessage* submited;
  29. HttpMessage* parsed;
  30. int error;
  31. int stream_id;
  32. int stream_closed;
  33. int frame_type_when_stream_closed;
  34. // http2_frame_hd + grpc_message_hd
  35. // at least HTTP2_FRAME_HDLEN + GRPC_MESSAGE_HDLEN = 9 + 5 = 14
  36. unsigned char frame_hdbuf[32];
  37. Http2Parser(http_session_type type = HTTP_CLIENT);
  38. virtual ~Http2Parser();
  39. virtual int GetSendData(char** data, size_t* len);
  40. virtual int FeedRecvData(const char* data, size_t len);
  41. virtual int GetState() {
  42. return (int)state;
  43. }
  44. virtual bool WantRecv() {
  45. return state == H2_WANT_RECV;
  46. }
  47. virtual bool WantSend() {
  48. return state <= H2_WANT_SEND;
  49. }
  50. virtual bool IsComplete() {
  51. return stream_closed && (frame_type_when_stream_closed == HTTP2_DATA || frame_type_when_stream_closed == HTTP2_HEADERS);
  52. }
  53. virtual int GetError() {
  54. return error;
  55. }
  56. virtual const char* StrError(int error) {
  57. //return nghttp2_http2_strerror(error);
  58. return nghttp2_strerror(error);
  59. }
  60. // client
  61. // SubmitRequest -> while(GetSendData) {send} -> InitResponse -> do {recv -> FeedRecvData} while(WantRecv)
  62. virtual int SubmitRequest(HttpRequest* req);
  63. virtual int InitResponse(HttpResponse* res);
  64. // server
  65. // InitRequest -> do {recv -> FeedRecvData} while(WantRecv) -> SubmitResponse -> while(GetSendData) {send}
  66. virtual int InitRequest(HttpRequest* req);
  67. virtual int SubmitResponse(HttpResponse* res);
  68. };
  69. #endif
  70. #endif // HV_HTTP2_PARSER_H_