xrootd
XrdHttpReq.hh
Go to the documentation of this file.
1 //------------------------------------------------------------------------------
2 // This file is part of XrdHTTP: A pragmatic implementation of the
3 // HTTP/WebDAV protocol for the Xrootd framework
4 //
5 // Copyright (c) 2013 by European Organization for Nuclear Research (CERN)
6 // Author: Fabrizio Furano <furano@cern.ch>
7 // File Date: Nov 2012
8 //------------------------------------------------------------------------------
9 // XRootD is free software: you can redistribute it and/or modify
10 // it under the terms of the GNU Lesser General Public License as published by
11 // the Free Software Foundation, either version 3 of the License, or
12 // (at your option) any later version.
13 //
14 // XRootD is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
18 //
19 // You should have received a copy of the GNU Lesser General Public License
20 // along with XRootD. If not, see <http://www.gnu.org/licenses/>.
21 //------------------------------------------------------------------------------
22 
23 
24 
25 
26 
27 
28 
38 #ifndef XRDHTTPREQ_HH
39 #define XRDHTTPREQ_HH
40 
41 
42 #include "XrdOuc/XrdOucString.hh"
43 
44 #include "XProtocol/XProtocol.hh"
48 
49 #include <vector>
50 #include <string>
51 #include <map>
52 
53 //#include <libxml/parser.h>
54 //#include <libxml/tree.h>
55 
56 
57 
58 
59 struct DirListInfo {
60  std::string path;
61  long long size;
62  long id;
63  long flags;
64  long modtime;
65 };
66 
67 
68 class XrdHttpProtocol;
69 class XrdOucEnv;
70 
72 private:
73  // HTTP response parameters to be sent back to the user
75  std::string httpStatusText;
76 
77  // Whether transfer encoding was requested.
81 
82  // Whether trailer headers were enabled
83  bool m_trailer_headers{false};
84 
85  // Whether the client understands our special status trailer.
86  // The status trailer allows us to report when an IO error occurred
87  // after a response body has started
88  bool m_status_trailer{false};
89 
90  int parseHost(char *);
91 
92  //xmlDocPtr xmlbody; /* the resulting document tree */
94 
95  void clientMarshallReadAheadList(int nitems);
96  void clientUnMarshallReadAheadList(int nitems);
97 
98 
99  void getfhandle();
100 
101  // Process the checksum response and return a header that should
102  // be included in the response.
103  int PostProcessChecksum(std::string &digest_header);
104 
110  int PostProcessHTTPReq(bool final = false);
111 
112  // Parse a resource string, typically a filename, setting the resource field and the opaque data
113  void parseResource(char *url);
114  // Map an XRootD error code to an appropriate HTTP status code and message
116 
117  // Sanitize the resource from http[s]://[host]/ questionable prefix
118  void sanitizeResourcePfx();
119 
120  // parses the iovN data pointers elements as either a kXR_read or kXR_readv
121  // response and fills out a XrdHttpIOList with the corresponding length and
122  // buffer pointers. File offsets from kXR_readv responses are not recorded.
123  void getReadResponse(XrdHttpIOList &received);
124 
125  // notifies the range handler of receipt of bytes and sends the client
126  // the data.
127  int sendReadResponseSingleRange(const XrdHttpIOList &received);
128 
129  // notifies the range handler of receipt of bytes and sends the client
130  // the data and necessary headers, assuming multipart/byteranges content type.
131  int sendReadResponsesMultiRanges(const XrdHttpIOList &received);
132 
138  static void extractChecksumFromList(const std::string & checksumList, std::vector<std::string> & extractedChecksum);
139 
146  static void determineXRootDChecksumFromUserDigest(const std::string & userDigest, std::vector<std::string> & xrootdChecksums);
147 
148 public:
150  readRangeHandler(rcfg), keepalive(true) {
151 
152  prot = protinstance;
153  length = 0;
154  //xmlbody = 0;
155  depth = 0;
156  opaque = 0;
157  writtenbytes = 0;
158  fopened = false;
159  headerok = false;
160  };
161 
162  virtual ~XrdHttpReq();
163 
164  virtual void reset();
165 
167  int parseLine(char *line, int len);
168 
170  int parseFirstLine(char *line, int len);
171 
173  int parseBody(char *body, long long len);
174 
176  int ReqReadV(const XrdHttpIOList &cl);
177  std::vector<readahead_list> ralist;
178 
180  std::string buildPartialHdr(long long bytestart, long long byteend, long long filesize, char *token);
181 
183  std::string buildPartialHdrEnd(char *token);
184 
185  // Appends the opaque info that we have
186  // NOTE: this function assumes that the strings are unquoted, and will quote them
187  void appendOpaque(XrdOucString &s, XrdSecEntity *secent, char *hash, time_t tnow);
188 
189  // ----------------
190  // Description of the request. The header/body parsing
191  // is supposed to populate these fields, for fast access while
192  // processing the request
193 
195 
196  enum ReqType {
197  rtUnset = -1,
210  };
211 
214  std::string requestverb;
215 
216  // We have to keep the headers for possible further processing
217  // by external plugins
218  std::map<std::string, std::string> allheaders;
219 
226 
227 
229  bool headerok;
230 
234 
235  bool keepalive;
236  long long length; // Total size from client for PUT; total length of response TO client for GET.
237  int depth;
239 
241  std::string host;
243  std::string destination;
244 
246  std::string m_req_digest;
247 
250 
256  std::string m_digest_header;
257 
259  std::string hdr2cgistr;
261 
262  //
263  // Area for coordinating request and responses to/from the bridge
264  //
265 
266 
268  unsigned int rwOpDone, rwOpPartialDone;
269 
272 
276  std::string etext;
278 
280  const struct iovec *iovP;
281  int iovN;
282  int iovL;
283  bool final;
284 
285  // The latest stat info got from the xrd layer
286  long long filesize;
287  long fileflags;
289  long filectime;
290  char fhandle[4];
291  bool fopened;
292 
294  std::string stringresp;
295 
297  int reqstate;
298 
300  long long writtenbytes;
301 
302 
303 
304 
305 
311  int ProcessHTTPReq();
312 
313 
314  // ------------
315  // Items inherited from the Bridge class
316  //
317 
318  //-----------------------------------------------------------------------------
344  //-----------------------------------------------------------------------------
345 
346  virtual bool Data(XrdXrootd::Bridge::Context &info,
347  const
348  struct iovec *iovP,
349  int iovN,
350  int iovL,
351  bool final
352  );
353 
354  //-----------------------------------------------------------------------------
364  //-----------------------------------------------------------------------------
365 
366  virtual bool Done(XrdXrootd::Bridge::Context &info);
367 
368 
369  //-----------------------------------------------------------------------------
382  //-----------------------------------------------------------------------------
383 
384  virtual bool Error(XrdXrootd::Bridge::Context &info,
385  int ecode,
386  const char *etext
387  );
388 
389  //-----------------------------------------------------------------------------
402  //-----------------------------------------------------------------------------
403 
404  virtual int File(XrdXrootd::Bridge::Context &info,
405  int dlen
406  );
407 
408  //-----------------------------------------------------------------------------
421  //-----------------------------------------------------------------------------
422 
423  virtual bool Redir(XrdXrootd::Bridge::Context &info,
424  int port,
425  const char *hname
426  );
427 
428 };
429 
430 
431 
432 void trim(std::string &str);
433 
434 #endif /* XRDHTTPREQ_HH */
435 
long filemodtime
Definition: XrdHttpReq.hh:288
virtual bool Data(XrdXrootd::Bridge::Context &info, const struct iovec *iovP, int iovN, int iovL, bool final)
bool readClosing
Definition: XrdHttpReq.hh:233
int depth
Definition: XrdHttpReq.hh:237
XResponseType xrdresp
The last response data we got.
Definition: XrdHttpReq.hh:274
void clientMarshallReadAheadList(int nitems)
Definition: XrdHttpReq.hh:205
std::string requestverb
Definition: XrdHttpReq.hh:214
Definition: XrdHttpReq.hh:201
long modtime
Definition: XrdHttpReq.hh:64
long fileflags
Definition: XrdHttpReq.hh:287
std::string buildPartialHdr(long long bytestart, long long byteend, long long filesize, char *token)
Build a partial header for a multipart response.
int ReqReadV(const XrdHttpIOList &cl)
Prepare the buffers for sending a readv request.
int parseFirstLine(char *line, int len)
Parse the first line of the header.
XrdHttpReq(XrdHttpProtocol *protinstance, const XrdHttpReadRangeHandler::Configuration &rcfg)
Definition: XrdHttpReq.hh:149
std::vector< XrdOucIOVec2 > XrdHttpIOList
Definition: XrdHttpUtils.hh:95
long long writtenbytes
In a long write, we track where we have arrived.
Definition: XrdHttpReq.hh:300
bool sendcontinue
Definition: XrdHttpReq.hh:238
XrdHttpProtocol * prot
Definition: XrdHttpReq.hh:93
std::string destination
The destination field specified in the req.
Definition: XrdHttpReq.hh:243
Definition: XrdXrootdBridge.hh:225
XrdOucString resourceplusopaque
The resource specified by the request, including all the opaque data.
Definition: XrdHttpReq.hh:225
XrdOucString m_resource_with_digest
Definition: XrdHttpReq.hh:254
Definition: XrdHttpReq.hh:71
void parseResource(char *url)
bool m_status_trailer
Definition: XrdHttpReq.hh:88
int sendReadResponseSingleRange(const XrdHttpIOList &received)
static void determineXRootDChecksumFromUserDigest(const std::string &userDigest, std::vector< std::string > &xrootdChecksums)
void trim(std::string &str)
int ProcessHTTPReq()
virtual bool Redir(XrdXrootd::Bridge::Context &info, int port, const char *hname)
Definition: XrdHttpReq.hh:208
ReqType
These are the HTTP/DAV requests that we support.
Definition: XrdHttpReq.hh:196
XrdHttpReadRangeHandler readRangeHandler
Tracking the next ranges of data to read during GET.
Definition: XrdHttpReq.hh:232
bool fopened
Definition: XrdHttpReq.hh:291
long long size
Definition: XrdHttpReq.hh:61
static void extractChecksumFromList(const std::string &checksumList, std::vector< std::string > &extractedChecksum)
std::vector< readahead_list > ralist
Definition: XrdHttpReq.hh:177
XrdOucEnv * opaque
The opaque data, after parsing.
Definition: XrdHttpReq.hh:223
XResponseType
Definition: XProtocol.hh:896
std::size_t hash(const BasicJsonType &j)
hash a JSON value
Definition: XrdOucJson.hh:5221
int parseLine(char *line, int len)
Parse the header.
int iovL
byte count
Definition: XrdHttpReq.hh:282
XrdHttpChecksumHandler::XrdHttpChecksumRawPtr m_req_cksum
The checksum that was ran for this request.
Definition: XrdHttpReq.hh:249
std::string etext
Definition: XrdHttpReq.hh:276
long filectime
Definition: XrdHttpReq.hh:289
virtual bool Error(XrdXrootd::Bridge::Context &info, int ecode, const char *etext)
Definition: XrdHttpReq.hh:209
const struct iovec * iovP
The latest data chunks got from the xrd layer. These are valid only inside the callbacks! ...
Definition: XrdHttpReq.hh:280
bool headerok
Tells if we have finished reading the header.
Definition: XrdHttpReq.hh:229
bool m_trailer_headers
Definition: XrdHttpReq.hh:83
bool keepalive
Definition: XrdHttpReq.hh:235
char fhandle[4]
Definition: XrdHttpReq.hh:290
virtual int File(XrdXrootd::Bridge::Context &info, int dlen)
Definition: XrdHttpReq.hh:197
int httpStatusCode
Definition: XrdHttpReq.hh:74
int parseHost(char *)
virtual ~XrdHttpReq()
Definition: XrdHttpReq.hh:59
void getReadResponse(XrdHttpIOList &received)
virtual bool Done(XrdXrootd::Bridge::Context &info)
the result context
Definition: XrdHttpReq.hh:207
long long m_current_chunk_size
Definition: XrdHttpReq.hh:80
std::string buildPartialHdrEnd(char *token)
Build the closing part for a multipart response.
std::string hdr2cgistr
Additional opaque info that may come from the hdr2cgi directive.
Definition: XrdHttpReq.hh:259
int PostProcessHTTPReq(bool final=false)
XErrorCode
Definition: XProtocol.hh:987
Definition: XrdOucEnv.hh:41
std::string host
The host field specified in the req.
Definition: XrdHttpReq.hh:241
std::string httpStatusText
Definition: XrdHttpReq.hh:75
int parseBody(char *body, long long len)
Parse the body of a request, assuming that it&#39;s XML and that it&#39;s entirely in memory.
std::string m_req_digest
The requested digest type.
Definition: XrdHttpReq.hh:246
void getfhandle()
unsigned int rwOpDone
To coordinate multipart responses across multiple calls.
Definition: XrdHttpReq.hh:268
bool m_transfer_encoding_chunked
Definition: XrdHttpReq.hh:78
std::string m_digest_header
The computed digest for the HTTP response header.
Definition: XrdHttpReq.hh:256
Definition: XrdHttpReadRangeHandler.hh:54
int PostProcessChecksum(std::string &digest_header)
void mapXrdErrorToHttpStatus()
Definition: XrdHttpProtocol.hh:78
long id
Definition: XrdHttpReq.hh:62
Definition: XrdXrootdBridge.hh:293
Definition: XrdHttpReq.hh:199
void clientUnMarshallReadAheadList(int nitems)
ClientRequest xrdreq
The last issued xrd request, often pending.
Definition: XrdHttpReq.hh:271
std::string stringresp
If we want to give a string as a response, we compose it here.
Definition: XrdHttpReq.hh:294
long long length
Definition: XrdHttpReq.hh:236
Definition: XrdHttpChecksum.hh:32
int iovN
array count
Definition: XrdHttpReq.hh:281
Definition: XrdHttpReq.hh:206
long long m_current_chunk_offset
Definition: XrdHttpReq.hh:79
int reqstate
State machine to talk to the bridge.
Definition: XrdHttpReq.hh:297
long long filesize
Definition: XrdHttpReq.hh:286
bool m_appended_hdr2cgistr
Definition: XrdHttpReq.hh:260
Definition: XrdHttpReq.hh:198
void appendOpaque(XrdOucString &s, XrdSecEntity *secent, char *hash, time_t tnow)
XErrorCode xrderrcode
Definition: XrdHttpReq.hh:275
Definition: XrdSecEntity.hh:64
Definition: XProtocol.hh:843
int sendReadResponsesMultiRanges(const XrdHttpIOList &received)
XrdOucString redirdest
Definition: XrdHttpReq.hh:277
virtual void reset()
ReqType request
The request we got.
Definition: XrdHttpReq.hh:213
XrdOucString resource
The resource specified by the request, stripped of opaque data.
Definition: XrdHttpReq.hh:221
Definition: XrdHttpReq.hh:202
Definition: XrdHttpReq.hh:200
std::map< std::string, std::string > allheaders
Definition: XrdHttpReq.hh:218
Definition: XrdHttpReq.hh:204
void sanitizeResourcePfx()
Definition: XrdOucString.hh:254
unsigned int rwOpPartialDone
Definition: XrdHttpReq.hh:268
long flags
Definition: XrdHttpReq.hh:63
Definition: XrdHttpReq.hh:203
std::string path
Definition: XrdHttpReq.hh:60
Definition: XrdHttpReadRangeHandler.hh:36