httpreqdata.h 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #pragma once
  2. #include <library/cpp/digest/lower_case/hash_ops.h>
  3. #include <util/str_stl.h>
  4. #include <util/system/defaults.h>
  5. #include <util/string/cast.h>
  6. #include <library/cpp/cgiparam/cgiparam.h>
  7. #include <util/network/address.h>
  8. #include <util/network/socket.h>
  9. #include <util/generic/hash.h>
  10. #include <util/system/yassert.h>
  11. #include <util/generic/string.h>
  12. #include <util/datetime/base.h>
  13. #include <util/generic/buffer.h>
  14. using THttpHeadersContainer = THashMap<TString, TString, TCIOps, TCIOps>;
  15. class TBaseServerRequestData {
  16. public:
  17. TBaseServerRequestData(SOCKET s = INVALID_SOCKET);
  18. TBaseServerRequestData(const char* qs, SOCKET s = INVALID_SOCKET);
  19. void SetHost(const TString& host, ui16 port) {
  20. Host = host;
  21. Port = ToString(port);
  22. }
  23. const TString& ServerName() const {
  24. return Host;
  25. }
  26. NAddr::IRemoteAddrPtr ServerAddress() const {
  27. return NAddr::GetSockAddr(Socket);
  28. }
  29. const TString& ServerPort() const {
  30. return Port;
  31. }
  32. const char* ScriptName() const {
  33. return Path;
  34. }
  35. const char* QueryString() const {
  36. return Search;
  37. }
  38. TStringBuf QueryStringBuf() const {
  39. return TStringBuf(Search, SearchLength);
  40. }
  41. TStringBuf OrigQueryStringBuf() const {
  42. return OrigSearch;
  43. }
  44. void AppendQueryString(const char* str, size_t length);
  45. const char* RemoteAddr() const;
  46. void SetRemoteAddr(TStringBuf addr);
  47. const char* HeaderIn(TStringBuf key) const;
  48. const THttpHeadersContainer& HeadersIn() const {
  49. return HeadersIn_;
  50. }
  51. inline size_t HeadersCount() const noexcept {
  52. return HeadersIn_.size();
  53. }
  54. TString HeaderByIndex(size_t n) const noexcept;
  55. const char* Environment(const char* key) const;
  56. void Clear();
  57. void SetSocket(SOCKET s) noexcept {
  58. Socket = s;
  59. }
  60. ui64 RequestBeginTime() const noexcept {
  61. return BeginTime;
  62. }
  63. void SetPath(const TString& path);
  64. const char* GetCurPage() const;
  65. bool Parse(const char* req);
  66. void AddHeader(const TString& name, const TString& value);
  67. private:
  68. TBuffer PathStorage;
  69. mutable char* Addr;
  70. TString Host;
  71. TString Port;
  72. char* Path;
  73. char* Search;
  74. size_t SearchLength; // length of Search
  75. TStringBuf OrigSearch;
  76. THttpHeadersContainer HeadersIn_;
  77. mutable char AddrData[INET6_ADDRSTRLEN];
  78. SOCKET Socket;
  79. ui64 BeginTime;
  80. mutable TString CurPage;
  81. TBuffer ParseBuf;
  82. TBuffer ModifiedQueryString;
  83. };
  84. class TServerRequestData: public TBaseServerRequestData {
  85. public:
  86. TServerRequestData(SOCKET s = INVALID_SOCKET)
  87. : TBaseServerRequestData(s)
  88. {
  89. }
  90. TServerRequestData(const char* qs, SOCKET s = INVALID_SOCKET)
  91. : TBaseServerRequestData(qs, s)
  92. {
  93. Scan();
  94. }
  95. void Scan() {
  96. CgiParam.Scan(QueryStringBuf());
  97. }
  98. public:
  99. TCgiParameters CgiParam;
  100. };