ChipMaster's trial hacks on C++CMS starting with v1.2.1. Not sure I'll follow on with the v2 since it looks to be breaking and mostly frivolous.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

82 lines
1.8 KiB

  1. #ifndef FCGI_STREAM_H
  2. #define FCGI_STREAM_H
  3. #include "config.h"
  4. #include <string>
  5. #ifdef EN_FASTCGI_LONG_PATH
  6. #include <fastcgi/fcgio.h>
  7. #include <fastcgi/fcgiapp.h>
  8. #else
  9. #include <fcgio.h>
  10. #include <fcgiapp.h>
  11. #endif
  12. #include <cgicc/CgiInput.h>
  13. #include "noncopyable.h"
  14. #include "cgi_api.h"
  15. #include "cgicc_connection.h"
  16. namespace cppcms {
  17. class fcgi_stream : public cgicc::CgiInput,
  18. public std::ostream,
  19. private util::noncopyable
  20. {
  21. FCGX_Request &request;
  22. fcgi_streambuf fcgi_cout;
  23. fcgi_streambuf fcgi_cerr;
  24. std::ostream stream_cerr;
  25. public:
  26. fcgi_stream(FCGX_Request &req);
  27. virtual std::string getenv(const char *variable);
  28. virtual size_t read(char *d,size_t len);
  29. std::ostream &err();
  30. virtual ~fcgi_stream();
  31. };
  32. class cgicc_connection_fast_cgi : public cgicc_connection {
  33. fcgi_stream fcgi;
  34. auto_ptr<cgicc::Cgicc> save_cgi;
  35. public:
  36. cgicc_connection_fast_cgi(FCGX_Request &req) :
  37. fcgi(req),
  38. save_cgi(new cgicc::Cgicc(&fcgi))
  39. {};
  40. virtual string env(char const *var){ return fcgi.getenv(var);};
  41. virtual cgicc::Cgicc &cgi() { return *save_cgi; };
  42. virtual ostream &cout() { return fcgi; };
  43. virtual ~cgicc_connection_fast_cgi() {};
  44. };
  45. class fcgi_session : public cgi_session {
  46. FCGX_Request *request;
  47. cgicc_connection_fast_cgi *connection;
  48. public:
  49. fcgi_session(FCGX_Request *r,cgicc_connection_fast_cgi *conn) :
  50. request(r), connection(conn) {};
  51. virtual cgicc_connection &get_connection();
  52. virtual bool prepare();
  53. virtual ~fcgi_session() {
  54. delete connection;
  55. delete request;
  56. };
  57. };
  58. class fcgi_api : public cgi_api {
  59. static pthread_once_t init_fcgi;
  60. static void init(void);
  61. int fd;
  62. public:
  63. fcgi_api(char const *socket,int backlog);
  64. virtual int get_socket() { return fd; };
  65. virtual cgi_session *accept_session();
  66. virtual ~fcgi_api();
  67. };
  68. } // Namespace
  69. #endif