/* -*- c++ -*- */ //============================================================================= /** * @file HTTP_Handler.h * * @author James Hu and Irfan Pyarali */ //============================================================================= #ifndef HTTP_HANDLER_H #define HTTP_HANDLER_H // = Forward declarations class Message_Block; class HTTP_Handler_Factory; #include "ace/Asynch_IO.h" #if !defined (ACE_LACKS_PRAGMA_ONCE) # pragma once #endif /* ACE_LACKS_PRAGMA_ONCE */ #include "HTTP_Request.h" #include "HTTP_Response.h" #include "JAWS_IO.h" /** * @class HTTP_Handler * * @brief This class is used to implement the HTTP protocol * * The HTTP_Handler class is a state based implementation of the * HTTP protocol. Therefore, it can be used synchronously and * asynchronously. It uses an abstract IO class to move between * different HTTP protocol states. It is up to the IO class to * decide on synchronous or asynchronous I/O. */ class HTTP_Handler : protected JAWS_IO_Handler { // Friend I/O classes. Can call protected methods. friend class JAWS_Synch_IO; friend class JAWS_Synch_IO_No_Cache; friend class JAWS_Asynch_IO; // Factories friend class Asynch_HTTP_Handler_Factory; friend class Synch_HTTP_Handler_Factory; friend class No_Cache_Synch_HTTP_Handler_Factory; public: /** * The handler is initialized with a connection of a new * client and any that came across. The * block will be of MAX_REQUEST_SIZE and the number * of bytes in can be found from * .length () */ virtual void open (ACE_HANDLE handle, ACE_Message_Block &initial_data); protected: /// The constructor is passed the factory that created and the /// IO mechanism that the handler should use. HTTP_Handler (JAWS_IO &io, HTTP_Handler_Factory &factory); /// Destructor virtual ~HTTP_Handler (); /// This method is called by the framework when there is a timeout. virtual void timeout (); /** * This is the termination state of the handler. After successful or * unsuccessful completions, the handler will end up in this state * (method). */ virtual void done (); /// Request too long. virtual void request_too_long (); /// Reference to the creating factory. HTTP_Handler_Factory &factory_; protected: // = Completion methods inherited from . virtual void read_complete (ACE_Message_Block &data); virtual void read_error (); virtual void transmit_file_complete (); virtual void transmit_file_error (int result); virtual void receive_file_complete (); virtual void receive_file_error (int result); virtual void write_error (); virtual void confirmation_message_complete (); virtual void error_message_complete (); public: enum { MAX_SOCKBUFSIZE = 64 * 1024, MAX_REQUEST_SIZE = 8192, METHODSIZ = 10, VERSIONSIZ = 10 }; private: /// This points to the request sent by the client ACE_Message_Block *request_data_; /// I/O handle to the client ACE_HANDLE handle_; HTTP_Request request_; HTTP_Response response_; /// IO class used by the handler JAWS_IO &io_; }; /** * @class HTTP_Handler_Factory * * @brief This class is used to create new HTTP handlers * * This is an abstract factory for creating new HTTP handlers. */ class HTTP_Handler_Factory { public: /// Destructor virtual ~HTTP_Handler_Factory (); /// This creates a new HTTP_Handler virtual HTTP_Handler *create_http_handler () = 0; /** * The HTTP handler will call this method from HTTP_Handler::done to * tell the factory to reap up the handler as it is now done with * the protocol */ virtual void destroy_http_handler (HTTP_Handler &handler, JAWS_IO &io) = 0; }; /** * @class Synch_HTTP_Handler_Factory * * @brief This class is used to create new HTTP handlers that will use * Synch IO */ class Synch_HTTP_Handler_Factory : public HTTP_Handler_Factory { public: /// This creates a new HTTP_Handler HTTP_Handler *create_http_handler (); /** * The HTTP handler will call this method from HTTP_Handler::done to * tell the factory to reap up the handler as it is now done with * the protocol */ void destroy_http_handler (HTTP_Handler &handler, JAWS_IO &io); }; //--------------Added a factory for SYNCH IO without caching /** * @class No_Cache_Synch_HTTP_Handler_Factory * * @brief This class is used to create new HTTP handlers that will use * Synch IO without caching */ class No_Cache_Synch_HTTP_Handler_Factory : public HTTP_Handler_Factory { public: /// This creates a new HTTP_Handler HTTP_Handler *create_http_handler (); /** * The HTTP handler will call this method from HTTP_Handler::done to * tell the factory to reap up the handler as it is now done with * the protocol */ void destroy_http_handler (HTTP_Handler &handler, JAWS_IO &io); }; //-------------- #if defined (ACE_HAS_WIN32_OVERLAPPED_IO) /** * @class Asynch_HTTP_Handler_Factory * * @brief This class is used to create new HTTP handlers that will use * Asynchronous IO. This only works on Win32. */ class Asynch_HTTP_Handler_Factory : public HTTP_Handler_Factory, public ACE_Service_Handler { public: /** * The HTTP handler will call this method from HTTP_Handler::done to * tell the factory to reap up the handler as it is now done with * the protocol */ void destroy_http_handler (HTTP_Handler &handler, JAWS_IO &io); /** * is called by to initialize a new * instance of ACE_Service_Handler that has been created after the a * new connection is accepted. * * This will act as a creation point for new handlers. */ virtual void open (ACE_HANDLE handle, ACE_Message_Block &message_block); private: /** * This method is private as users are not allowed to create new * handlers. New handlers can only be created by the framework when * new client connections arrive. */ HTTP_Handler *create_http_handler (); }; #endif /* ACE_HAS_WIN32_OVERLAPPED_IO */ #endif /* HTTP_HANDLER_H */