ROOT logo
// @(#)root/net:$Id: THTTPMessage.h 41729 2011-11-02 16:39:34Z rdm $
// Author: Marcelo Sousa   23/08/2011

/*************************************************************************
 * Copyright (C) 1995-2011, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#ifndef ROOT_THTTPMessage
#define ROOT_THTTPMessage

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// THTTPMessage                                                         //
//                                                                      //
// A THTTPMessage object represents a generic HTTP request for the      //
// Amazon S3 and the Google Storage services. It can easily be extended //
// to other API's. It assumes that each request is signed with the      //
// client id and an encripted key, Base64(HMAC + SHA1 (HTTP Request))   //
// which is based on a secret key provided in the constructor.          //
// For more information about the authentication :                      //
// Google Storage:                                                      //
//   http://code.google.com/apis/storage/docs/reference/v1/developer-guidev1.html#authentication //
// Amazon S3:                                                           //
//   http://awsdocs.s3.amazonaws.com/S3/latest/s3-qrc.pdf               //
// At the moment THTTPMessage is used for derived classes of TWebFile   //
// (read only) files supporting HEAD and GET requests.                  //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#ifndef ROOT_TObject
#include "TObject.h"
#endif

#ifndef ROOT_TString
#include "TString.h"
#endif

enum EHTTP_Verb {
   kGET,
   kPOST,
   kPUT,
   kDELETE,
   kHEAD,
   kCOPY
};

class THTTPMessage : public TObject{

private:
   enum EHTTP_Verb fVerb;  //HTTP Verb
   TString   fPath;        //Given path to be parsed        
   TString   fBucket;      //Bucket associated with the file
   TString   fHost;        //Server name
   TString   fDate;        //Date
   TString   fAuthPrefix;  //Authentication prefix to distinguish between GT and AWS3
   TString   fAccessId;    //User id 
   TString   fAccessIdKey; //Secret key
   Bool_t    fHasRange;    //GET request with range
   Long64_t  fOffset;      //Offset
   Long64_t *fInitByte;    //Init positions for the range
   Int_t    *fLen;         //Range length
   Int_t     fNumBuf;      //Number of buffers
   Int_t     fCurrentBuf;  //For requests > 8000 we need to generate several requests
   Int_t     fLength;      //Request length
   TString   fSignature;   //Message signature

protected:
   TString Sign();

public:
   THTTPMessage(EHTTP_Verb mverb, TString mpath, TString mbucket, TString mhost,
                TString maprefix, TString maid, TString maidkey);
   THTTPMessage(EHTTP_Verb mverb, TString mpath, TString mbucket, TString mhost,
                TString maprefix, TString maid, TString maidkey, Long64_t offset, Long64_t *pos, Int_t *len, Int_t nbuf);
   THTTPMessage() : fInitByte(0), fLen(0) { }
   virtual ~THTTPMessage() { }
   THTTPMessage &operator=(const THTTPMessage& rhs);

   EHTTP_Verb GetHTTPVerb() const { return fVerb; }
   TString    GetPath() const { return fPath; }
   TString    GetBucket() const { return fBucket; }
   TString    GetHost() const { return fHost; }
   TString    GetDatime() const { return fDate; }
   TString    GetAuthPrefix() const { return fAuthPrefix; }
   TString    GetAccessId() const { return fAccessId; }
   TString    GetAccessIdKey() const { return fAccessIdKey; }
   Long64_t   GetOffset() const { return fOffset; }
   Long64_t*  GetInitByte() const { return fInitByte; }
   Int_t*     GetRangeLength() const { return fLen; }
   Int_t      GetCurrentBuffer() const { return fCurrentBuf; }
   Int_t      GetNumBuffers() const { return fNumBuf; }
   Int_t      GetLength() const { return fLength; }
   TString    GetSignature() const { return fSignature; }

   Bool_t     HasRange() const { return fHasRange; }

   TString DatimeToTString() const;
   TString HTTPVerbToTString() const;

   TString CreateHead() const;
   TString CreateHost() const;
   TString CreateDate() const;
   TString CreateAuth() const;

   TString GetRequest();

   ClassDef(THTTPMessage, 0)  // Create generic HTTP request for Amazon S3 and Google Storage services
};

#endif
 THTTPMessage.h:1
 THTTPMessage.h:2
 THTTPMessage.h:3
 THTTPMessage.h:4
 THTTPMessage.h:5
 THTTPMessage.h:6
 THTTPMessage.h:7
 THTTPMessage.h:8
 THTTPMessage.h:9
 THTTPMessage.h:10
 THTTPMessage.h:11
 THTTPMessage.h:12
 THTTPMessage.h:13
 THTTPMessage.h:14
 THTTPMessage.h:15
 THTTPMessage.h:16
 THTTPMessage.h:17
 THTTPMessage.h:18
 THTTPMessage.h:19
 THTTPMessage.h:20
 THTTPMessage.h:21
 THTTPMessage.h:22
 THTTPMessage.h:23
 THTTPMessage.h:24
 THTTPMessage.h:25
 THTTPMessage.h:26
 THTTPMessage.h:27
 THTTPMessage.h:28
 THTTPMessage.h:29
 THTTPMessage.h:30
 THTTPMessage.h:31
 THTTPMessage.h:32
 THTTPMessage.h:33
 THTTPMessage.h:34
 THTTPMessage.h:35
 THTTPMessage.h:36
 THTTPMessage.h:37
 THTTPMessage.h:38
 THTTPMessage.h:39
 THTTPMessage.h:40
 THTTPMessage.h:41
 THTTPMessage.h:42
 THTTPMessage.h:43
 THTTPMessage.h:44
 THTTPMessage.h:45
 THTTPMessage.h:46
 THTTPMessage.h:47
 THTTPMessage.h:48
 THTTPMessage.h:49
 THTTPMessage.h:50
 THTTPMessage.h:51
 THTTPMessage.h:52
 THTTPMessage.h:53
 THTTPMessage.h:54
 THTTPMessage.h:55
 THTTPMessage.h:56
 THTTPMessage.h:57
 THTTPMessage.h:58
 THTTPMessage.h:59
 THTTPMessage.h:60
 THTTPMessage.h:61
 THTTPMessage.h:62
 THTTPMessage.h:63
 THTTPMessage.h:64
 THTTPMessage.h:65
 THTTPMessage.h:66
 THTTPMessage.h:67
 THTTPMessage.h:68
 THTTPMessage.h:69
 THTTPMessage.h:70
 THTTPMessage.h:71
 THTTPMessage.h:72
 THTTPMessage.h:73
 THTTPMessage.h:74
 THTTPMessage.h:75
 THTTPMessage.h:76
 THTTPMessage.h:77
 THTTPMessage.h:78
 THTTPMessage.h:79
 THTTPMessage.h:80
 THTTPMessage.h:81
 THTTPMessage.h:82
 THTTPMessage.h:83
 THTTPMessage.h:84
 THTTPMessage.h:85
 THTTPMessage.h:86
 THTTPMessage.h:87
 THTTPMessage.h:88
 THTTPMessage.h:89
 THTTPMessage.h:90
 THTTPMessage.h:91
 THTTPMessage.h:92
 THTTPMessage.h:93
 THTTPMessage.h:94
 THTTPMessage.h:95
 THTTPMessage.h:96
 THTTPMessage.h:97
 THTTPMessage.h:98
 THTTPMessage.h:99
 THTTPMessage.h:100
 THTTPMessage.h:101
 THTTPMessage.h:102
 THTTPMessage.h:103
 THTTPMessage.h:104
 THTTPMessage.h:105
 THTTPMessage.h:106
 THTTPMessage.h:107
 THTTPMessage.h:108
 THTTPMessage.h:109
 THTTPMessage.h:110
 THTTPMessage.h:111
 THTTPMessage.h:112
 THTTPMessage.h:113
 THTTPMessage.h:114