|
Boost-Commit : |
From: lists.drrngrvy_at_[hidden]
Date: 2008-03-21 12:49:11
Author: drrngrvy
Date: 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
New Revision: 43749
URL: http://svn.boost.org/trac/boost/changeset/43749
Log:
* all-files
- Moved common bits into namespace ::cgi::common
- Updated references to things that were moved over
* basic_request.hpp
- adding close() overload that takes an error_code;
- adding a clear() function so a request can be safely reused.
* basic_request_acceptor.hpp
- an acceptor now initialises itself by default (using default_init())
- added protocol_service() function to get the underlying basic_protocol_service
- accept() calls now use the endpoint, like Boost.Asio.
* basic_sync_io_object.hpp
- s/impl/implementation
* common/form_parser.hpp
- added name member, because every form part has a name (saves looking it up in a map every time)
* connections/stdio.hpp
- simplified write_some() a little.
* detail/cgi_*_impl_base.hpp
- cosmetic changes, removed old fluff (see source)
* error.hpp
- added a couple of new errors
* fcgi/acceptor_service_impl.hpp
- added default_init() function, which only works on linux for now.
* fcgi/client.hpp
- added close() overload that doesn't take an error_code
* response.hpp
- added resend() function, which sends the header+body regardless of the value of `headers_terminated_`
Added:
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/acceptor.hpp (contents, props changed)
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_client_fwd.hpp (contents, props changed)
Text files modified:
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/request.hpp | 6
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/request_impl.hpp | 11 +
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/request_service.hpp | 2
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/service.hpp | 4
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_client.hpp | 9 +
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_connection.hpp | 3
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_connection_fwd.hpp | 2
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_protocol_service.hpp | 2
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_protocol_service_fwd.hpp | 2
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_request.hpp | 20 +++
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_request_acceptor.hpp | 59 ++++++++-
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_request_fwd.hpp | 2
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_sync_io_object.hpp | 12 +
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/request.hpp | 9
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/request_impl.hpp | 4
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/request_service.hpp | 2
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/service.hpp | 2
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/common/form_part.hpp | 7 +
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/async_stdio.hpp | 2
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/shareable_tcp_socket.hpp | 6
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/stdio.hpp | 18 ++
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/tcp_socket.hpp | 11 +
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/detail/cgi_request_impl_base.hpp | 49 +------
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/detail/cgi_service_impl_base.hpp | 236 ++++++++++++++++++++++++---------------
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/detail/protocol_traits.hpp | 30 ++--
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/error.hpp | 12 +
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/acceptor.hpp | 6
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/acceptor_service_impl.hpp | 105 ++++++++++++-----
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/client.hpp | 44 +++++-
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/request.hpp | 9 +
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/request_acceptor_service.hpp | 30 +++-
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/service.hpp | 2
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/specification.hpp | 2
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/io_service.hpp | 6 +
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/map.hpp | 2
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/read.hpp | 2
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/request_service.hpp | 4
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/response.hpp | 50 +++++--
sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/write.hpp | 4
39 files changed, 526 insertions(+), 262 deletions(-)
Added: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/acceptor.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/acceptor.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -0,0 +1,28 @@
+// -- acgi/acceptor.hpp --
+//
+// Copyright (c) Darren Garvey 2007.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+////////////////////////////////////////////////////////////////
+#ifndef CGI_ACGI_ACCEPTOR_HPP_INCLUDED__
+#define CGI_ACGI_ACCEPTOR_HPP_INCLUDED__
+
+#include "boost/cgi/basic_request_acceptor.hpp"
+#include "boost/cgi/acgi/request_acceptor_service.hpp"
+
+namespace cgi {
+ namespace acgi {
+
+ /// Typedef for common usage (ACGI)
+ typedef
+ ::cgi::common::basic_request_acceptor<
+ acgi_request_acceptor_service<>
+ >
+ acceptor;
+
+ } // namespace acgi
+} // namespace cgi
+
+#endif // CGI_ACGI_ACCEPTOR_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/request.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/request.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/request.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -20,7 +20,11 @@
class acgi_request_service;
- typedef basic_request<acgi_request_service, acgi_service> acgi_request;
+ typedef
+ common::basic_request<
+ acgi_request_service, acgi_service
+ >
+ acgi_request;
} // namespace cgi
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/request_impl.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/request_impl.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/request_impl.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -22,15 +22,20 @@
class acgi_service_impl;
class acgi_request_impl
- : public cgi_request_impl_base<async_stdio_connection>
+ : public cgi_request_impl_base<common::async_stdio_connection>
{
public:
typedef acgi_service protocol_service_type;
- typedef ::cgi::basic_client<async_stdio_connection, tags::acgi> client_type;
+ typedef common::async_stdio_connection connection_type;
+ typedef
+ ::cgi::common::basic_client<
+ connection_type, tags::acgi
+ >
+ client_type;
//typedef async_stdio_connection client_type;
acgi_request_impl()
- : cgi_request_impl_base<async_stdio_connection>()
+ : cgi_request_impl_base<connection_type>()
{
}
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/request_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/request_service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/request_service.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -29,7 +29,7 @@
public:
typedef acgi_request_service type;
typedef acgi_request_impl impl_type;
- typedef ::cgi::map map_type;
+ typedef ::cgi::common::map map_type;
typedef tags::acgi protocol_type;
typedef acgi_service protocol_service_type;
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/acgi/service.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -20,10 +20,10 @@
/**
* Works with both cgi_request and acgi_request.
*/
- typedef basic_protocol_service<tags::acgi> acgi_service;
+ typedef common::basic_protocol_service<tags::acgi> acgi_service;
namespace acgi {
- typedef basic_protocol_service<tags::acgi> service;
+ typedef common::basic_protocol_service<tags::acgi> service;
}
/// A service 'owned' by a single user-supplied io_service
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_client.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_client.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_client.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -18,6 +18,7 @@
#include "boost/cgi/connections/tcp_socket.hpp"
namespace cgi {
+ namespace common {
/// A client
/**
@@ -94,6 +95,7 @@
/// Get a shared_ptr of the connection associated with the client.
connection_ptr& connection() { return connection_; }
+ std::size_t& bytes_left() { return bytes_left_; }
/// Write some data to the client.
template<typename ConstBufferSequence>
@@ -108,7 +110,9 @@
std::size_t read_some(const MutableBufferSequence& buf
, boost::system::error_code& ec)
{
- return connection_->read_some(buf, ec);
+ std::size_t bytes_read = connection_->read_some(buf, ec);
+ bytes_left_ -= bytes_read;
+ return bytes_left_ > 0 ? bytes_read : (bytes_read + bytes_left_);
}
/// Asynchronously write some data to the client.
@@ -127,8 +131,11 @@
private:
//io_service& io_service_;
connection_ptr connection_;
+ // we should never read more than content-length bytes.
+ std::size_t bytes_left_;
};
+ } // namespace common
} // namespace cgi
#endif // CGI_BASIC_CLIENT_HPP_INCLUDED__
Added: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_client_fwd.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_client_fwd.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -0,0 +1,22 @@
+// -- basic_client_fwd.hpp --
+//
+// Copyright (c) Darren Garvey 2007.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+////////////////////////////////////////////////////////////////
+#ifndef CGI_BASIC_CLIENT_FWD_HPP_INCLUDED__
+#define CGI_BASIC_CLIENT_FWD_HPP_INCLUDED__
+
+namespace cgi {
+ namespace common {
+
+ template<typename Connection, typename Protocol>
+ class basic_client;
+
+ } // namespace common
+} // namespace cgi
+
+#endif // CGI_BASIC_CLIENT_FWD_HPP_INCLUDED__
+
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_connection.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_connection.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_connection.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -18,6 +18,7 @@
//#include "connections/async_stdio_connection_impl.hpp"
namespace cgi {
+ namespace common {
template<typename ConnectionType>
class basic_connection;
@@ -79,7 +80,7 @@
//#include "connections/async_stdio_connection.hpp"
//#include "connections/tcp_connection.hpp"
-
+ } // namespace common
} // namespace cgi
#endif // CGI_BASIC_CONNECTION_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_connection_fwd.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_connection_fwd.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_connection_fwd.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -10,10 +10,12 @@
#define CGI_BASIC_CONNECTION_FWD_HPP_INCLUDED__
namespace cgi {
+ namespace common {
template<typename ConnectionType>
class basic_connection;
+ } // namespace common
} // namespace cgi
#endif // CGI_BASIC_CONNECTION_FWD_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_protocol_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_protocol_service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_protocol_service.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -22,6 +22,7 @@
#include "boost/cgi/basic_protocol_service_fwd.hpp"
namespace cgi {
+ namespace common {
/// Basic Protocol Service
/**
@@ -145,6 +146,7 @@
//friend class request_type;
};
+ } // namespace common
} // namespace cgi
#endif // CGI_BASIC_PROTOCOL_SERVICE_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_protocol_service_fwd.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_protocol_service_fwd.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_protocol_service_fwd.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -16,6 +16,7 @@
#include "boost/cgi/io_service_provider.hpp"
namespace cgi {
+ namespace common {
template<
typename Protocol,
@@ -23,6 +24,7 @@
>
class basic_protocol_service;
+ } // namespace common
} // namespace cgi
#endif // CGI_BASIC_PROTOCOL_SERVICE_FWD_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_request.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_request.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_request.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -42,6 +42,7 @@
#include "boost/cgi/map.hpp"
namespace cgi {
+ namespace common {
/// The basic_request class, primary entry point to the library
/**
@@ -81,7 +82,7 @@
public:
typedef basic_request<RequestService, ProtocolService
, Role, Allocator > type;
- typedef ::cgi::map map_type;
+ typedef ::cgi::common::map map_type;
typedef RequestService service_type;
typedef typename service_type::protocol_type protocol_type;
typedef ProtocolService protocol_service_type;
@@ -221,6 +222,14 @@
, program_status);
}
+ int close(http::status_code http_status
+ , int program_status
+ , boost::system::error_code& ec)
+ {
+ return this->service.close(this->implementation, http_status
+ , program_status, ec);
+ }
+
/// Reject the request with a standard '500 Internal Server Error' error
int reject()
{
@@ -235,6 +244,14 @@
this->service.set_status(this->implementation, aborted);
}
+ /// Clear the data for the request, for reusing this object.
+ // I'd imagine clearing and re-loading a request is quicker than
+ // destroying/re-creating one. **Unverified claims** **FIXME**
+ void clear()
+ {
+ this->service.clear(this->implementation);
+ }
+
/// Get the client connection associated with the request
/**
* You use the client for read/write calls. Y
@@ -632,6 +649,7 @@
}
};
+ } // namespace common
} // namespace cgi
#include "boost/cgi/detail/pop_options.hpp"
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_request_acceptor.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_request_acceptor.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_request_acceptor.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -15,9 +15,11 @@
#include <boost/asio/basic_io_object.hpp>
#include <boost/asio/ip/basic_endpoint.hpp>
#include <boost/asio/ip/tcp.hpp>
+#include <boost/cgi/basic_protocol_service.hpp>
#include "boost/cgi/detail/throw_error.hpp"
namespace cgi {
+ namespace common {
/// The interface class for any *cgi::acceptor.
template<typename RequestAcceptorService>
@@ -39,18 +41,43 @@
typename service_type::endpoint_type
endpoint_type;
typedef typename service_type::native_type native_type;
+ typedef
+ typename service_type::service_impl_type::protocol_service_type
+ protocol_service_type;
+
+
+ //template<typename IoServiceProvider>
+ //explicit basic_request_acceptor(
+ // basic_protocol_service<protocol_type, IoServiceProvider>& ps)
+ // : boost::asio::basic_io_object<RequestAcceptorService>(ps.io_service())
+ //{
+ // this->service.set_protocol_service(this->implementation, ps);
+ //}
template<typename IoServiceProvider>
- explicit basic_request_acceptor(
- basic_protocol_service<protocol_type, IoServiceProvider>& ps)
+ explicit basic_request_acceptor
+ (
+ common::basic_protocol_service<protocol_type, IoServiceProvider>& ps
+ , bool default_init = true
+ )
: boost::asio::basic_io_object<RequestAcceptorService>(ps.io_service())
{
this->service.set_protocol_service(this->implementation, ps);
+ if (default_init)
+ {
+ boost::system::error_code ec;
+ this->service.default_init(this->implementation, ec);
+ if (ec)
+ {
+ boost::system::system_error err(ec, "Problem constructing acceptor");
+ boost::throw_exception(err);
+ }
+ }
}
-
+
template<typename IoServiceProvider>
explicit basic_request_acceptor(
- basic_protocol_service<protocol_type, IoServiceProvider>& ps,
+ common::basic_protocol_service<protocol_type, IoServiceProvider>& ps,
port_number_type port_num)
: boost::asio::basic_io_object<RequestAcceptorService>(ps.io_service())
{
@@ -77,7 +104,7 @@
template<typename IoServiceProvider, typename InternetProtocol>
explicit basic_request_acceptor(
- basic_protocol_service<protocol_type, IoServiceProvider>& ps,
+ common::basic_protocol_service<protocol_type, IoServiceProvider>& ps,
const boost::asio::ip::basic_endpoint<InternetProtocol>& endpoint,
bool reuse_addr = true)
: boost::asio::basic_io_object<RequestAcceptorService>(ps.io_service())
@@ -97,7 +124,7 @@
template<typename IoServiceProvider, typename InternetProtocol>
explicit basic_request_acceptor(
- basic_protocol_service<protocol_type, IoServiceProvider>& ps,
+ common::basic_protocol_service<protocol_type, IoServiceProvider>& ps,
const InternetProtocol& ip,
const native_type& native_acceptor)
: boost::asio::basic_io_object<RequestAcceptorService>(ps.io_service())
@@ -112,6 +139,11 @@
{
}
+ protocol_service_type& protocol_service() const
+ {
+ return this->service.protocol_service(this->implementation);
+ }
+
/// Check if the acceptor is open
bool is_open()
{
@@ -201,17 +233,25 @@
void accept(CommonGatewayRequest& request)
{
boost::system::error_code ec;
- this->service.accept(this->implementation, request, ec);
+ this->service.accept(this->implementation, request, 0, ec);
detail::throw_error(ec);
}
/// Accept one request
template<typename CommonGatewayRequest>
boost::system::error_code
- accept(CommonGatewayRequest& request, boost::system::error_code& ec)
+ accept(CommonGatewayRequest& request, boost::system::error_code& ec)
{
//std::cerr<< "mine:::: endpoint.port := " << this->implementation.endpoint_.port() << std::endl;
- return this->service.accept(this->implementation, request, ec);
+ return this->service.accept(this->implementation, request, 0, ec);
+ }
+
+ template<typename CommonGatewayRequest>
+ boost::system::error_code
+ accept(CommonGatewayRequest& request, endpoint_type& ep
+ , boost::system::error_code& ec)
+ {
+ return this->service.accept(this->implementation, request, &ep, ec);
}
//template<typename CommonGatewayRequest, typename Endpoint>
@@ -240,6 +280,7 @@
}
};
+ } // namespace common
} // namespace cgi
#endif // CGI_BASIC_REQUEST_ACCEPTOR_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_request_fwd.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_request_fwd.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_request_fwd.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -16,6 +16,7 @@
#include "basic_protocol_service_fwd.hpp"
namespace cgi {
+ namespace common {
template<typename RequestService
, typename ProtocolService
@@ -23,6 +24,7 @@
, typename Allocator = std::allocator<char> >
class basic_request;
+ } // namespace common
} // namespace cgi
#endif // CGI_BASIC_REQUEST_FWD_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_sync_io_object.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_sync_io_object.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/basic_sync_io_object.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -12,6 +12,7 @@
#include <boost/noncopyable.hpp>
namespace cgi {
+ namespace common {
/// basic_io_object alternative when an io_service isn't used
template<typename Service>
@@ -19,25 +20,26 @@
: private boost::noncopyable
{
public:
- typedef Service service_type;
- typedef typename Service::impl_type impl_type;
+ typedef Service service_type;
+ typedef typename Service::implementation_type implementation_type;
protected:
explicit basic_sync_io_object()
{
std::cerr<< "Hello";
- service.construct(impl);
+ service.construct(implementation);
}
~basic_sync_io_object()
{
- service.destroy(impl);
+ service.destroy(implementation);
}
service_type service;
- impl_type impl;
+ implementation_type implementation;
};
+ } // namespace common
} // namespace cgi
#endif // CGI_BASIC_SYNC_IO_OBJECT_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/request.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/request.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/request.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -20,11 +20,12 @@
class cgi_service_impl;
- typedef basic_request<cgi_request_service, cgi_service> cgi_request;
+ typedef common::basic_request<cgi_request_service, cgi_service> cgi_request;
+ typedef cgi_request request;
- namespace cgi {
- typedef cgi_request request;
- } // namespace cgi
+ //namespace cgi {
+ // typedef cgi_request request;
+ //} // namespace cgi
} // namespace cgi
#endif // CGI_CGI_REQUEST_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/request_impl.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/request_impl.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/request_impl.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -38,11 +38,11 @@
* restricted but if someone really wants to copy the data, then they can.
*/
class cgi_request_impl
- : public cgi_request_impl_base<stdio_connection>
+ : public cgi_request_impl_base<common::stdio_connection>
{
public:
//typedef stdio_connection client_type;
- typedef ::cgi::basic_client<stdio_connection, tags::cgi> client_type;
+ typedef ::cgi::common::basic_client<common::stdio_connection, tags::cgi> client_type;
/// Constructor
/**
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/request_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/request_service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/request_service.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -26,7 +26,7 @@
class cgi_request_service
: public cgi_service_impl_base<cgi_request_impl>
{
- typedef ::cgi::map map_type;
+ typedef ::cgi::common::map map_type;
public:
typedef cgi_request_impl impl_type;
typedef tags::cgi protocol_type;
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/cgi/service.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -20,7 +20,7 @@
/**
* Works with both cgi_request and acgi_request.
*/
- typedef basic_protocol_service<tags::acgi> cgi_service;
+ typedef common::basic_protocol_service<tags::acgi> cgi_service;
/// A service 'owned' by a single user-supplied io_service
//typedef basic_protocol_service<tags::acgi> cgi_sub_service;
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/common/form_part.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/common/form_part.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/common/form_part.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -1,3 +1,6 @@
+#ifndef BOOST_CGI_FORM_PART_HPP_INCLUDED__
+#define BOOST_CGI_FORM_PART_HPP_INCLUDED__
+
#include <map>
#include <vector>
#include <boost/range.hpp>
@@ -34,6 +37,7 @@
pair_t buffer_;
std::string content_type; // must exist
+ std::string name; // Has to exist?
// Using a simple map while everything is changing. This will not copy the
// values when it is properly implemented (it'll hold a pair of iterators
@@ -46,3 +50,6 @@
} // namespace common
} // namespace cgi
+
+#endif // BOOST_CGI_FORM_PART_HPP_INCLUDED__
+
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/async_stdio.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/async_stdio.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/async_stdio.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -19,6 +19,7 @@
#include "boost/cgi/tags.hpp"
namespace cgi {
+ namespace common {
// Asynchronous access to stdio
template<>
@@ -130,6 +131,7 @@
// typedef basic_connection<tags::async_cgi, ProtocolService> type;
//};
+ } // namespace common
} // namespace cgi
#endif // CGI_ASYNC_STDIO_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/shareable_tcp_socket.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/shareable_tcp_socket.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/shareable_tcp_socket.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -11,9 +11,11 @@
#include <map>
#include <set>
+#include <boost/asio.hpp>
#include <boost/cstdint.hpp>
#include <boost/foreach.hpp>
#include <boost/shared_ptr.hpp>
+#include <boost/thread.hpp>
#include "boost/cgi/tags.hpp"
#include "boost/cgi/error.hpp"
@@ -27,6 +29,7 @@
#include "boost/cgi/detail/protocol_traits.hpp"
namespace cgi {
+ namespace common {
/*** 05.02.2008 :
* I'm planning on making this class a more FastCGI-specific one since a
@@ -150,7 +153,7 @@
return error::duplicate_request;
}
- if (requests_.size() < (id-1))
+ if (requests_.size() < boost::uint16_t(id-1))
requests_.resize(id);
return ec;
@@ -193,6 +196,7 @@
typedef basic_connection<tags::shareable_tcp_socket> shareable_tcp;
} // namespace connection
+ } // namespace common
} // namespace cgi
#include "boost/cgi/detail/pop_options.hpp"
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/stdio.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/stdio.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/stdio.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -23,6 +23,7 @@
//#include "boost/cgi/io_service.hpp"
namespace cgi {
+ namespace common {
template<>
class basic_connection<tags::stdio>
@@ -61,6 +62,11 @@
std::size_t read_some(MutableBufferSequence buf
, boost::system::error_code& ec)
{
+ if (std::cin.eof())
+ {
+ //ec = boost::asio::error::eof;
+ return boost::asio::error::eof;
+ }
//if( buf.data() != in_.rdbuf() )
// return in_.read(buf.begin(), buf.size());
//return buf.size();
@@ -92,10 +98,8 @@
; i != buf.end(); ++i)
{
std::size_t buf_len = boost::asio::buffer_size(*i);
- std::string s(boost::asio::buffer_cast<const char*>(*i)
- , buf_len);
bytes_transferred += buf_len;
- std::cout.write(s.c_str(), buf_len);
+ std::cout.write(boost::asio::buffer_cast<const char*>(*i), buf_len);
}
return bytes_transferred;
}
@@ -104,6 +108,13 @@
bool is_open_;
};
+ namespace connection {
+
+ typedef basic_connection<tags::stdio> stdio;
+
+ } // namespace connection
+
+ // Deprecated
typedef basic_connection<tags::stdio> stdio_connection;
// template<typename ProtocolService = detail::cgi_service>
@@ -112,6 +123,7 @@
// typedef basic_connection<tags::stdio, ProtocolService> type;
//};
+ } // namespace common
} // namespace cgi
#endif // CGI_STDIO_CONNECTION_IMPL_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/tcp_socket.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/tcp_socket.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/connections/tcp_socket.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -19,6 +19,7 @@
#include "boost/cgi/detail/push_options.hpp"
namespace cgi {
+ namespace common {
template<>
class basic_connection<tags::tcp_socket>
@@ -95,12 +96,16 @@
next_layer_type sock_;
};
- typedef basic_connection<tags::tcp_socket> tcp_connection;
-
namespace connection {
+
typedef basic_connection<tags::tcp_socket> tcp;
- }// namespace connection
+ } // namespace connection
+
+ // Deprecated
+ typedef basic_connection<tags::tcp_socket> tcp_connection;
+
+ } // namespace common
} // namespace cgi
#include "boost/cgi/detail/pop_options.hpp"
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/detail/cgi_request_impl_base.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/detail/cgi_request_impl_base.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/detail/cgi_request_impl_base.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -40,15 +40,17 @@
class cgi_request_impl_base
{
public:
- typedef ::cgi::map map_type;
+ typedef ::cgi::common::map map_type;
typedef Connection connection_type;
typedef
- basic_client<Connection, tags::acgi> client_type;
+ common::basic_client<Connection, tags::acgi> client_type;
typedef typename connection_type::pointer conn_ptr;
/// Constructor
cgi_request_impl_base()
: stdin_parsed_(false)
+ , stdin_data_read_(false)
+ , stdin_bytes_left_(-1)
, http_status_(http::ok)
, request_status_(unloaded)
{
@@ -59,12 +61,12 @@
map_type& post_vars() { return post_vars_; }
map_type& cookie_vars() { return cookie_vars_; }
- bool& stdin_parsed() { return stdin_parsed_; }
+ bool stdin_parsed() { return stdin_parsed_; }
http::status_code& http_status() { return http_status_; }
status_type& status() { return request_status_; }
conn_ptr& connection() { return connection_; }
- std::string& null_str() { return null_str_; }
+ //std::string& null_str() { return null_str_; }
protected:
//conn_ptr connection() { return connection_; }
@@ -76,49 +78,18 @@
map_type post_vars_;
map_type cookie_vars_;
+ public:
bool stdin_parsed_;
+ bool stdin_data_read_;
+ std::size_t stdin_bytes_left_;
+ protected:
http::status_code http_status_;
status_type request_status_;
conn_ptr connection_;
-
- std::string null_str_;
};
- //template<> inline const std::string&
- //cgi_request_impl::var<tags::ENV>(const std::string& name)
- //{
- // return ::getenv(name.c_str());
- //}
-
- /// Get a request map of all the environment meta-variables (slow)
- /**
- * -- NOT IMPLEMENTED FOR NOW --
- *
- * In the case of a CGI request, the environment meta-data is usually stored
- * in the process environment, which means there is no direct access to all
- * of them as a map_type&. In other words, this function call will have to
- * load all of the variables into memory and then return the map
- */
- //template<> inline cgi_request_impl::map_type&
- //cgi_request_impl::var<tags::ENV>()
- //{
- // throw std::logic_error("Can't get all environment vars as a map_type&");
- //}
-
- //template<> inline cgi_request_impl::map_type&
- //cgi_request_impl::var<tags::HTTP>() { return http_map_; }
-
- //template<> inline cgi_request_impl::map_type&
- //cgi_request_impl::var<tags::COOKIE>() { return cookie_map_; }
-
- //template<> inline cgi_request_impl::map_type&
- //cgi_request_impl::var<tags::GET>() { return get_map_; }
-
- //template<> inline cgi_request_impl::map_type&
- //cgi_request_impl::var<tags::POST>() { return post_map_; }
-
} // namespace cgi
#endif // CGI_CGI_REQUEST_IMPL_BASE_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/detail/cgi_service_impl_base.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/detail/cgi_service_impl_base.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/detail/cgi_service_impl_base.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -22,6 +22,8 @@
#include "boost/cgi/common/form_part.hpp"
#include "boost/cgi/detail/throw_error.hpp"
+#include "boost/cgi/common/form_parser.hpp"
+
namespace cgi {
namespace detail {
@@ -38,7 +40,7 @@
{
public:
//typedef RequestImplType implementation_type;
- typedef ::cgi::map map_type;
+ typedef ::cgi::common::map map_type;
cgi_service_impl_base()
{
@@ -59,10 +61,11 @@
//typedef std::list<std::string>::iterator marker_list_type;
implementation_type()
- : buffer_()
- , istream_(&buffer_)
- , pos_()
+ : //buffer_()
+ //, istream_(&buffer_)
+ pos_()
, offset_(0)
+ , fp_(NULL)
{
}
@@ -73,10 +76,10 @@
//std::vector<char> data_buffer_;
// The number of characters left to read (ie. "content_length - bytes_read")
std::size_t characters_left_;
-
+
//std::vector<char>::iterator read_pos_;
- boost::asio::streambuf buffer_;
- std::istream istream_;
+ //boost::asio::streambuf buffer_;
+ //std::istream istream_;
buffer_type buf_;
typename buffer_type::iterator pos_;
@@ -84,6 +87,8 @@
//boost::sub_match<typename buffer_type::iterator> offset_;
std::vector<common::form_part> form_parts_;
+ detail::form_parser* fp_;
+
/*
mutable_buffers_type prepare(typename buffer_type::iterator& pos, std::size_t size)
{
@@ -116,7 +121,7 @@
cerr<< "Pre-read buffer (size: " << buf_.size()
<< "|capacity: " << buf_.capacity() << ") == {" << endl
- << std::string(buf_.begin(), buf_.end()) << endl
+ << std::string(buf_.begin() + offset_, buf_.end()) << endl
// << "-----end buffer-----" << endl
// << "-------buffer-------" << endl
// << std::string(&buf_[0], &buf_[buf_.size()]) << endl
@@ -186,6 +191,7 @@
detail::save_environment(impl.env_vars());
const std::string& cl = var(impl.env_vars(), "CONTENT_LENGTH", ec);
impl.characters_left_ = cl.empty() ? 0 : boost::lexical_cast<std::size_t>(cl);
+ impl.client_.bytes_left() = impl.characters_left_;
const std::string& request_method = var(impl.env_vars(), "REQUEST_METHOD", ec);
if (request_method == "GET")
@@ -198,6 +204,7 @@
parse_cookie_vars(impl, ec);
impl.status() = loaded;
+
//BOOST_ASSERT(impl.status() >= loaded);
return ec;
@@ -320,7 +327,7 @@
{
//BOOST_ASSERT(impl.status() >= loaded);
const char* c = ::getenv(name.c_str());
- return c ? c : impl.null_str();
+ return c ? c : std::string();
}
map_type&
@@ -422,17 +429,7 @@
std::string str;
map_type& post_map(impl.post_vars());
- /* What were these lines here for?
- const char* a = ::getenv("content_length");
- if (a) str = a;
- else throw std::runtime_error("no content-length");
- */
-
- //std::cerr<< "content length = ";
- //var(impl.get_vars(), "CONTENT_LENGTH", ec);
- //std::cerr.flush();
-
- while( is.get(ch) )
+ while( is.get(ch) && impl.characters_left_-- )
{
//std::cerr<< "; ch=" << ch << "; ";
switch(ch)
@@ -440,9 +437,10 @@
case '%': // unencode a hex character sequence
// note: function params are resolved in an undefined order!
str += detail::url_decode(is);
+ impl.characters_left_ -= 2; // this is dodgy **FIXME**
break;
case '+':
- str += ' ';
+ str.append(1, ' ');
break;
case ' ':
continue;
@@ -456,7 +454,7 @@
name.clear();
break;
default:
- str += ch;
+ str.append(1, ch);
}
}
// save the last param (it won't have a trailing &)
@@ -480,7 +478,9 @@
return boost::system::error_code();
}
- parse_form_part(impl, ec);
+ do {
+ parse_form_part(impl, ec);
+ }while( !impl.stdin_parsed_ && impl.client_.bytes_left() != 0 );
// Do this just for now, for debugging
parse_url_encoded_form(impl, ec);
@@ -503,7 +503,6 @@
std::string regex("^(.*?)" // the data
"\\x0D\\x0A" // CR LF
"--" "(");
- //typename implementation_type::form_iterator
if (impl.boundary_markers.size() > 1)
{
std::list<std::string>::iterator i(impl.boundary_markers.begin());
@@ -519,7 +518,7 @@
regex += *impl.boundary_markers.begin();
}
- regex += ")[ ]*\\x0D\\x0A";
+ regex += ")(--)?[ ]*\\x0D\\x0A";
cerr<< "Regex: " << regex << endl;
boost::regex re(regex);
@@ -535,6 +534,7 @@
//int runs = 0;
buffer_iter begin(impl.buf_.begin() + offset);
buffer_iter end(impl.buf_.end());
+
for(;;)
{
cerr<< "Starting regex_search" << endl;
@@ -568,14 +568,35 @@
= std::make_pair(matches[1].first, matches[1].second);
cerr<< "Saved buffer (size: "
<< std::distance(matches[1].first, matches[1].second)
- << ")" << endl;
- //impl.offset_ +=
- return ec;
+ << ") := { " << impl.form_parts_.back().name << ", " << matches[1] << " }" << endl;
+ impl.post_vars()[impl.form_parts_.back().name] = matches[1];
+ impl.offset_ = offset + matches[0].length();
+ //offset += matches[0].length();
+ impl.pos_ = matches[0].second;
+ cerr<< "offset := " << offset << endl
+ << "impl.offset_ := " << impl.offset_ << endl;
+
+ if (matches[3].matched)
+ impl.stdin_parsed_ = true;
+ //if (impl.client_.bytes_left() == 0)
+ //{
+ // cerr<< "Read all the bytes up." << endl;
+ //impl.stdin_parsed_ = true;
+ return ec;
+ //}
}
else
{
cerr<< "Reading more data." << endl;
- std::size_t bytes_read = impl.client_.read_some(impl.prepare(32), ec);
+ std::size_t bytes_read = impl.client_.read_some(impl.prepare(64), ec);
+ //impl.stdin_bytes_read_ += bytes_read;
+
+ if (bytes_read == 0)
+ {
+ impl.stdin_data_read_ = true;
+ return ec;
+ }
+
begin = impl.buf_.begin() + offset;
end = impl.buf_.end();
cerr<< "Buffer (+" << bytes_read << ") == {" << endl
@@ -600,29 +621,52 @@
boost::system::error_code
parse_form_part_meta_data(implementation_type& impl, boost::system::error_code& ec)
{
- boost::regex re(//"(?:.*?)?"
- "^(?:"//\\x0D\\x0A" // start of the line
- "(?:" // [IGNORE] the line may be empty, as meta-data is optional
+ // Oh dear this is ugly. The move to Boost.Spirit will have to be sooner than planned.
+ // (it's a nested, recursive pattern, which regexes don't suit, apparently)
+ boost::regex re( "(?:" // [IGNORE] the line may be empty, as meta-data is optional
+ "^"
+ "([-\\w]+)" // name
+ ":[ ^]*" // separator
+ "([-/\\w]+)" // optional(?) value
+ ""
+ "(?:"
+ ";"
+ "[ ]*" // additional name/value pairs (don't capture)
+ "([-\\w]+)" // name
+ "[ \\x0D\\x0A]*=[ \\x0D\\x0A]*" // separator
+ "(?:\"?([-.\\w]*)\"?)" // value may be empty
+ ")?"
+ "(?:"
+ ";"
+ "[ ]*" // additional name/value pairs (don't capture)
+ "([-\\w]+)" // name
+ "[ \\x0D\\x0A]*=[ \\x0D\\x0A]*" // separator
+ "(?:\"?([-.\\w]*)\"?)" // value may be empty
+ ")?" // mark the extra n/v pairs optional
+ "\\x0D\\x0A"
+ ")"
+ "(?:"
"([-\\w]+)" // name
":[ ^]*" // separator
- "([-\\w]+)" // optional(?) value
-
+ "([-/\\w]+)" // optional(?) value
+ ""
"(?:"
";"
- "[ \\x0D\\x0A]*" // additional name/value pairs (don't capture)
+ "[ ]*" // additional name/value pairs (don't capture)
"([-\\w]+)" // name
"[ \\x0D\\x0A]*=[ \\x0D\\x0A]*" // separator
- //"(?"
- // "(?=\")([^\"]+)\"" // value (delimited; any character)
- //"|"
- // "([-\\w]+)" // value (7-bit ASCII only)
- "(?:\"?([-\\w]+)\"?)"
- //")"
- ")*" // mark the extra n/v pairs optional
- ")*"
- ")?"
- //"|(\\x0D\\x0A)"
- "\\x0D\\x0A"); // followed by the end of the line
+ "(?:\"?([-.\\w]*)\"?)" // value may be empty
+ ")?"
+ "(?:"
+ ";"
+ "[ ]*" // additional name/value pairs (don't capture)
+ "([-\\w]+)" // name
+ "[ \\x0D\\x0A]*=[ \\x0D\\x0A]*" // separator
+ "(?:\"?([-.\\w]*)\"?)" // value may be empty
+ ")?" // mark the extra n/v pairs optional
+ "\\x0D\\x0A" // followed by the end of the line
+ ")?"
+ "(\\x0D\\x0A)"); // followed by the 'header termination' line
typedef typename
implementation_type::buffer_type::iterator
@@ -633,77 +677,78 @@
implementation_type::buffer_type::iterator
> matches;
- //impl.buf_.clear();
- //typename implementation_type::buffer_type::difference_type
- std::size_t offset = impl.offset_;//std::difference(impl.buf_.begin(), impl.pos_);
+ std::size_t offset = impl.offset_;
cerr.flush();
impl.pos_ = impl.buf_.begin();
- //buffer_iter begin(impl.pos_);
int runs = 0;
cerr<< "Entering for() loop." << endl;
std::size_t bytes_read = 0;
for(;;)
{
- buffer_iter begin(impl.buf_.begin() + offset);//impl.pos_);// + offset);//
+ buffer_iter begin(impl.buf_.begin() + offset);
buffer_iter end(impl.buf_.end());
+
if (!boost::regex_search(begin, end, matches, re
, boost::match_default | boost::match_partial))
{
cerr<< "No chance of a match, quitting." << endl;
+ impl.stdin_parsed_ = true;
return ec;
}
cerr<< "matches.str() == {" << endl
<< matches.str() << endl
- << "}" << endl;
+ << "}" << endl
+ << matches.size() << " submatches" << endl;
+ for (unsigned i = matches.size(); i != 0; --i)
+ {
+ cerr<< "match[" << i << "] := { " << matches[i] << " }" << endl;
+ }
if (matches[0].matched)
{
- //cerr<< "matches[0].length() == " << matches[0].length() << endl;
- if (0 == matches[1].length())
- { // empty line: terminate headers
- cerr<< "Headers terminated." << endl;
- impl.offset_ = offset + matches[0].length();
- impl.pos_ = matches[0].second;
- cerr<< "Current buffer == {" << endl
- << impl.buffer_string() << endl
- << "}" << endl;
- cerr<< "Leaving parse_form_part_meta_data()" << endl;
- return ec;
- }
- // else we have a match for a header line
- cerr<< "Parsing form part meta-data." << endl;
- //<< "matches.size() == " << matches.size() << endl;
common::form_part part;
- for (unsigned int i = 1; i < matches.size(); i+=2)
+ for ( unsigned int i = 1
+ ; i < matches.size()
+ && matches[i].matched
+ && !matches[i].str().empty()
+ ; i+=2)
{
- // We need to ignore matches[0] : the complete string
- // Ignore last match, which is the header terminator
- /*
- if (matches[i].length())
+ if (matches[i].str() == "name")
{
- cerr<< "[" << i << "] == {" << endl
- << matches[i] << endl
- << "}" << endl;
+ part.name = matches[i+1];
+ cerr<< "Saved name" << endl;
}
- */
- //if (matches[i].str() == "Content-type
- part.meta_data_[matches[i]] //= matches[2].str();
- = std::make_pair(matches[i+1].first, matches[i+1].second);
- cerr<< "Part := { " << matches[i] << ", " << matches[i+1] << " }" << endl;
- //= boost::iterator_range<buffer_iter>(matches[3].first, matches[3].second);
- }
- impl.form_parts_.push_back(part);
- //cerr<< "Added meta data to form_part list (size: "
- // << impl.form_parts_.size() << "| elements: "
- // << impl.form_parts_.back().meta_data_.size() << ")" << endl;
+ else
+ {
+ part.meta_data_[matches[i]]
+ = std::make_pair(matches[i+1].first, matches[i+1].second);
+ cerr<< "Part := { " << matches[i] << ", " << matches[i+1] << " }" << endl;
+ //= boost::iterator_range<buffer_iter>(matches[3].first, matches[3].second);
+ }
+ impl.form_parts_.push_back(part);
-
- offset += matches[0].length();
- impl.pos_ = matches[0].second;
- //break;
-
+
+ }
+
+ if (matches[13].str() == "\r\n")
+ {
+ impl.offset_ = offset + matches[0].length();
+ offset += matches[0].length();
+ impl.pos_ = matches[0].second;
+
+ //cerr<< "Current buffer == {" << endl
+ // << impl.buffer_string() << endl
+ // << "}" << endl;
+ cerr<< "Leaving parse_form_part_meta_data()" << endl;
+ return ec;
+ }
+ else
+ {
+ throw std::runtime_error("Invalid POST data (header wasn't terminated as expected)");
+ }
+
}else{
cerr<< "Not read enough data yet, reading more." << endl;
- bytes_read = impl.client_.read_some(impl.prepare(32), ec);
+ bytes_read = impl.client_.read_some(impl.prepare(64), ec);
if (ec)
{
cerr<< "Error reading data: " << ec.message() << endl;
@@ -712,7 +757,7 @@
}
cerr<< "Read " << bytes_read << " bytes." << endl;
cerr<< "buffer = {" << endl
- << std::string(impl.buf_.begin(), impl.buf_.end()) << endl
+ << impl.buffer_string() << endl
<< "} or {" << endl;
//<< std::string(impl.pos_, ;
/*
@@ -730,8 +775,11 @@
<< "----------------" << endl;
*/
//offset = impl.buf_.end();
- if (++runs > 20)
+ if (++runs > 40)
+ {
+ cerr<< "Run 40 times; bailing out." << endl;
break;
+ }
cerr<< "Waiting buffer (unparsed) == {" << endl << std::flush
<< impl.buffer_string() << endl
<< "}" << endl
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/detail/protocol_traits.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/detail/protocol_traits.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/detail/protocol_traits.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -89,12 +89,12 @@
typedef protocol_traits<tags::cgi> type;
typedef cgi_request_impl impl_type;
typedef cgi_request_service request_service_impl;
- typedef basic_protocol_service<tags::cgi> protocol_service_type;
- typedef basic_request<
+ typedef common::basic_protocol_service<tags::cgi> protocol_service_type;
+ typedef common::basic_request<
request_service_impl, protocol_service_type
> request_type;
typedef cgi_service_impl service_impl_type;
- typedef basic_connection<tags::stdio> connection_type;
+ typedef common::basic_connection<tags::stdio> connection_type;
// typedef cgi_gateway_impl gateway_impl_type;
// typedef cgi_gateway_service gateway_service_impl_type;
};
@@ -105,12 +105,12 @@
typedef protocol_traits<tags::async_cgi> type;
typedef async_cgi_request_impl impl_type;
typedef acgi_request_service request_service_impl;
- typedef basic_protocol_service<tags::acgi> protocol_service_type;
- typedef basic_request<
+ typedef common::basic_protocol_service<tags::acgi> protocol_service_type;
+ typedef common::basic_request<
request_service_impl, protocol_service_type
> request_type;
typedef async_cgi_service_impl service_impl_type;
- typedef basic_connection<tags::async_stdio> connection_type;
+ typedef common::basic_connection<tags::async_stdio> connection_type;
typedef async_cgi_gateway_impl gateway_impl_type;
typedef async_cgi_gateway_service gateway_service_type;
};
@@ -122,12 +122,12 @@
typedef protocol_traits<tags::acgi> type;
typedef acgi_request_impl impl_type;
typedef acgi_request_service request_service_impl;
- typedef basic_protocol_service<tags::acgi> protocol_service_type;
- typedef basic_request<
+ typedef common::basic_protocol_service<tags::acgi> protocol_service_type;
+ typedef common::basic_request<
request_service_impl, protocol_service_type
> request_type;
typedef acgi_service_impl service_impl_type;
- typedef basic_connection<tags::async_stdio> connection_type;
+ typedef common::basic_connection<tags::async_stdio> connection_type;
typedef acgi_gateway_impl gateway_impl_type;
typedef acgi_gateway_service gateway_service_type;
};
@@ -138,8 +138,8 @@
typedef protocol_traits<tags::fcgi> type;
typedef fcgi::fcgi_request_impl impl_type;
typedef fcgi::fcgi_request_service request_service_impl;
- typedef basic_protocol_service<fcgi_> protocol_service_type;
- typedef basic_request<
+ typedef common::basic_protocol_service<fcgi_> protocol_service_type;
+ typedef common::basic_request<
request_service_impl, protocol_service_type
> request_type;
typedef boost::shared_ptr<request_type> request_ptr;
@@ -147,7 +147,7 @@
// ::implementation_type request_impl_type;
typedef fcgi::fcgi_service_impl service_impl_type;
typedef fcgi::fcgi_acceptor_service acceptor_service_impl;
- typedef basic_connection<
+ typedef common::basic_connection<
tags::shareable_tcp_socket
> connection_type;
//typedef fcgi_gateway_impl gateway_impl_type;
@@ -160,13 +160,13 @@
typedef protocol_traits<tags::scgi> type;
typedef scgi::scgi_request_impl impl_type;
typedef scgi::scgi_request_service request_service_impl;
- typedef basic_protocol_service<tags::scgi> protocol_service_type;
- typedef basic_request<
+ typedef common::basic_protocol_service<tags::scgi> protocol_service_type;
+ typedef common::basic_request<
request_service_impl, protocol_service_type
> request_type;
typedef scgi::scgi_service_impl service_impl_type;
typedef scgi::scgi_acceptor_service acceptor_service_impl;
- typedef basic_connection<tags::tcp_socket> connection_type;
+ typedef common::basic_connection<tags::tcp_socket> connection_type;
//typedef scgi_gateway_impl gateway_impl_type;
//typedef scgi_gateway_service gateway_service_type;
};
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/error.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/error.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/error.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -44,7 +44,13 @@
// themselves. This is an ugly hack.
multiplexed_request_incoming,
- duplicate_request
+ duplicate_request,
+
+ // Calling async_accept on a request that hasn't been closed isn't
+ // allowed.
+ accepting_on_an_open_request,
+
+ invalid_socket
};
namespace detail {
@@ -63,8 +69,10 @@
case multiplexed_request_incoming:
return "A new request is pending on this connection (ie. it is "
"multiplexed). This isn't handled for now. **FIXME**";
+ case accepting_on_an_open_request:
+ return "You called async_accept before closing a request.";
default:
- return "BOOM!!!";
+ return "(FastCGI) BOOM!!!";
}
}
};
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/acceptor.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/acceptor.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/acceptor.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -16,7 +16,11 @@
namespace fcgi {
/// Typedef for common usage (FCGI)
- typedef basic_request_acceptor<fcgi_request_acceptor_service<> > acceptor;
+ typedef
+ ::cgi::common::basic_request_acceptor<
+ fcgi_request_acceptor_service<>
+ >
+ acceptor;
} // namespace fcgi
} // namespace cgi
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/acceptor_service_impl.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/acceptor_service_impl.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/acceptor_service_impl.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -87,7 +87,9 @@
struct implementation_type
{
typedef Protocol_ protocol_type;
- typedef basic_protocol_service<protocol_type> protocol_service_type;
+ typedef common::basic_protocol_service<
+ protocol_type
+ > protocol_service_type;
typedef boost::asio::ip::tcp native_protocol_type;
typedef fcgi::request request_type;
typedef boost::asio::socket_acceptor_service<
@@ -121,6 +123,9 @@
native_protocol_type;
typedef typename
acceptor_service_type::native_type native_type;
+
+ typedef typename
+ type::implementation_type::endpoint_type endpoint_type;
explicit acceptor_service_impl(::cgi::io_service& ios)
@@ -130,6 +135,39 @@
{
}
+ protocol_service_type&
+ service(implementation_type const& impl) const
+ {
+ return *impl.service_;
+ }
+
+ /// Default-initialize the acceptor.
+ boost::system::error_code
+ default_init(implementation_type& impl, boost::system::error_code& ec)
+ {
+#if ! defined(BOOST_WINDOWS)
+ //assign(impl.acceptor_, , 0, ec);
+ return acceptor_service_.assign(impl.acceptor_, boost::asio::ip::tcp::v4()
+ , 0, ec);
+ #else
+//# error "Windows isn't supported at the moment"
+ HANDLE hListen = INVALID_HANDLE_VALUE;
+ boost::asio::detail::socket_type sock;
+ struct sockaddr sa;
+ int sa_len = sizeof(sa);
+#if NO_WSAACCEPT
+ sock = accept((boost::asio::detail::socket_type)hListen, &sa, &sa_len);
+ if (sock == INVALID_SOCKET)
+ return cgi::error::invalid_socket;
+#else
+ sock = WSAAccept((unsigned int)hListen, &sa, &sa_len, NULL, (DWORD)NULL);
+ if (sock == INVALID_SOCKET)
+ return ::cgi::error::invalid_socket;
+#endif
+#endif
+ return ec;
+ }
+
void set_protocol_service(implementation_type& impl
, protocol_service_type& ps)
{
@@ -205,7 +243,7 @@
template<typename CommonGatewayRequest>
boost::system::error_code
accept(implementation_type& impl, CommonGatewayRequest& request
- , boost::system::error_code& ec)
+ , endpoint_type* endpoint, boost::system::error_code& ec)
{
/* THIS BIT IS BROKEN:
*-- The noncopyable semantics of a basic_request<> don't allow the
@@ -227,36 +265,24 @@
}
}
*/
- return acceptor_service_.accept(impl.acceptor_,
- request.client().connection()->next_layer(), 0, ec);
- }
-
- /// Accepts one request.
- template<typename CommonGatewayRequest, typename Endpoint>
- boost::system::error_code
- accept(implementation_type& impl, CommonGatewayRequest& request
- , Endpoint* endpoint, boost::system::error_code& ec)
- {
- /* THIS BIT IS BROKEN:
- *-- The noncopyable semantics of a basic_request<> don't allow the
- assignment. There are a couple of ways around this; the one that
- seems sensible is to keep the basic_request<>s noncopyable, but
- allow the actual data be copied. At the moment the actual data is
- held in a vector<string> headers container and a cgi::streambuf.
- These two bits should really be factored out into a message type.
- IOW, the message type will be copyable (but should probably have
- unique-ownership semantics).
- --*
+
+ BOOST_ASSERT
+ ( ! request.is_open()
+ && "Error: Calling accept on open request (close it first?)."
+ );
+
+ // If the client is open, make sure the request is clean.
+ // ie. don't leak data from one request to another!
+ if (request.client().is_open())
{
- boost::mutex::scoped_lock lk(impl.mutex_);
- if (!impl.waiting_requests_.empty())
- {
- request = *(impl.waiting_requests_.front());
- impl.waiting_requests_.pop();
- return ec;
- }
+ request.clear();
}
- */
+
+ // If we can reuse this request's connection, return.
+ if (request.client().keep_connection())
+ return ec;
+
+ // ...otherwise accept a new connection.
return acceptor_service_.accept(impl.acceptor_,
request.client().connection()->next_layer(), endpoint, ec);
}
@@ -314,7 +340,24 @@
}
}
*/
- acceptor_service_.async_accept(impl.acceptor_,
+
+ // We can't call accept on an open request (close it first).
+ if (request.is_open())
+ return handler(error::accepting_on_an_open_request);
+
+ // If the client is open, make sure the request is clean.
+ // ie. don't leak data from one request to another!
+ if (request.client().is_open())
+ {
+ request.clear();
+ }
+
+ // If we can reuse this request's connection, return.
+ if (request.client().keep_connection())
+ return handler(boost::system::error_code());
+
+ // ...otherwise accept a new connection (asynchronously).
+ return acceptor_service_.async_accept(impl.acceptor_,
request.client().connection()->next_layer(), 0, handler);
}
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/client.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/client.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/client.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -27,6 +27,7 @@
#include "boost/cgi/basic_request_fwd.hpp"
//#error BOOST_HAS_RVALUE_REFS
namespace cgi {
+ namespace common {
enum client_status
{
@@ -41,13 +42,13 @@
/// A client that uses a TCP socket that owned by it.
template<typename Protocol>
- class basic_client<shareable_tcp_connection, Protocol>
+ class basic_client<common::shareable_tcp_connection, Protocol>
{
public:
typedef ::cgi::io_service io_service_type;
- typedef ::cgi::map map_type;
+ typedef ::cgi::common::map map_type;
typedef Protocol protocol_type;
- typedef shareable_tcp_connection connection_type;
+ typedef common::shareable_tcp_connection connection_type;
//typedef detail::protocol_traits<
// fcgi_
//>::request_impl_type request_impl_type;
@@ -65,6 +66,7 @@
basic_client()
: request_id_(-1)
, status_(none_)
+ , keep_connection_(false)
{
}
@@ -72,6 +74,7 @@
basic_client(io_service_type& ios)
: request_id_(-1)
, status_(none_)
+ , keep_connection_(false)
//, io_service_(ios)
//, connection_(new connection_type::pointer(ios))
{
@@ -107,13 +110,21 @@
void close(boost::uint64_t app_status = 0)
{
- if (status_ == closed_) return;
+ boost::system::error_code ec;
+ close(app_status, ec);
+ detail::throw_error(ec);
+ }
+
+ boost::system::error_code
+ close(boost::uint64_t app_status, boost::system::error_code& ec)
+ {
+ if (status_ == closed_) return ec;
std::vector<boost::asio::const_buffer> bufs;
// Write an EndRequest packet to the server.
out_header_[0] = static_cast<unsigned char>(1); // FastCGI version
- out_header_[1] = static_cast<unsigned char>(3); // BEGIN_REQUEST
+ out_header_[1] = static_cast<unsigned char>(3); // END_REQUEST
out_header_[2] = static_cast<unsigned char>(request_id_ >> 8) & 0xff;
out_header_[3] = static_cast<unsigned char>(request_id_) & 0xff;
out_header_[4] = static_cast<unsigned char>(8 >> 8) & 0xff;
@@ -121,8 +132,8 @@
out_header_[6] = static_cast<unsigned char>(0);
out_header_[7] = 0;
- BOOST_ASSERT(role_ == fcgi::spec_detail::RESPONDER
- && "Only supports Responder role for now (**FIXME**)");
+ //BOOST_ASSERT(role_ == fcgi::spec_detail::RESPONDER
+ // && "Only supports Responder role for now (**FIXME**)");
header_buffer_type end_request_body =
{{
@@ -139,10 +150,12 @@
bufs.push_back(buffer(out_header_));
bufs.push_back(buffer(end_request_body));
- write(*connection_, bufs);
+ write(*connection_, bufs, boost::asio::transfer_all(), ec);
- if (!keep_connection_ && connection_)
+ if (!keep_connection_)
connection_->close();
+
+ return ec;
}
//io_service_type& io_service() { return io_service_; }
@@ -236,6 +249,11 @@
return status_;
}
+ bool keep_connection() const
+ {
+ return keep_connection_;
+ }
+
public:
friend class fcgi_request_service;
boost::uint16_t request_id_;
@@ -268,8 +286,14 @@
//#include "boost/cgi/fcgi/client_fwd.hpp"
+ } // namespace common
+
namespace fcgi {
- typedef basic_client<shareable_tcp_connection, ::cgi::fcgi_> client;
+ typedef
+ common::basic_client<
+ common::shareable_tcp_connection, ::cgi::fcgi_
+ >
+ client;
} // namespace fcgi
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/request.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/request.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/request.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -16,10 +16,15 @@
#include "boost/cgi/fcgi/request_service.hpp"
namespace cgi {
-
namespace fcgi {
+
// typedef for typical usage (FCGI)
- typedef basic_request<fcgi_request_service, service> request;
+ typedef
+ ::cgi::common::basic_request<
+ fcgi_request_service, service
+ >
+ request;
+
} // namespace fcgi
} // namespace cgi
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/request_acceptor_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/request_acceptor_service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/request_acceptor_service.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -69,6 +69,18 @@
service_impl_.shutdown_service();
}
+ service_impl_type::protocol_service_type&
+ protocol_service(implementation_type const& impl) const
+ {
+ return service_impl_.service(impl);
+ }
+
+ boost::system::error_code
+ default_init(implementation_type& impl, boost::system::error_code& ec)
+ {
+ return service_impl_.default_init(impl, ec);
+ }
+
bool is_open(implementation_type& impl)
{
return service_impl_.is_open(impl);
@@ -109,18 +121,18 @@
return service_impl_.listen(impl, backlog, ec);
}
- template<typename CommonGatewayRequest>
- boost::system::error_code
- accept(implementation_type& impl, CommonGatewayRequest& request
- , boost::system::error_code& ec)
- {
- return service_impl_.accept(impl, request, ec);
- }
+// template<typename CommonGatewayRequest>
+// boost::system::error_code
+// accept(implementation_type& impl, CommonGatewayRequest& request
+// , boost::system::error_code& ec)
+// {
+// return service_impl_.accept(impl, request, NULL, ec);
+// }
- template<typename CommonGatewayRequest, typename Endpoint>
+ template<typename CommonGatewayRequest>
boost::system::error_code
accept(implementation_type& impl, CommonGatewayRequest& request
- , Endpoint* ep, boost::system::error_code& ec)
+ , endpoint_type * ep, boost::system::error_code& ec)
{
return service_impl_.accept(impl, request, ep, ec);
}
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/service.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -19,7 +19,7 @@
namespace fcgi {
// typedef for standard scgi::service (a model of ProtocolService)
- typedef basic_protocol_service< ::cgi::fcgi_> service;
+ typedef ::cgi::common::basic_protocol_service< ::cgi::fcgi_> service;
}
} // namespace cgi
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/specification.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/specification.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/fcgi/specification.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -9,7 +9,7 @@
#ifndef CGI_FCGI_SPECIFICATION_HPP_INCLUDED__
#define CGI_FCGI_SPECIFICATION_HPP_INCLUDED__
-#include <inttypes.h>
+//#include <inttypes.h>
#include <boost/cstdint.hpp>
// NOTE: CamelCase style mimicks the FastCGI specification
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/io_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/io_service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/io_service.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -16,9 +16,15 @@
#include <boost/asio/io_service.hpp>
namespace cgi {
+ namespace common {
using boost::asio::io_service;
+ } // namespace common
+
+ // This should go?
+ using boost::asio::io_service;
+
} // namespace cgi
#endif // CGI_IO_SERVICE_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/map.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/map.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/map.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -13,9 +13,11 @@
#include <string>
namespace cgi {
+ namespace common {
typedef std::map<std::string,std::string> map;
+ } // namespace common
} // namespace cgi
#endif // CGI_MAP_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/read.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/read.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/read.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -12,10 +12,12 @@
#include <boost/asio/read.hpp>
namespace cgi {
+ namespace common {
using boost::asio::read;
using boost::asio::async_read;
+ } // namespace common
} // namespace cgi
#endif // CGI_READ_HPP_INCLUDED
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/request_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/request_service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/request_service.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -21,6 +21,7 @@
//#include "service_selector.hpp"
namespace cgi {
+ namespace common {
/// The generic service class for basic_request<>s
/**
@@ -43,7 +44,7 @@
typedef typename
service_impl_type::implementation_type implementation_type;
typedef Protocol protocol_type;
- typedef basic_protocol_service<Protocol> protocol_service_type;
+ typedef common::basic_protocol_service<Protocol> protocol_service_type;
/// The unique service identifier
//static boost::asio::io_service::id id;
@@ -159,6 +160,7 @@
service_impl_type& service_impl_;
};
+ } // namespace common
} // namespace cgi
#include "boost/cgi/detail/pop_options.hpp"
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/response.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/response.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/response.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -14,6 +14,9 @@
#include <string>
#include <fstream> // only for testing
+#include <boost/foreach.hpp>
+#include <boost/bind.hpp>
+
//#include "boost/cgi/request_ostream.hpp"
#include "boost/cgi/buffer.hpp"
#include "boost/cgi/cookie.hpp"
@@ -22,7 +25,7 @@
#include "boost/cgi/basic_request_fwd.hpp"
#include "boost/cgi/http/status_code.hpp"
#include "boost/cgi/streambuf.hpp"
-#include <boost/foreach.hpp>
+#include "boost/cgi/detail/throw_error.hpp"
/// This mess outputs a default Content-type header if the user hasn't set any.
/** **FIXME** Not implemented; not sure if it should be...
@@ -54,6 +57,7 @@
namespace cgi {
+ namespace common {
/// The response class: a helper for responding to requests.
class response
@@ -90,6 +94,7 @@
{
ostream_.clear();
headers_.clear();
+ headers_terminated_ = false;
}
/// Return the response to the 'just constructed' state.
@@ -150,7 +155,8 @@
return ec;
}
- std::size_t bytes_written = common::write(sws, buffer_->data(), ec);
+ std::size_t bytes_written
+ = common::write(sws, buffer_->data(), boost::asio::transfer_all(), ec);
if (!ec)
buffer_->consume(bytes_written);
@@ -178,18 +184,21 @@
* object.
*/
template<typename SyncWriteStream>
- boost::system::error_code&
+ boost::system::error_code
send(SyncWriteStream& sws, boost::system::error_code& ec)
{
if (!headers_terminated_)
{
- //BOOST_FOREACH(headers_.begin(), headers_.end()
- // , headers.push_back(::cgi::buffer(*_1)));
+ /* Not sure if streambuf allows this
+ *
+ // We want to be able to keep adding to a response, calling send() on
+ // it whenever, without resending the headers. Call resend() if you
+ // want to send the whole response again.
+ headers_terminated_ = true;
+ */
std::vector<boost::asio::const_buffer> headers;
prepare_headers(headers);//, ec)
- if (common::write(sws, headers, boost::asio::transfer_all(), ec))
- std::cerr<< "Broken." << std::endl;
- //return ec;
+ common::write(sws, headers, boost::asio::transfer_all(), ec);
}
common::write(sws, buffer_->data(), boost::asio::transfer_all(), ec);
@@ -197,6 +206,17 @@
return ec;
}
+ /// Resend headers + content regardless of value of `headers_terminated_`.
+ template<typename SyncWriteStream>
+ void resend(SyncWriteStream& sws)
+ {
+ std::vector<boost::asio::const_buffer> headers;
+ prepare_headers(headers);//, ec)
+ common::write(sws, headers);
+
+ common::write(sws, buffer_->data());
+ }
+
/// Asynchronously send the data through the supplied request
/**
* Note: This is quite crude at the moment and not as asynchronous as
@@ -242,11 +262,6 @@
}
/// Get the status code associated with the response.
- http::status_code& get_status()
- {
- return http_status_;
- }
-
http::status_code& status()
{
return http_status_;
@@ -300,7 +315,8 @@
// Vector of all the headers, each followed by a CRLF
std::vector<std::string> headers_;
- boost::shared_ptr<common::streambuf> buffer_; // maybe scoped_ptr?
+ // The buffer is a shared_ptr, so you can keep it cached elsewhere.
+ boost::shared_ptr<common::streambuf> buffer_;
ostream_type ostream_;
@@ -312,6 +328,9 @@
template<typename T>
friend response& operator<<(response& resp, const T& t);
+ //template<typename A, typename B>
+ //friend A& operator<<(A& resp, B b);
+
private:
// Send the response headers and mark that they've been sent.
@@ -378,7 +397,7 @@
}*/
template<>
- response& operator<<(response& resp, const ::cgi::header& hdr)
+ response& operator<<(response& resp, const ::cgi::common::header& hdr)
{
if (hdr.content.empty()) {
resp.headers_terminated_ = true;
@@ -417,6 +436,7 @@
return resp.set_status(status);
}
+ } // namespace common
} // namespace cgi
#undef BOOST_CGI_ADD_DEFAULT_HEADER
Modified: sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/write.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/write.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/acceptor_work/boost/cgi/write.hpp 2008-03-21 12:49:08 EDT (Fri, 21 Mar 2008)
@@ -19,8 +19,8 @@
} // namespace common
- using common::write;
- using common::async_write;
+ //using common::write;
+ //using common::async_write;
} // namespace cgi
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk