XRootD
XrdHttpUtils.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: Apr 2013
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 #include "XProtocol/XPtypes.hh"
39 #include "XrdSec/XrdSecEntity.hh"
40 #include "XrdOuc/XrdOucIOVec.hh"
41 #include "XrdOuc/XrdOucTUtils.hh"
42 #include <string>
43 #include <cstring>
44 #include <vector>
45 #include <memory>
46 #include <sstream>
47 
48 #ifndef XRDHTTPUTILS_HH
49 #define XRDHTTPUTILS_HH
50 
51 enum : int {
56 
57  // 2xx Success
58  HTTP_OK = 200,
59  HTTP_CREATED = 201,
67  HTTP_IM_USED = 226,
68 
69  // 3xx Redirection
72  HTTP_FOUND = 302,
78 
79  // 4xx Client Errors
90  HTTP_GONE = 410,
98  HTTP_IM_A_TEAPOT = 418, // RFC 2324
101  HTTP_LOCKED = 423,
109 
110  // 5xx Server Errors
122 };
123 
124 // GetHost from URL
125 // Parse an URL and extract the host name and port
126 // Return 0 if OK
127 int parseURL(char *url, char *host, int &port, char **path);
128 
129 // Simple itoa function
130 std::string itos(long i);
131 
132 // Home made implementation of strchrnul
133 char *mystrchrnul(const char *s, int c);
134 
135 void calcHashes(
136  char *hash,
137 
138  const char *fn,
139 
140  kXR_int16 req,
141 
142  XrdSecEntity *secent,
143 
144  time_t tim,
145 
146  const char *key);
147 
148 
149 int compareHash(
150  const char *h1,
151  const char *h2);
152 
153 
154 bool Fromhexdigest(const unsigned char *input, int length, unsigned char *out);
155 
156 void Tobase64(const unsigned char *input, int length, char *out);
157 
158 // Create a new quoted string
159 char *quote(const char *str);
160 // unquote a string and return a new one
161 char *unquote(char *str);
162 
171 inline char * decode_raw(const std::string & str) {
172  size_t strLength = str.length();
173  // uniquely own the temporary copy
174  std::unique_ptr<char[]> buf(new char[strLength + 1]);
175  std::memcpy(buf.get(), str.c_str(), strLength + 1);
176  // unquote returns a fresh malloc()'d pointer
177  return unquote(buf.get());
178 }
179 
186 inline char * encode_raw(const std::string & str) {
187  return quote(str.c_str());
188 }
189 
196 inline std::string encode_str(const std::string & str) {
197  char * encodedRaw = encode_raw(str);
198  std::string encoded { encodedRaw };
199  free(encodedRaw);
200  return encoded;
201 }
202 
209 inline std::string decode_str(const std::string & str) {
210  char * decodedRaw = decode_raw(str);
211  std::string decoded { decodedRaw };
212  free(decodedRaw);
213  return decoded;
214 }
215 
222 inline std::string encode_opaque(const std::string & opaque) {
223  std::ostringstream output;
224  std::vector<std::string> allKeyValues;
225  XrdOucTUtils::splitString(allKeyValues,opaque,"&");
226  bool first = true;
227  for(auto & kv: allKeyValues) {
228  size_t equal = kv.find('=');
229  if(equal != std::string::npos) {
230  std::string key = kv.substr(0, equal);
231  std::string value = kv.substr(equal + 1);
232  if(!first) {
233  output << "&";
234  }
235  output << key << "=" << encode_str(value);
236  first = false;
237  }
238  }
239  return output.str();
240 }
241 
242 // Escape a string and return a new one
243 char *escapeXML(const char *str);
244 
245 int mapErrNoToHttp(int err);
246 
247 std::string httpStatusToString(int status);
248 
249 typedef std::vector<XrdOucIOVec2> XrdHttpIOList;
250 
251 
252 
253 #endif /* XRDHTTPUTILS_HH */
short kXR_int16
Definition: XPtypes.hh:66
int parseURL(char *url, char *host, int &port, char **path)
Definition: XrdHttpUtils.cc:78
std::string itos(long i)
void Tobase64(const unsigned char *input, int length, char *out)
int compareHash(const char *h1, const char *h2)
char * unquote(char *str)
int mapErrNoToHttp(int err)
bool Fromhexdigest(const unsigned char *input, int length, unsigned char *out)
@ HTTP_HTTP_VERSION_NOT_SUPPORTED
@ HTTP_INSUFFICIENT_STORAGE
@ HTTP_PRECONDITION_FAILED
Definition: XrdHttpUtils.hh:92
@ HTTP_BAD_REQUEST
Definition: XrdHttpUtils.hh:80
@ HTTP_NOT_EXTENDED
@ HTTP_FAILED_DEPENDENCY
@ HTTP_VARIANT_ALSO_NEGOTIATES
@ HTTP_CREATED
Definition: XrdHttpUtils.hh:59
@ HTTP_IM_A_TEAPOT
Definition: XrdHttpUtils.hh:98
@ HTTP_MULTIPLE_CHOICES
Definition: XrdHttpUtils.hh:70
@ HTTP_LOCKED
@ HTTP_OK
Definition: XrdHttpUtils.hh:58
@ HTTP_NOT_MODIFIED
Definition: XrdHttpUtils.hh:74
@ HTTP_NON_AUTHORITATIVE_INFORMATION
Definition: XrdHttpUtils.hh:61
@ HTTP_LOOP_DETECTED
@ HTTP_EXPECTATION_FAILED
Definition: XrdHttpUtils.hh:97
@ HTTP_SERVICE_UNAVAILABLE
@ HTTP_PROXY_AUTHENTICATION_REQUIRED
Definition: XrdHttpUtils.hh:87
@ HTTP_LENGTH_REQUIRED
Definition: XrdHttpUtils.hh:91
@ HTTP_URI_TOO_LONG
Definition: XrdHttpUtils.hh:94
@ HTTP_UNAVAILABLE_FOR_LEGAL_REASONS
@ HTTP_UNAUTHORIZED
Definition: XrdHttpUtils.hh:81
@ HTTP_UNSUPPORTED_MEDIA_TYPE
Definition: XrdHttpUtils.hh:95
@ HTTP_NOT_FOUND
Definition: XrdHttpUtils.hh:84
@ HTTP_FORBIDDEN
Definition: XrdHttpUtils.hh:83
@ HTTP_CONTINUE
Definition: XrdHttpUtils.hh:52
@ HTTP_MULTI_STATUS
Definition: XrdHttpUtils.hh:65
@ HTTP_PERMANENT_REDIRECT
Definition: XrdHttpUtils.hh:77
@ HTTP_FOUND
Definition: XrdHttpUtils.hh:72
@ HTTP_RESET_CONTENT
Definition: XrdHttpUtils.hh:63
@ HTTP_TEMPORARY_REDIRECT
Definition: XrdHttpUtils.hh:76
@ HTTP_NO_CONTENT
Definition: XrdHttpUtils.hh:62
@ HTTP_MISDIRECTED_REQUEST
Definition: XrdHttpUtils.hh:99
@ HTTP_PARTIAL_CONTENT
Definition: XrdHttpUtils.hh:64
@ HTTP_BAD_GATEWAY
@ HTTP_GATEWAY_TIMEOUT
@ HTTP_NETWORK_AUTHENTICATION_REQUIRED
@ HTTP_TOO_EARLY
@ HTTP_METHOD_NOT_ALLOWED
Definition: XrdHttpUtils.hh:85
@ HTTP_NOT_ACCEPTABLE
Definition: XrdHttpUtils.hh:86
@ HTTP_ALREADY_REPORTED
Definition: XrdHttpUtils.hh:66
@ HTTP_EARLY_HINTS
Definition: XrdHttpUtils.hh:55
@ HTTP_GONE
Definition: XrdHttpUtils.hh:90
@ HTTP_INTERNAL_SERVER_ERROR
@ HTTP_UPGRADE_REQUIRED
@ HTTP_IM_USED
Definition: XrdHttpUtils.hh:67
@ HTTP_TOO_MANY_REQUESTS
@ HTTP_PAYLOAD_TOO_LARGE
Definition: XrdHttpUtils.hh:93
@ HTTP_NOT_IMPLEMENTED
@ HTTP_SEE_OTHER
Definition: XrdHttpUtils.hh:73
@ HTTP_PAYMENT_REQUIRED
Definition: XrdHttpUtils.hh:82
@ HTTP_REQUEST_TIMEOUT
Definition: XrdHttpUtils.hh:88
@ HTTP_UNPROCESSABLE_ENTITY
@ HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE
@ HTTP_SWITCHING_PROTOCOLS
Definition: XrdHttpUtils.hh:53
@ HTTP_MOVED_PERMANENTLY
Definition: XrdHttpUtils.hh:71
@ HTTP_USE_PROXY
Definition: XrdHttpUtils.hh:75
@ HTTP_PRECONDITION_REQUIRED
@ HTTP_RANGE_NOT_SATISFIABLE
Definition: XrdHttpUtils.hh:96
@ HTTP_ACCEPTED
Definition: XrdHttpUtils.hh:60
@ HTTP_CONFLICT
Definition: XrdHttpUtils.hh:89
@ HTTP_PROCESSING
Definition: XrdHttpUtils.hh:54
char * encode_raw(const std::string &str)
std::string encode_opaque(const std::string &opaque)
char * decode_raw(const std::string &str)
void calcHashes(char *hash, const char *fn, kXR_int16 req, XrdSecEntity *secent, time_t tim, const char *key)
std::string encode_str(const std::string &str)
std::vector< XrdOucIOVec2 > XrdHttpIOList
char * escapeXML(const char *str)
std::string decode_str(const std::string &str)
char * mystrchrnul(const char *s, int c)
std::string httpStatusToString(int status)
char * quote(const char *str)
static void splitString(Container &result, const std::string &input, const std::string &delimiter)
Split a string.
Definition: XrdOucTUtils.hh:51