/* Web Polygraph http://www.web-polygraph.org/ * (C) 2003-2006 The Measurement Factory * Licensed under the Apache License, Version 2.0 */ #ifndef POLYGRAPH__CLIENT_CLTXACT_H #define POLYGRAPH__CLIENT_CLTXACT_H #include "xstd/Queue.h" #include "base/ObjTimes.h" #include "runtime/IOBuf.h" #include "runtime/httpHdrs.h" #include "runtime/Xaction.h" #include "client/UserCred.h" #include "client/SingleCxm.h" class Client; class PageInfo; class ServerRep; class ContentCfg; class DistrPoint; class ObjWorld; class HostCfg; class MembershipMap; class BodyParser; class ParseBuffer; class RegExGroup; class RegExMatchee; class RndDistr; class HttpCookies; class CltXact: public Xaction, public QueueItem { public: CltXact(); virtual void reset(); void enqueue(); // setup and execution void page(PageInfo *aPage); PageInfo *page(); CltXactMgr *getPipeline(); void pipeline(CltXactMgr *aMgr); void exec(Client *anOwner, Connection *aConn); // called by CltXactMgr bool controlledFill(bool &needMore); bool controlledMasterWrite(Size &size); bool controlledPostWrite(Size &size, bool &needMore); void controlledMasterRead(); void controlledPostRead(); void controlledAbort(); virtual void cacheDistrPoint(DistrPoint *) {} virtual bool needRetry() const { return doRetry; } virtual void noteAbort(); // called from BodyParsers void noteContent(const ParseBuffer &content); Error noteEmbedded(ReqHdr &hdr); void noteTrailerHeader(const ParseBuffer &hdr); void noteEndOfTrailer(); bool askedPeer() const { return thePeerState != peerUnknown; } bool usePeer() const { return thePeerState == peerSome; } void usePeer(bool doUse) { thePeerState = doUse ? peerSome : peerNone; } const NetAddr &nextHop() const { return theNextHop; } NetAddr &nextHopVar() { return theNextHop; } const UserCred &credentials() const { return theCred; } void noteCredentialsGone(); // called by filters that stripped creds void saveRepHeader(); const IOBuf &savedRepHeader() const { return theSavedRepHeader; } CltXact *cause() { return theCause; } const CltXact *cause() const { return theCause; } void cause(CltXact *aCause) { theCause = aCause; } int childCount() const { return theChildCount; } void noteChildNew(CltXact *) { theChildCount++; } void noteChildGone(CltXact *) { --theChildCount; } protected: virtual Agent *owner(); virtual const UniqId &reqId() const; void makeReqHeaders(); void makeConnectReq(ostream &os); void makeExplicitReq(ostream &os); void finishReqHdrs(ostream &os, bool forceDump); Error getHeader(); Error interpretHeader(); void getBody(); void parse(); void checkOverflow(); void noteError(const Error &err); void authWithProxy(bool needed); void redirect(); virtual void finish(Error err); virtual void logStats(OLog &ol) const; void makeReqVersion(ostream &os); const HostCfg *makeReqHost(ostream &os); void makeReqMethod(ostream &os); virtual void makeEndToEndHdrs(ostream &os); void makeHopByHopHdrs(ostream &os); void makeCookies(ostream &os, HttpCookies *cookies); virtual void consume(Size size); virtual void firstHandSync(); Error handleEmbedOid(ReqHdr &hdr); Error handleForeignEmbedOid(ReqHdr &hdr); bool expectMore() const; Size unconsumed() const; const ObjTimes &olcTimes() const; bool validRelOid(const ObjId &oid) const; bool cfgAbortedReply() const; void checkAcl(); void checkAclMatch(const RegExGroup *matchGrp, const char *action); void buildAclMatchee(RegExMatchee &m) const; void explainAclMatch(const RegExMatchee &m, const char *action, const Array &ourMatches) const; void dumpMatchingGroupNames(ostream &os, const MembershipMap *map) const; void checkFreshness(); void checkDateSync(); void updatePubWorld(const ObjWorld &slice); Error setStatusCode(int aStatus); Error setViserv(const NetAddr &name, ObjId &oid) const; BodyParser *selectBodyParser(); BodyParser *selectContentParser(); BodyParser *selectMarkupBodyParser(); RndDistr *seedOidDistr(RndDistr *raw, int globSeed); protected: Client *theOwner; PageInfo *thePage; CltXactMgr *theMgr; ServerRep *theSrvRep; ContentCfg *theContentCfg; BodyParser *theBodyParser; NetAddr theNextHop; RepHdr theRepHdr; mutable ObjTimes theOlcTimes; // cached value Size theConsumedSize; Size theReqBodySize; UserCred theCred; IOBuf theSavedRepHeader; // to preserve raw response headers if needed SingleCxm theSelfMgr; CltXact *theCause; // transaction that caused this transaction int theChildCount; // transaction using us as a cause // this is used to check whether the xaction wants to use peers enum { peerUnknown = -1, peerNone, peerSome } thePeerState; bool doRetry; // try the same xaction again }; #endif