summaryrefslogtreecommitdiff
path: root/project2/FCgiIO.h
blob: a8b67f37d4afbe6d82b95b35bbf40540d526d487 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/* -*-c++-*- */
/*
 *  $Id: FCgiIO.h,v 1.3 2007/07/02 18:48:19 sebdiaz Exp $
 *
 *  Copyright (C) 2002 Steve McAndrewSmith
 *  Copyright (C) 2002 Stephen F. Booth
 *                2007 Sebastien DIAZ <sebastien.diaz@gmail.com>
 *  Part of the GNU cgicc library, http://www.gnu.org/software/cgicc
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 3 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA*
 */

#ifndef _FCGIIO_H_
#define _FCGIIO_H_ 1

#ifdef __GNUG__
#  pragma interface
#endif

/*! \file FCgiIO.h
 * \brief Class that implements input and output through a FastCGI request.
 *
 * This class provides access to the input byte-stream and environment
 * variable interfaces of a FastCGI request.  It is fully compatible with the
 * Cgicc input API.
 *
 * It also provides access to the request's output and error streams, using a
 * similar interface.
 */

#include <ostream>
#include <string>
#include <map>

#include "fcgio.h"

#include "cgicc/CgiInput.h"

namespace cgicc {

  // ============================================================
  // Class FCgiIO
  // ============================================================
  
  /*! \class FCgiIO FCgiIO.h FCgiIO.h
   * \brief Class that implements input and output through a FastCGI request.
   *
   * This class provides access to the input byte-stream and environment
   * variable interfaces of a FastCGI request.  It is fully compatible with the
   * Cgicc input API.
   *
   * It also provides access to the request's output and error streams, using a
   * similar interface.
   */
  class CGICC_API FCgiIO : public cgicc::CgiInput, public std::ostream
  {
  public:
    
    // ============================================================
    
    /*! \name Constructor and Destructor */
    //@{
    
    /*!
     * \brief Constructor
     *
     * Create a new FCgiIO object
     */
    FCgiIO(FCGX_Request& request);
    
    /*!
     * \brief Copy constructor
     *
     */
    FCgiIO(const FCgiIO& io);
    
    /*!
     * \brief Destructor
     *
     * Delete this FCgiIO object
     */
    virtual inline
    ~FCgiIO()
    {}
    //@}
    
    // ============================================================
    
    /*! \name Data Sources */
    //@{
    
    /*!
     * \brief Read data from the request's input stream.
     *
     * \param data The target buffer
     * \param length The number of characters to read
     * \return The number of characters read
     */
    virtual inline size_t read(char *data, size_t length)
    {
      return FCGX_GetStr(data, length, fRequest.in);
    }
    
    /*!
     * \brief Query the value of an environment variable stored in the request.
     *
     * \param varName The name of an environment variable
     * \return The value of the requested environment variable, or an empty
     * string if not found.
     */
    virtual inline std::string getenv(const char *varName)
    {
      return fEnv[varName];
    }
    //@}
    
    // ============================================================
    
    /*! \name Data Target Streams */
    //@{
    
    /*!
     * \brief Provides access to the error stream.
   */
    inline std::ostream& err(void)
    {
      return fErr;
    }
    //@}
    
  protected:
    FCGX_Request& 			fRequest;
    fcgi_streambuf 			fOutBuf;
    fcgi_streambuf 			fErrBuf;
    std::ostream 			fErr;
    std::map<std::string, std::string> 	fEnv;
  };
  
} // namespace cgicc

#endif /* ! _FCGIIO_H_ */