Http2Session.h 2.1 KB

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