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"
46 
47 #include <vector>
48 #include <string>
49 #include <map>
50 
51 //#include <libxml/parser.h>
52 //#include <libxml/tree.h>
53 
54 
55 
56 #define READV_MAXCHUNKS 512
57 #define READV_MAXCHUNKSIZE (1024*128)
58 
59 struct ReadWriteOp {
60  // < 0 means "not specified"
61  long long bytestart;
62  long long byteend;
63 };
64 
65 struct DirListInfo {
66  std::string path;
67  long long size;
68  long id;
69  long flags;
70  long modtime;
71 };
72 
73 
74 class XrdHttpProtocol;
75 class XrdOucEnv;
76 
78 private:
79  // HTTP response parameters to be sent back to the user
81  std::string httpStatusText;
82 
83  // Whether transfer encoding was requested.
87 
88  int parseContentRange(char *);
89  int parseHost(char *);
90  int parseRWOp(char *);
91 
92  //xmlDocPtr xmlbody; /* the resulting document tree */
94 
95  void clientMarshallReadAheadList(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
119 public:
120 
121  XrdHttpReq(XrdHttpProtocol *protinstance) : keepalive(true) {
122 
123  prot = protinstance;
124  length = 0;
125  //xmlbody = 0;
126  depth = 0;
127  ralist = 0;
128  opaque = 0;
129  writtenbytes = 0;
130  fopened = false;
131  headerok = false;
132  };
133 
134  virtual ~XrdHttpReq();
135 
136  virtual void reset();
137 
139  int parseLine(char *line, int len);
140 
142  int parseFirstLine(char *line, int len);
143 
145  int parseBody(char *body, long long len);
146 
148  int ReqReadV();
150 
152  std::string buildPartialHdr(long long bytestart, long long byteend, long long filesize, char *token);
153 
155  std::string buildPartialHdrEnd(char *token);
156 
157  // Appends the opaque info that we have
158  // NOTE: this function assumes that the strings are unquoted, and will quote them
159  void appendOpaque(XrdOucString &s, XrdSecEntity *secent, char *hash, time_t tnow);
160 
161  // ----------------
162  // Description of the request. The header/body parsing
163  // is supposed to populate these fields, for fast access while
164  // processing the request
165 
167 
168  enum ReqType {
169  rtUnset = -1,
181  rtPOST
182  };
183 
186  std::string requestverb;
187 
188  // We have to keep the headers for possible further processing
189  // by external plugins
190  std::map<std::string, std::string> allheaders;
191 
198 
199 
201  bool headerok;
202 
203 
204  // This can be largely optimized...
206  std::vector<ReadWriteOp> rwOps;
209  std::vector<ReadWriteOp> rwOps_split;
210 
211  bool keepalive;
212  long long length; // Total size from client for PUT; total length of response TO client for GET.
213  int depth;
215 
217  std::string host;
219  std::string destination;
220 
222  std::string m_req_digest;
228  std::string m_digest_header;
229 
231  std::string hdr2cgistr;
233 
234  //
235  // Area for coordinating request and responses to/from the bridge
236  //
237 
238 
240  unsigned int rwOpDone, rwOpPartialDone;
241 
244 
248  std::string etext;
250 
252  const struct iovec *iovP;
253  int iovN;
254  int iovL;
255  bool final;
256 
257  // The latest stat info got from the xrd layer
258  long long filesize;
259  long fileflags;
261  char fhandle[4];
262  bool fopened;
263 
265  std::string stringresp;
266 
268  int reqstate;
269 
271  long long writtenbytes;
272 
273 
274 
275 
276 
283 
284 
285  // ------------
286  // Items inherited from the Bridge class
287  //
288 
289  //-----------------------------------------------------------------------------
315  //-----------------------------------------------------------------------------
316 
317  virtual bool Data(XrdXrootd::Bridge::Context &info,
318  const
319  struct iovec *iovP,
320  int iovN,
321  int iovL,
322  bool final
323  );
324 
325  //-----------------------------------------------------------------------------
335  //-----------------------------------------------------------------------------
336 
337  virtual bool Done(XrdXrootd::Bridge::Context &info);
338 
339 
340  //-----------------------------------------------------------------------------
353  //-----------------------------------------------------------------------------
354 
355  virtual bool Error(XrdXrootd::Bridge::Context &info,
356  int ecode,
357  const char *etext
358  );
359 
360  //-----------------------------------------------------------------------------
373  //-----------------------------------------------------------------------------
374 
375  virtual int File(XrdXrootd::Bridge::Context &info,
376  int dlen
377  );
378 
379  //-----------------------------------------------------------------------------
392  //-----------------------------------------------------------------------------
393 
394  virtual bool Redir(XrdXrootd::Bridge::Context &info,
395  int port,
396  const char *hname
397  );
398 
399 
400 
401 
402 
403 };
404 
405 
406 
407 void trim(std::string &str);
408 
409 #endif /* XRDHTTPREQ_HH */
410 
XErrorCode
Definition: XProtocol.hh:982
XResponseType
Definition: XProtocol.hh:891
void trim(std::string &str)
Definition: XrdHttpProtocol.hh:76
Definition: XrdHttpReq.hh:77
int reqstate
State machine to talk to the bridge.
Definition: XrdHttpReq.hh:268
char fhandle[4]
Definition: XrdHttpReq.hh:261
int PostProcessHTTPReq(bool final=false)
bool keepalive
Definition: XrdHttpReq.hh:211
std::vector< ReadWriteOp > rwOps
The original list of multiple reads to perform.
Definition: XrdHttpReq.hh:206
unsigned int rwOpPartialDone
Definition: XrdHttpReq.hh:240
ReqType
These are the HTTP/DAV requests that we support.
Definition: XrdHttpReq.hh:168
@ rtUnset
Definition: XrdHttpReq.hh:169
@ rtMalformed
Definition: XrdHttpReq.hh:171
@ rtDELETE
Definition: XrdHttpReq.hh:177
@ rtOPTIONS
Definition: XrdHttpReq.hh:175
@ rtMOVE
Definition: XrdHttpReq.hh:180
@ rtHEAD
Definition: XrdHttpReq.hh:173
@ rtGET
Definition: XrdHttpReq.hh:172
@ rtPATCH
Definition: XrdHttpReq.hh:176
@ rtPROPFIND
Definition: XrdHttpReq.hh:178
@ rtPUT
Definition: XrdHttpReq.hh:174
@ rtUnknown
Definition: XrdHttpReq.hh:170
@ rtPOST
Definition: XrdHttpReq.hh:181
@ rtMKCOL
Definition: XrdHttpReq.hh:179
int parseBody(char *body, long long len)
Parse the body of a request, assuming that it's XML and that it's entirely in memory.
std::string httpStatusText
Definition: XrdHttpReq.hh:81
long long length
Definition: XrdHttpReq.hh:212
std::string destination
The destination field specified in the req.
Definition: XrdHttpReq.hh:219
XrdOucString resource
The resource specified by the request, stripped of opaque data.
Definition: XrdHttpReq.hh:193
std::vector< ReadWriteOp > rwOps_split
Definition: XrdHttpReq.hh:209
bool headerok
Tells if we have finished reading the header.
Definition: XrdHttpReq.hh:201
void clientMarshallReadAheadList(int nitems)
virtual void reset()
virtual bool Redir(XrdXrootd::Bridge::Context &info, int port, const char *hname)
XrdHttpProtocol * prot
Definition: XrdHttpReq.hh:93
std::string m_digest_header
The computed digest for the HTTP response header.
Definition: XrdHttpReq.hh:228
std::string etext
Definition: XrdHttpReq.hh:248
std::string stringresp
If we want to give a string as a response, we compose it here.
Definition: XrdHttpReq.hh:265
XResponseType xrdresp
The last response data we got.
Definition: XrdHttpReq.hh:246
XrdHttpReq(XrdHttpProtocol *protinstance)
Definition: XrdHttpReq.hh:121
std::string requestverb
Definition: XrdHttpReq.hh:186
ReqType request
The request we got.
Definition: XrdHttpReq.hh:185
int ProcessHTTPReq()
virtual bool Done(XrdXrootd::Bridge::Context &info)
the result context
long long writtenbytes
In a long write, we track where we have arrived.
Definition: XrdHttpReq.hh:271
XrdOucEnv * opaque
The opaque data, after parsing.
Definition: XrdHttpReq.hh:195
long fileflags
Definition: XrdHttpReq.hh:259
int PostProcessChecksum(std::string &digest_header)
int iovL
byte count
Definition: XrdHttpReq.hh:254
void sanitizeResourcePfx()
int depth
Definition: XrdHttpReq.hh:213
virtual bool Error(XrdXrootd::Bridge::Context &info, int ecode, const char *etext)
bool fopened
Definition: XrdHttpReq.hh:262
const struct iovec * iovP
The latest data chunks got from the xrd layer. These are valid only inside the callbacks!
Definition: XrdHttpReq.hh:252
int parseHost(char *)
int httpStatusCode
Definition: XrdHttpReq.hh:80
std::string m_req_digest
The requested digest type.
Definition: XrdHttpReq.hh:222
XrdOucString resourceplusopaque
The resource specified by the request, including all the opaque data.
Definition: XrdHttpReq.hh:197
void getfhandle()
int parseRWOp(char *)
std::string hdr2cgistr
Additional opaque info that may come from the hdr2cgi directive.
Definition: XrdHttpReq.hh:231
std::string host
The host field specified in the req.
Definition: XrdHttpReq.hh:217
long filemodtime
Definition: XrdHttpReq.hh:260
int parseFirstLine(char *line, int len)
Parse the first line of the header.
XrdOucString redirdest
Definition: XrdHttpReq.hh:249
long long m_current_chunk_size
Definition: XrdHttpReq.hh:86
void parseResource(char *url)
virtual int File(XrdXrootd::Bridge::Context &info, int dlen)
int parseLine(char *line, int len)
Parse the header.
std::string buildPartialHdrEnd(char *token)
Build the closing part for a multipart response.
int ReqReadV()
Prepare the buffers for sending a readv request.
bool m_transfer_encoding_chunked
Definition: XrdHttpReq.hh:84
void mapXrdErrorToHttpStatus()
bool m_appended_hdr2cgistr
Definition: XrdHttpReq.hh:232
void appendOpaque(XrdOucString &s, XrdSecEntity *secent, char *hash, time_t tnow)
readahead_list * ralist
Definition: XrdHttpReq.hh:149
int iovN
array count
Definition: XrdHttpReq.hh:253
virtual bool Data(XrdXrootd::Bridge::Context &info, const struct iovec *iovP, int iovN, int iovL, bool final)
XrdOucString m_resource_with_digest
Definition: XrdHttpReq.hh:226
long long filesize
Definition: XrdHttpReq.hh:258
long long m_current_chunk_offset
Definition: XrdHttpReq.hh:85
XErrorCode xrderrcode
Definition: XrdHttpReq.hh:247
void clientUnMarshallReadAheadList(int nitems)
std::map< std::string, std::string > allheaders
Definition: XrdHttpReq.hh:190
unsigned int rwOpDone
To coordinate multipart responses across multiple calls.
Definition: XrdHttpReq.hh:240
virtual ~XrdHttpReq()
int parseContentRange(char *)
bool sendcontinue
Definition: XrdHttpReq.hh:214
ClientRequest xrdreq
The last issued xrd request, often pending.
Definition: XrdHttpReq.hh:243
std::string buildPartialHdr(long long bytestart, long long byteend, long long filesize, char *token)
Build a partial header for a multipart response.
Definition: XrdOucEnv.hh:42
Definition: XrdOucString.hh:254
Definition: XrdSecEntity.hh:64
Definition: XrdXrootdBridge.hh:226
Definition: XrdXrootdBridge.hh:294
std::size_t hash(const BasicJsonType &j)
hash a JSON value
Definition: XrdOucJson.hh:5221
Definition: XrdHttpReq.hh:65
long long size
Definition: XrdHttpReq.hh:67
long flags
Definition: XrdHttpReq.hh:69
long id
Definition: XrdHttpReq.hh:68
std::string path
Definition: XrdHttpReq.hh:66
long modtime
Definition: XrdHttpReq.hh:70
Definition: XrdHttpReq.hh:59
long long byteend
Definition: XrdHttpReq.hh:62
long long bytestart
Definition: XrdHttpReq.hh:61
Definition: XProtocol.hh:653
Definition: XProtocol.hh:838