12 #ifndef ROOT_THttpCallArg
13 #define ROOT_THttpCallArg
19 #include <condition_variable>
27 class THttpCallArg :
public TObject {
29 friend class THttpServer;
30 friend class THttpWSEngine;
31 friend class THttpWSHandler;
51 std::condition_variable fCond;
54 TString fRequestHeader;
56 Int_t fZipping{kNoZip};
58 Bool_t fNotifyFlag{kFALSE};
60 TString AccessHeader(TString &buf,
const char *name,
const char *value =
nullptr, Bool_t doing_set = kFALSE);
62 TString CountHeader(
const TString &buf, Int_t number = -1111)
const;
65 virtual void CheckWSPageContent(THttpWSHandler *) {}
68 std::shared_ptr<THttpWSEngine> fWSEngine;
71 std::string fPostData;
74 std::shared_ptr<THttpWSEngine> TakeWSEngine();
77 explicit THttpCallArg() {}
78 virtual ~THttpCallArg();
83 void SetMethod(
const char *method) { fMethod = method; }
86 void SetTopName(
const char *topname) { fTopName = topname; }
88 void SetPathAndFileName(
const char *fullpath);
91 void SetPathName(
const char *p) { fPathName = p; }
94 void SetFileName(
const char *f) { fFileName = f; }
97 void SetUserName(
const char *n) { fUserName = n; }
100 void SetQuery(
const char *q) { fQuery = q; }
102 void SetPostData(
void *data, Long_t length, Bool_t make_copy = kFALSE);
104 void SetPostData(std::string &&data);
107 void SetWSId(UInt_t
id) { fWSId = id; }
110 UInt_t GetWSId()
const {
return fWSId; }
113 void SetRequestHeader(
const char *h) { fRequestHeader = (h ? h :
""); }
116 Int_t NumRequestHeader()
const {
return CountHeader(fRequestHeader).Atoi(); }
119 TString GetRequestHeaderName(Int_t number)
const {
return CountHeader(fRequestHeader, number); }
122 TString GetRequestHeader(
const char *name) {
return AccessHeader(fRequestHeader, name); }
125 const char *GetTopName()
const {
return fTopName.Data(); }
128 const char *GetMethod()
const {
return fMethod.Data(); }
131 Bool_t IsMethod(
const char *name)
const {
return fMethod.CompareTo(name) == 0; }
134 Bool_t IsPostMethod()
const {
return IsMethod(
"POST"); }
137 const void *GetPostData()
const {
return fPostData.data(); }
140 Long_t GetPostDataLength()
const {
return (Long_t) fPostData.length(); }
143 const char *GetPathName()
const {
return fPathName.Data(); }
146 const char *GetFileName()
const {
return fFileName.Data(); }
149 const char *GetUserName()
const {
return fUserName.Length() > 0 ? fUserName.Data() :
nullptr; }
152 const char *GetQuery()
const {
return fQuery.Data(); }
157 void SetContentType(
const char *typ) { fContentType = typ; }
160 void Set404() { SetContentType(
"_404_"); }
163 void SetPostponed() { SetContentType(
"_postponed_"); }
166 void SetFile(
const char *filename =
nullptr)
168 SetContentType(
"_file_");
174 void SetTextContent(std::string &&txt);
177 void SetXmlContent(std::string &&xml);
180 void SetJsonContent(std::string &&json);
183 void SetBinaryContent(std::string &&bin);
185 void AddHeader(
const char *name,
const char *value);
187 void AddNoCacheHeader();
190 Int_t NumHeader()
const {
return CountHeader(fHeader).Atoi(); }
193 TString GetHeaderName(Int_t number)
const {
return CountHeader(fHeader, number); }
195 TString GetHeader(
const char *name);
198 void SetEncoding(
const char *typ) { AccessHeader(fHeader,
"Content-Encoding", typ, kTRUE); }
200 void SetContent(
const char *cont);
201 void SetContent(std::string &&cont);
202 void ReplaceAllinContent(
const std::string &from,
const std::string &to,
bool once =
false);
204 Bool_t CompressWithGzip();
206 void SetZipping(Int_t mode = kZipLarge) { fZipping = mode; }
207 Int_t GetZipping()
const {
return fZipping; }
210 void SetExtraHeader(
const char *name,
const char *value) { AddHeader(name, value); }
212 std::string FillHttpHeader(
const char *header =
nullptr);
216 Bool_t IsContentType(
const char *typ)
const {
return fContentType == typ; }
217 const char *GetContentType()
const {
return fContentType.Data(); }
219 Bool_t Is404()
const {
return IsContentType(
"_404_"); }
220 Bool_t IsFile()
const {
return IsContentType(
"_file_"); }
221 Bool_t IsPostponed()
const {
return IsContentType(
"_postponed_"); }
222 Bool_t IsText()
const {
return IsContentType(
"text/plain"); }
223 Bool_t IsXml()
const {
return IsContentType(
"text/xml"); }
224 Bool_t IsJson()
const {
return IsContentType(
"application/json"); }
225 Bool_t IsBinary()
const {
return IsContentType(
"application/x-binary"); }
227 Long_t GetContentLength()
const {
return (Long_t) fContent.length(); }
228 const void *GetContent()
const {
return fContent.data(); }
230 void NotifyCondition();
232 virtual void HttpReplied();
234 template <
class T,
typename... Args>
235 void CreateWSEngine(Args... args)
237 fWSEngine = std::make_shared<T>(args...);
241 ClassDef(THttpCallArg, 0)