|
Boost-Commit : |
From: lists.drrngrvy_at_[hidden]
Date: 2008-06-02 17:54:09
Author: drrngrvy
Date: 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
New Revision: 46058
URL: http://svn.boost.org/trac/boost/changeset/46058
Log:
Merged revisions 43980-46057 via svnmerge from
https://svn.boost.org/svn/boost/sandbox/SOC/2007/cgi/trunk
........
r44571 | drrngrvy | 2008-04-19 14:05:37 +0100 (Sat, 19 Apr 2008) | 1 line
Factoring form_parser body into an ipp file.
........
r44573 | drrngrvy | 2008-04-19 14:23:03 +0100 (Sat, 19 Apr 2008) | 9 lines
* Added case-insensitive name type (typedef for std::basic_string<> using a custom traits class).
* Modified cgi::map to use cgi::name as key.
* Also modified files to include common/map.hpp instead of map.hpp.
* Changed code because a std::string isn't automatically convertible to cgi::name
* Fixed it so multiple cookies are parsed correctly.
* Plus, other smallish fixes (cleanup / updating Boost.Thread compatibility).
........
r44574 | drrngrvy | 2008-04-19 14:25:08 +0100 (Sat, 19 Apr 2008) | 1 line
Small fixes to examples.
........
r44576 | drrngrvy | 2008-04-19 14:32:06 +0100 (Sat, 19 Apr 2008) | 1 line
Add a test which uses wget to check the output of the *cgi_hello_world examples through a server. It's not used by default, but has the BBv2 id of wget_test.
........
r44577 | drrngrvy | 2008-04-19 14:34:48 +0100 (Sat, 19 Apr 2008) | 1 line
Added basic tests for cgi::name and cgi::map and another for a cgi::request.
........
r44578 | drrngrvy | 2008-04-19 14:40:56 +0100 (Sat, 19 Apr 2008) | 1 line
Added simple test for acgi::request.
........
r44879 | drrngrvy | 2008-04-29 13:22:22 +0100 (Tue, 29 Apr 2008) | 1 line
Fix ichar_traits<>::compare(). Minor optimisations to ichar_traits<>::find() and save_environment().
........
r44880 | drrngrvy | 2008-04-29 13:23:50 +0100 (Tue, 29 Apr 2008) | 1 line
Extracting out cgi/acgi test commonality. Checking name(bar) < name(foo) in name_test too.
........
r44898 | drrngrvy | 2008-04-29 22:08:35 +0100 (Tue, 29 Apr 2008) | 5 lines
* Added basic_request<>::id() member function.
* Changed basic_request<>::operator[] so that it decides at compile-time rather than runtime what data map is being accessed.
* Added additional typedefs env_map, get_map, post_map, cookie_map, form_map corresponding to the dataset they obviously refer to - for now they are just typedefs to cgi::common::map, but eventually they may change - only to make code safer (eg. protect the user against XSS vulnerabilities).
........
r44899 | drrngrvy | 2008-04-29 23:24:00 +0100 (Tue, 29 Apr 2008) | 1 line
Moved a couple of common bits from cgi_service_impl_base and fcgi_request_service into common::request_base<>.
........
r44908 | drrngrvy | 2008-04-30 03:31:09 +0100 (Wed, 30 Apr 2008) | 1 line
Refactoring/housekeeping. Lots of common stuff has moved into common::request_base<> (this *isn't* the same as ::cgi::request_base - an old class that will be removed/replaced).
........
r44909 | drrngrvy | 2008-04-30 03:31:32 +0100 (Wed, 30 Apr 2008) | 1 line
Fix examples because of an interface change.
........
r45554 | drrngrvy | 2008-05-19 20:03:57 +0100 (Mon, 19 May 2008) | 1 line
Made response, cookie and header parameterised on a char type.
........
r45555 | drrngrvy | 2008-05-19 20:06:45 +0100 (Mon, 19 May 2008) | 1 line
Fix name.hpp
........
r45556 | drrngrvy | 2008-05-19 20:17:04 +0100 (Mon, 19 May 2008) | 10 lines
Breaking changes: Accessing request data should only be done using basic_request<>::operator[] now; member functions like basic_request<>::GET() are gone now. Examples have been updated.
Also:
* Internally, data maps are accessed using eg. common::get_vars(impl.var_) where impl.var_ is the Boost.Fusion map of all the request types.
* Added "_data"-less alternatives to get_data, post_data, etc, so you can do eg.
``
assert( request[get]["Hello"] == request[get_data]["hello"]); // note: case insensitive
``
* Other minor cleanups/refactoring.
........
r45557 | drrngrvy | 2008-05-19 20:21:20 +0100 (Mon, 19 May 2008) | 1 line
Updating tests and examples.
........
r45558 | drrngrvy | 2008-05-19 20:25:17 +0100 (Mon, 19 May 2008) | 1 line
Updated project-root.jam
........
r45579 | drrngrvy | 2008-05-20 17:08:38 +0100 (Tue, 20 May 2008) | 1 line
Refactoring; lots of things moved - boost/cgi/ -> boost/cgi/common/; lots more cleanups that are long overdue.
........
r45581 | drrngrvy | 2008-05-20 17:10:37 +0100 (Tue, 20 May 2008) | 1 line
Missing file.
........
r45582 | drrngrvy | 2008-05-20 17:14:12 +0100 (Tue, 20 May 2008) | 1 line
Removing files properly...
........
r45583 | drrngrvy | 2008-05-20 17:23:37 +0100 (Tue, 20 May 2008) | 1 line
Fixing operator<< overload for name.hpp
........
r45584 | drrngrvy | 2008-05-20 17:30:05 +0100 (Tue, 20 May 2008) | 1 line
Missing include in fcgi/client.hpp
........
r45605 | drrngrvy | 2008-05-21 13:25:47 +0100 (Wed, 21 May 2008) | 1 line
More refactorings. Plus a couple of minor bug fixes (like multiple-definition of things in url_decode.hpp
........
r45610 | drrngrvy | 2008-05-21 17:06:46 +0100 (Wed, 21 May 2008) | 4 lines
* Adding ability to compile a library by passing --build-cgi on the bjam command line (seems to work).
* Fixing examples and tests as per refactoring.
........
r45611 | drrngrvy | 2008-05-21 17:16:18 +0100 (Wed, 21 May 2008) | 4 lines
* More refactoring: Moving things imported from Boost.Asio into the import folder.
* Adding/fixing a couple of hooks for the *option* of building a library out of the headers.
........
r45612 | drrngrvy | 2008-05-21 17:25:27 +0100 (Wed, 21 May 2008) | 1 line
1of2 - fixing corrupted repository.
........
r45613 | drrngrvy | 2008-05-21 17:43:19 +0100 (Wed, 21 May 2008) | 1 line
Removing typo-file.
........
r45614 | drrngrvy | 2008-05-21 17:46:33 +0100 (Wed, 21 May 2008) | 1 line
2of2: fixing corrupted repository.
........
r45615 | drrngrvy | 2008-05-21 17:48:54 +0100 (Wed, 21 May 2008) | 1 line
Fixes related to refactoring.
........
r45628 | drrngrvy | 2008-05-21 22:40:58 +0100 (Wed, 21 May 2008) | 1 line
Missing file.
........
r45655 | drrngrvy | 2008-05-22 15:19:21 +0100 (Thu, 22 May 2008) | 1 line
End of spring cleaning (hopefully).
........
r45656 | drrngrvy | 2008-05-22 15:19:43 +0100 (Thu, 22 May 2008) | 1 line
End of spring cleaning (hopefully).
........
Added:
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/basic_protocol_service.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/basic_protocol_service.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/connection_base.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/connection_base.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/cookie.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/cookie.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/header.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/header.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/io_service_provider.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/io_service_provider.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/is_async.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/is_async.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/map.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/map.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/name.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/name.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/request_acceptor_service.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/request_acceptor_service.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/request_base.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/request_base.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/request_service.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/request_service.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/response.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/response.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/return.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/return.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/role_type.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/role_type.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/source_enums.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/source_enums.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/status_type.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/status_type.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/tags.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/common/tags.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/basic_sync_io_object.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/detail/basic_sync_io_object.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/url_decode.ipp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/detail/url_decode.ipp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fwd/
- copied from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/fwd/
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fwd/basic_connection_fwd.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/fwd/basic_connection_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fwd/basic_protocol_service_fwd.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/fwd/basic_protocol_service_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fwd/basic_request_acceptor_fwd.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/fwd/basic_request_acceptor_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fwd/basic_request_fwd.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/fwd/basic_request_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fwd/io_service_provider_fwd.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/fwd/io_service_provider_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fwd/request_service_fwd.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/fwd/request_service_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/impl/
- copied from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/impl/
sandbox/SOC/2007/cgi/branches/release/boost/cgi/impl/form_parser.ipp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/impl/form_parser.ipp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/impl/response.ipp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/impl/response.ipp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/import/
- copied from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/import/
sandbox/SOC/2007/cgi/branches/release/boost/cgi/import/basic_io_object.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/import/basic_io_object.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/import/buffer.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/import/buffer.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/import/io_service.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/import/io_service.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/import/read.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/import/read.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/import/streambuf.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/import/streambuf.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/import/write.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/import/write.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/utility/
- copied from r45656, /sandbox/SOC/2007/cgi/trunk/boost/cgi/utility/
sandbox/SOC/2007/cgi/branches/release/libs/cgi/doc/src/troubleshooting.qbk
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/libs/cgi/doc/src/troubleshooting.qbk
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server1/server.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/libs/cgi/example/fcgi/server1/server.hpp
sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/acgi_simple_request.cpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/libs/cgi/test/run/acgi_simple_request.cpp
sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/cgi_simple_request.cpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/libs/cgi/test/run/cgi_simple_request.cpp
sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/hello_world.cpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/libs/cgi/test/run/hello_world.cpp
sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/map_test.cpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/libs/cgi/test/run/map_test.cpp
sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/name_test.cpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/libs/cgi/test/run/name_test.cpp
sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/request_test_template.hpp
- copied unchanged from r45656, /sandbox/SOC/2007/cgi/trunk/libs/cgi/test/run/request_test_template.hpp
Removed:
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_client_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_connection_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_gateway.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_gateway_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_io_object.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_protocol_service.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_protocol_service_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request_acceptor_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_sync_io_object.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/buffer.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/connection_base.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/cookie.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/data_sink.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/data_source.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/header.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/io_service.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/io_service_provider.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/io_service_provider_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/is_async.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/map.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/read.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/request.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_acceptor_service.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_base.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_ostream.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_service.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_service_fwd.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/response.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/return.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/role_type.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/status_type.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/streambuf.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/tags.hpp
sandbox/SOC/2007/cgi/branches/release/boost/cgi/write.hpp
Properties modified:
sandbox/SOC/2007/cgi/branches/release/ (props changed)
Text files modified:
sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi.hpp | 9
sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/request.hpp | 5
sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/request_impl.hpp | 11
sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/request_service.hpp | 14
sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/service.hpp | 12
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_client.hpp | 10
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request.hpp | 478 +++++++----------------
sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request_acceptor.hpp | 6
sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/request.hpp | 4
sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/request_impl.hpp | 59 --
sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/request_service.hpp | 13
sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/service.hpp | 6
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/form_parser.hpp | 400 ++------------------
sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/form_part.hpp | 2
sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/async_stdio.hpp | 12
sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/shareable_tcp_socket.hpp | 15
sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/stdio.hpp | 38 -
sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/tcp_socket.hpp | 8
sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/cgi_request_impl_base.hpp | 55 +-
sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/cgi_service_impl_base.hpp | 786 +--------------------------------------
sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/common_headers.hpp | 22
sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/extract_params.hpp | 8
sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/protocol_traits.hpp | 67 ++-
sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/push_options.hpp | 9
sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/save_environment.hpp | 11
sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/url_decode.hpp | 85 ---
sandbox/SOC/2007/cgi/branches/release/boost/cgi/error.hpp | 5
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi.hpp | 2
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/acceptor_service_impl.hpp | 22
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/client.hpp | 29
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/request.hpp | 7
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/request_acceptor_service.hpp | 14
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/request_service.hpp | 334 +++-------------
sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/service.hpp | 6
sandbox/SOC/2007/cgi/branches/release/boost/cgi/http/status_code.hpp | 144 +++---
sandbox/SOC/2007/cgi/branches/release/libs/cgi/build/Jamfile.v2 | 49 ++
sandbox/SOC/2007/cgi/branches/release/libs/cgi/doc/src/cgi.qbk | 6
sandbox/SOC/2007/cgi/branches/release/libs/cgi/doc/src/reference.qbk | 54 ++
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/Jamfile.v2 | 5
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/amortization/main.cpp | 14
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/cookie_game/main.cpp | 13
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/doc.qbk | 4
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/echo/Jamfile.v2 | 4
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/echo/main.cpp | 53 +
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/hello_world/main.cpp | 1
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/login/CheckCookie.cpp | 6
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/login/Login.cpp | 20
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/login/Logout.cpp | 2
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/cgi/echo/Jamfile.v2 | 7
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/cgi/echo/main.cpp | 21
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/echo/main.cpp | 94 +++-
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server1/main.cpp | 193 ++-------
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server2/main.cpp | 67 +-
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server3/main.cpp | 10
sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server4/main.cpp | 1
sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/Jamfile.v2 | 5
sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/compile/is_async_test.cpp | 4
sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/compile/response.cpp | 2
sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/Jamfile.v2 | 8
sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/cookie.cpp | 5
sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/response.cpp | 15
sandbox/SOC/2007/cgi/branches/release/project-root.jam | 62 ++
62 files changed, 1039 insertions(+), 2394 deletions(-)
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,15 +9,8 @@
#ifndef CGI_ACGI_HPP_INCLUDED__
#define CGI_ACGI_HPP_INCLUDED__
-// #include all acgi-related headers only
#include "boost/cgi/acgi/service.hpp"
#include "boost/cgi/acgi/request.hpp"
-//#include "boost/cgi/acgi/request_service.hpp"
-//#include "boost/cgi/acgi/request_impl.hpp"
-//#include "gateway_impl/acgi_gateway_impl.hpp"
-//#include "gateway_service/acgi_gateway_service.hpp"
-
-// Include headers common to all protocols
#include "boost/cgi/detail/common_headers.hpp"
namespace cgi {
@@ -29,7 +22,7 @@
typedef acgi_request request;
//typedef acgi_service service;
//typedef acgi_acceptor acceptor;
- using namespace ::cgi; // **FIXME** this line must go.
+ //using namespace ::cgi; // **FIXME** this line must go.
using namespace ::cgi::common; // import common namespace elements.
} // namespace acgi
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/request.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/request.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/request.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,12 +9,11 @@
#ifndef CGI_ACGI_REQUEST_HPP_INCLUDED__
#define CGI_ACGI_REQUEST_HPP_INCLUDED__
+#include "boost/cgi/common/tags.hpp"
#include "boost/cgi/acgi/service.hpp"
#include "boost/cgi/acgi/request_impl.hpp"
#include "boost/cgi/acgi/request_service.hpp"
-#include "boost/cgi/tags.hpp"
-#include "boost/cgi/basic_request_fwd.hpp"
-#include "boost/cgi/acgi/request_impl.hpp"
+#include "boost/cgi/fwd/basic_request_fwd.hpp"
namespace cgi {
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/request_impl.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/request_impl.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/request_impl.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -11,8 +11,9 @@
#include "boost/cgi/acgi/service.hpp"
#include "boost/cgi/basic_client.hpp"
-#include "boost/cgi/detail/cgi_request_impl_base.hpp"
+#include "boost/cgi/common/status_type.hpp"
#include "boost/cgi/connections/async_stdio.hpp"
+#include "boost/cgi/detail/cgi_request_impl_base.hpp"
// Make this ProtocolService-independent
@@ -22,20 +23,19 @@
class acgi_service_impl;
class acgi_request_impl
- : public cgi_request_impl_base<common::async_stdio_connection>
+ : public detail::cgi_request_impl_base<common::async_stdio_connection>
{
public:
typedef acgi_service protocol_service_type;
typedef common::async_stdio_connection connection_type;
typedef
::cgi::common::basic_client<
- connection_type, tags::acgi
+ connection_type, common::tags::acgi
>
client_type;
- //typedef async_stdio_connection client_type;
acgi_request_impl()
- : cgi_request_impl_base<connection_type>()
+ : detail::cgi_request_impl_base<connection_type>()
{
}
@@ -48,3 +48,4 @@
} // namespace cgi
#endif // CGI_ASYNC_CGI_REQUEST_IMPL_HPP_INCLUDED__
+
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/request_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/request_service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/request_service.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,14 +9,14 @@
#ifndef CGI_ACGI_SERVICE_IMPL_HPP_INCLUDED__
#define CGI_ACGI_SERVICE_IMPL_HPP_INCLUDED__
+#include "boost/cgi/common/tags.hpp"
+#include "boost/cgi/common/map.hpp"
#include "boost/cgi/acgi/request_impl.hpp"
-#include "boost/cgi/tags.hpp"
-#include "boost/cgi/io_service.hpp"
-#include "boost/cgi/map.hpp"
-#include "boost/cgi/detail/cgi_service_impl_base.hpp"
+#include "boost/cgi/import/io_service.hpp"
#include "boost/cgi/detail/service_base.hpp"
#include "boost/cgi/detail/extract_params.hpp"
#include "boost/cgi/connections/async_stdio.hpp"
+#include "boost/cgi/detail/cgi_service_impl_base.hpp"
namespace cgi {
@@ -28,15 +28,13 @@
{
public:
typedef acgi_request_service type;
- typedef acgi_request_impl impl_type;
- typedef ::cgi::common::map map_type;
- typedef tags::acgi protocol_type;
+ typedef common::tags::acgi protocol_type;
typedef acgi_service protocol_service_type;
/// The unique service identifier
// static boost::asio::io_service::id id;
- acgi_request_service(::cgi::io_service& ios)
+ acgi_request_service(common::io_service& ios)
: detail::service_base<acgi_request_service>(ios)
{
}
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/acgi/service.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,10 +9,8 @@
#ifndef CGI_CGI_SERVICE_HPP_INCLUDED__
#define CGI_CGI_SERVICE_HPP_INCLUDED__
-#include "boost/cgi/tags.hpp"
-//#include "boost/cgi/gateway_impl/acgi_gateway_impl.hpp"
-//#include "boost/cgi/gateway_service/acgi_gateway_service.hpp"
-#include "boost/cgi/basic_protocol_service_fwd.hpp"
+#include "boost/cgi/common/tags.hpp"
+#include "boost/cgi/fwd/basic_protocol_service_fwd.hpp"
namespace cgi {
@@ -20,10 +18,10 @@
/**
* Works with both cgi_request and acgi_request.
*/
- typedef common::basic_protocol_service<tags::acgi> acgi_service;
+ typedef common::basic_protocol_service<common::tags::acgi> acgi_service;
namespace acgi {
- typedef common::basic_protocol_service<tags::acgi> service;
+ typedef common::basic_protocol_service<common::tags::acgi> service;
}
/// A service 'owned' by a single user-supplied io_service
@@ -46,6 +44,6 @@
} // namespace cgi
-#include "boost/cgi/basic_protocol_service.hpp"
+#include "boost/cgi/common/basic_protocol_service.hpp"
#endif // CGI_CGI_SERVICE_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_client.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_client.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_client.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -10,11 +10,11 @@
#define CGI_BASIC_CLIENT_HPP_INCLUDED__
#include <boost/shared_ptr.hpp>
-
-#include "boost/cgi/map.hpp"
-#include "boost/cgi/role_type.hpp"
-#include "boost/cgi/status_type.hpp"
+///////////////////////////////////////////////////////////
+#include "boost/cgi/common/map.hpp"
#include "boost/cgi/http/status_code.hpp"
+#include "boost/cgi/common/role_type.hpp"
+#include "boost/cgi/common/status_type.hpp"
#include "boost/cgi/connections/tcp_socket.hpp"
@@ -143,6 +143,8 @@
private:
//io_service& io_service_;
connection_ptr connection_;
+
+ public: // **FIXME**
// we should never read more than content-length bytes.
std::size_t bytes_left_;
};
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_client_fwd.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_client_fwd.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,22 +0,0 @@
-// -- 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__
-
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_connection_fwd.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_connection_fwd.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,21 +0,0 @@
-// -- basic_connection_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_CONNECTION_FWD_HPP_INCLUDED__
-#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__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_gateway.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_gateway.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,192 +0,0 @@
-// -- basic_gateway.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_GATEWAY_HPP_INCLUDED__
-#define CGI_BASIC_GATEWAY_HPP_INCLUDED__
-
-#include <boost/bind.hpp>
-#include <boost/shared_ptr.hpp>
-
-#include "basic_protocol_service_fwd.hpp"
-//#include "basic_connection.hpp"
-#include "detail/protocol_traits.hpp"
-
-namespace cgi {
-
- /// The gateway class manages connections
- /**
- * New connections are accepted through here, via a call to accept();
- * used/corrupted connections are closed via a call to stop(conn_ptr);
- * all connections are closed via a call to stop_all().
- *
- * If you want to use the gateway after a call to stop_all(), you must
- * call reset() and pass it the maximum number of connections the gateway
- * can take.
- */
- template<typename Protocol>
- class basic_gateway
- {
- public:
- //typedef CommonGatewayService service_type;
- //typedef typename CommonGatewayService::protocol_type protocol_type;
- typedef Protocol protocol_type;
- typedef basic_protocol_service<protocol_type> protocol_service_type;
-
- typedef detail::protocol_traits<protocol_type> traits;
- typedef typename traits::connection_type connection_type;
- typedef typename traits::gateway_impl_type impl_type;
- typedef typename traits::gateway_service_type service_type;
- typedef boost::shared_ptr<connection_type> conn_ptr;
-
- /// Constructors
- explicit basic_gateway(protocol_service_type& pservice)
- : service_(pservice)
- {
- service_.construct(impl_);
- }
-
- explicit basic_gateway()
- {
- service_.construct(impl_);
- }
-
- /// Destructor
- ~basic_gateway()
- {
- service_.destroy(impl_);
- }
-
- /// Start a sychronous accept
- /**
- * This returns false unless the connection is already established. This is
- * true with standard CGI, for example, where the connection is simply a
- * wrapper over standard input/output.
- *
- * If there is a need to differentiate between a fail and a 'waiting' accept
- * then a tribool could be returned from here.
- */
-/* ** NOT BELONGING HERE ** (should be encapsulated in the acceptor classes)
- template<typename Request>
- boost::system::error_code&
- accept(Request& request, boost::system::error_code& ec)
- {
- if( service_.accept(request.connection(), ec) )
- {
- connections_.insert(request.connection());
- }
-
- return ec;
-
- //conn_ptr new_conn(connection_type::create());
- //acceptor_.accept(new_conn->socket()
- // , boost::bind(&cgi::gateway::handle_accept
- // , this, new_conn
- // , boost::placeholders::error));
- //return false;
- }
-
- /// Start an asynchronous accept
- template<typename Handler>
- void async_accept(conn_ptr conn, Handler handler)
- {
- service_.async_accept(handler);
- }
-*/
- /// Cleanly start the connection
- void start(conn_ptr cptr)
- {
- service_.start(impl_, cptr);
- //cptr->start();
- //protocol_service_.connections_.insert(cptr);
- }
-
- /// Cleanly stop the connection
- void stop(conn_ptr cptr)
- {
- //service_.stop(impl_, cptr);
- //BOOST_ASSERT(protocol_service_.connections_.find(cptr));
-
- //cptr->stop();
- //protocol_service_.connections_.erase(cptr);
- }
-
- /// Cleanly stop all connections
- void stop()
- {
- service_.stop(impl_);
- //std::for_each(protocol_service_.connection_.begin()
- // , protocol_service_.connections_.end()
- // , boost::bind(&connection_type::stop, _1));
- //protocol_service_.connections_.clear();
- }
-
- /// Reset the gateway
- /**
- * All connections are gracefully closed and then the gateway is set up for
- * reuse.
- *
- * @param max_connections the available slots is reset to this value
- */
- void reset(int max_connections)
- {
- service_.reset(impl_);
- //stop();
- //available_slots_ = max_connections;
- }
-
- private:
- //protocol_service_type& protocol_service_;
- service_type service_;
- impl_type impl_;
- //std::set<conn_ptr> connections_;
- };
-
-
-
- //template<>
- //class gateway<cgi_service>
- //{
- //public:
- // gateway()
- // {
- // }
- //private:
- //
- //};
-
- /*
- template<>
- class gateway::acceptor<tags::fastcgi>
- {
- public:
- gateway::acceptor
- {
- }
- private:
- boost::asio::ip::tcp::acceptor<
- };
- */
-
-} // namespace cgi
-
-#endif // CGI_BASIC_GATEWAY_HPP_INCLUDED__
-
-/*
- * Notes:
- *
- * 1. A FastCGI server doesn't have to use tcp sockets: it can use pipes
- * instead. Support for these will only come in when Boost.Asio supports them.
- *
- * 2. For now each request object could hold a pointer/reference to the
- * connection that it's associated with. For the forseable future that's going
- * to be enough. However, since the FastCGI spec doesn't say otherwise,
- * eventually it could happen that the response can be sent back via ANY open
- * connection. In that case, the request would have to query the gateway to
- * find an available connection before sending through it. For now, that's
- * unneccesary.
- */
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_gateway_fwd.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_gateway_fwd.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,19 +0,0 @@
-// -- basic_gateway_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_GATEWAY_FWD_HPP_INCLUDED__
-#define CGI_BASIC_GATEWAY_FWD_HPP_INCLUDED__
-
-namespace cgi {
-
- template<typename>
- class basic_gateway;
-
-} // namespace cgi
-
-#endif // CGI_BASIC_GATEWAY_FWD_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_io_object.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_io_object.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,78 +0,0 @@
-// -- basic_io_object.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_IO_OBJECT_HPP_INCLUDED__
-#define CGI_BASIC_IO_OBJECT_HPP_INCLUDED__
-
-#include <boost/noncopyable.hpp>
-#include <boost/asio/io_service.hpp>
-
-namespace cgi {
-
- template<typename Service>
- class basic_io_object
- : private boost::noncopyable
- {
- public:
- typedef Service service_type;
-
- ::cgi::io_service&
- io_service()
- {
- return service.io_service();
- }
-
- private:
- typedef typename Service::implementation_type impl_type;
- typedef typename Service::implementation_type implementation_type;
-
- protected:
- explicit basic_io_object(::cgi::io_service& ios)
- : service(boost::asio::use_service<Service>(ios))
- {
- service.construct(implementation);
- }
-
- ~basic_io_object()
- {
- service.destroy(implementation);
- }
-
- implementation_type implementation;
- service_type& service;
- };
-
- /*
- template<>
- class basic_io_object< ::cgi::request>
- : private boost::noncopyable
- {
- public:
- typedef Service service_type;
- typedef typename Service::impl_type impl_type;
-
- protected:
- explicit basic_io_object()
- {
- service.construct(impl);
- }
-
- ~basic_io_object()
- {
- service.destroy(impl);
- }
-
- impl_type impl;
- service_type service;
- boost::asio::io_service io_service;
- };
- */
-
-} // namespace cgi
-
-#endif // CGI_BASIC_IO_OBJECT_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_protocol_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_protocol_service.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,152 +0,0 @@
-// -- basic_protocol_service.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_PROTOCOL_SERVICE_HPP_INCLUDED__
-#define CGI_BASIC_PROTOCOL_SERVICE_HPP_INCLUDED__
-
-#include <set>
-#include <queue>
-#include <boost/shared_ptr.hpp>
-#include <boost/asio/strand.hpp>
-#include <boost/detail/workaround.hpp>
-
-#include "boost/cgi/io_service.hpp"
-#include "boost/cgi/io_service_provider.hpp"
-#include "boost/cgi/basic_request_fwd.hpp"
-#include "boost/cgi/detail/protocol_traits.hpp"
-#include "boost/cgi/basic_protocol_service_fwd.hpp"
-
-namespace cgi {
- namespace common {
-
- /// Basic Protocol Service
- /**
- * Holds the request queue and the connection queue.
- * It is also a wrapper around asio::io_service
- */
- template<typename Protocol, typename IoServiceProvider>
- class basic_protocol_service
- //: public protocol_traits<Protocol> // do this!
- {
- public:
- typedef Protocol protocol_type;
- typedef IoServiceProvider ios_provider_type;
- typedef typename detail::protocol_traits<Protocol>::type traits;
- typedef typename traits::request_type request_type;
- typedef typename boost::shared_ptr<request_type> request_ptr;
- typedef std::set<request_ptr> set_type;
- //typename boost::mpl::if_<
- // boost::is_same<protocol_type, tags::acgi>::value
- // , request_type::pointer
- // , std::set<request_type::pointer>
- // >::type
-
- typedef std::queue<request_ptr> queue_type;
-
- basic_protocol_service(int pool_size_hint = 1)
- : ios_provider_(pool_size_hint)
- //, strand_(ios_provider_.io_service())
- //, gateway_(*this)
- {
- }
-
- basic_protocol_service(boost::asio::io_service& ios)
- : ios_provider_(ios)
- //, strand_(ios)
- //, gateway_(*this)
- {
- }
-
- ~basic_protocol_service()
- {
- //gateway_.stop();
- }
-
- /// Run all the io_services contained by this service
- /**
- * This is equivalent to calling run() on each of the io_services held by
- * ios_provider_
- */
- void run()
- {
- ios_provider_.run();
- }
-
- /// Stop all the io_services contained by this service
- /**
- * This is equivalent to calling stop() on each of the io_services held by
- * ios_provider_
- */
- void stop()
- {
- //gateway_.stop();
- ios_provider_.stop();
- }
-
- /// Reset all the io_services contained by this service
- /**
- * This deletes the request queue(s), aborts all running requests and then
- * calls reset() on each of the io_services held by ios_provider_. There is
- * no guarantee that requests will terminate immediately.
- */
- void reset()
- {
- request_queue_.clear();
- //std::for_each(request_set_.begin(), request_set_.end()
- // , boost::bind(&request_type::abort, boost::arg<1>()));
- request_set_.clear();
- ios_provider_.reset();
- }
-
- /// Return an available io_service from the IoServiceProvider
- /**
- * The order in which the underlying io_services are returned is determined
- * by what policy the IoServiceProvider uses.
- */
- ::cgi::io_service& io_service()
- {
- return ios_provider_.get_io_service();
- }
-
- /// Post the handler through an available io_service
- template<typename Handler>
- void post(Handler handler)
- {
- ios_provider_.get_io_service().post(handler);
- }
-
- /// Dispatch a handler through an available io_service
- template<typename Handler>
- void dispatch(Handler handler)
- {
- ios_provider_.get_io_service().dispatch(handler);
- }
-
- private:
- ios_provider_type ios_provider_;
-
- /// A strand is used for guaranteeing handlers are dispatched sequentially
- //boost::asio::strand strand_;
-
- /// A std::set of all the requests.
- set_type request_set_;
- /// A std::queue of the waiting (ie. not-being-handled) requests.
- queue_type request_queue_;
-
-#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400))
- friend typename traits::request_type;//typename request_type;
-#else
- friend class traits::request_type;
-#endif
- //friend class request_type;
- };
-
- } // namespace common
-} // namespace cgi
-
-#endif // CGI_BASIC_PROTOCOL_SERVICE_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_protocol_service_fwd.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_protocol_service_fwd.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,30 +0,0 @@
-// -- basic_protocol_service_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_PROTOCOL_SERVICE_FWD_HPP_INCLUDED__
-#define CGI_BASIC_PROTOCOL_SERVICE_FWD_HPP_INCLUDED__
-
-#if _MSC_VER > 1020
-#pragma once
-#endif
-
-#include "boost/cgi/io_service_provider.hpp"
-
-namespace cgi {
- namespace common {
-
- template<
- typename Protocol,
- typename IoServiceProvider = io_service_provider<>
- >
- class basic_protocol_service;
-
- } // namespace common
-} // namespace cgi
-
-#endif // CGI_BASIC_PROTOCOL_SERVICE_FWD_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -16,29 +16,28 @@
#include "boost/cgi/detail/push_options.hpp"
-#include <boost/noncopyable.hpp>
#include <boost/mpl/if.hpp>
#include <boost/assert.hpp>
-#include <boost/system/error_code.hpp>
#include <boost/shared_ptr.hpp>
+#include <boost/noncopyable.hpp>
#include <boost/asio/io_service.hpp>
+#include <boost/system/error_code.hpp>
#include <boost/asio/basic_io_object.hpp>
-
+///////////////////////////////////////////////////////////
+// **FIXME** Half of these are probably useless
+#include "boost/cgi/common/map.hpp"
+#include "boost/cgi/common/is_async.hpp"
+#include "boost/cgi/common/role_type.hpp"
+#include "boost/cgi/http/status_code.hpp"
#include "boost/cgi/detail/throw_error.hpp"
+#include "boost/cgi/common/status_type.hpp"
+#include "boost/cgi/common/source_enums.hpp"
+#include "boost/cgi/fwd/basic_request_fwd.hpp"
+#include "boost/cgi/common/request_service.hpp"
+#include "boost/cgi/import/basic_io_object.hpp"
#include "boost/cgi/detail/protocol_traits.hpp"
-#include "boost/cgi/request_base.hpp"
-#include "boost/cgi/role_type.hpp"
-#include "boost/cgi/data_source.hpp"
-#include "boost/cgi/status_type.hpp"
-#include "boost/cgi/is_async.hpp"
-#include "boost/cgi/connection_base.hpp"
-#include "boost/cgi/http/status_code.hpp"
-#include "boost/cgi/request_service.hpp"
-#include "boost/cgi/basic_protocol_service_fwd.hpp"
-#include "boost/cgi/basic_request_fwd.hpp"
-#include "boost/cgi/basic_sync_io_object.hpp"
-#include "boost/cgi/basic_io_object.hpp"
-#include "boost/cgi/map.hpp"
+#include "boost/cgi/detail/basic_sync_io_object.hpp"
+#include "boost/cgi/fwd/basic_protocol_service_fwd.hpp"
namespace cgi {
namespace common {
@@ -72,27 +71,29 @@
, role_type Role
, typename Allocator>
class basic_request
- : public request_base
- , public boost::mpl::if_c<is_async<typename RequestService::protocol_type>::value
- , basic_io_object<RequestService>
- , basic_sync_io_object<RequestService>
- >::type
+ : public boost::mpl::if_c<
+ is_async<typename RequestService::protocol_type>::type::value
+ , basic_io_object<RequestService>
+ , detail::basic_sync_io_object<RequestService>
+ >::type
{
public:
typedef basic_request<RequestService, ProtocolService
, Role, Allocator > type;
- typedef ::cgi::common::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;
typedef boost::shared_ptr<type> pointer;
typedef typename RequestService::implementation_type implementation_type;
+ typedef typename implementation_type::char_type char_type;
+ typedef typename implementation_type::string_type string_type;
typedef typename implementation_type::client_type client_type;
// Throws
basic_request(bool load_now = true, bool parse_post = true)
- : basic_sync_io_object<service_type>()
+ : detail::basic_sync_io_object<service_type>()
{
if (load_now) load(parse_post);//this->service.load(this->implementation, true, ec);
}
@@ -101,7 +102,7 @@
basic_request(boost::system::error_code& ec
, const bool load_now = true
, const bool parse_post = true)
- : basic_sync_io_object<service_type>()
+ : detail::basic_sync_io_object<service_type>()
{
if (load_now) load(ec, parse_post);//this->service.load(this->implementation, true, ec);
}
@@ -212,7 +213,7 @@
*
* @returns The value of program_status
*/
- int close(http::status_code http_status = http::ok
+ int close(common::http::status_code http_status = http::ok
, int program_status = 0)
{
//BOOST_ASSERT( request_status_ != status_type::ended );
@@ -222,7 +223,7 @@
, program_status);
}
- int close(http::status_code http_status
+ int close(common::http::status_code http_status
, int program_status
, boost::system::error_code& ec)
{
@@ -261,34 +262,6 @@
return this->service.client(this->implementation);
}
- /// Set the output for the request
- /**
- * Not Implemented Yet ******************
- *
- * Set the output sink as `stdout_`, `stderr_`, or `stdout_ | stderr_`
- */
- /*
- void set_output(cgi::sink dest = stdout_)
- {
- boost::system::error_code ec;
- this->service(this->implementation, dest, ec);
- detail::throw_error(ec);
- }
- */
-/*
- void read_some()
- {
- boost::system::error_code ec;
- this->service.read_some(this->implementationementation,ec);
- detail::throw_error(ec);
- }
-
- boost::system::error_code
- read_some(boost::system::error_code& ec)
- {
- return this->service.read_some(this->implementationementation, ec);
- }
-*/
template<typename MutableBufferSequence>
void read_some(const MutableBufferSequence& buf)
{
@@ -318,285 +291,75 @@
}
*/
- /// Get a `cgi::map&` corresponding to all of the GET variables
- map_type& GET()
+ /// Search through environment variables for the matching name
+ string_type var(string_type const& name, boost::system::error_code& ec)
{
- return this->service.GET(this->implementation);
+ return env_vars(this->implementation)[name.c_str()];
}
- /// Find the get meta-variable matching name
- /**
- * @throws `boost::system::system_error` if an error occurred. This may
- * fail with `cgi::error::request_aborted` if the request has been aborted
- * by the client.
- */
- std::string GET(const std::string& name)
+ string_type var(string_type const& name)
{
boost::system::error_code ec;
- std::string ret = this->service.GET(this->implementation, name, ec);
+ string_type ret (var(name, ec));
detail::throw_error(ec);
return ret;
}
- /// Find the get meta-variable matching name
- /**
- * @param ec Set such that `(!ec == false)` if an error occurred. This may
- * fail with `ec == cgi::error::request_aborted` if the request has been
- * aborted by the client.
- */
- std::string GET(const std::string& name, boost::system::error_code& ec)
- {
- return this->service.GET(this->implementation, name, ec);
- }
-
- /// Get a `cgi::map&` corresponding to all of the POST variables
- map_type& POST()
- {
- return this->service.POST(this->implementation);
- }
-
- /// Find the post meta-variable matching name
- /**
- * @param greedy This determines whether more data can be read to find
- * the variable. The default is true to cause least surprise in the common
- * case of having not parsed any of the POST data.
- *
- * @throws `boost::system::system_error` if an error occurred. This may
- * fail with `cgi::error::request_aborted` if the request has been aborted
- * by the client.
- */
- std::string POST(const std::string& name, bool greedy = true)
- {
- boost::system::error_code ec;
- std::string ret
- = this->service.POST(this->implementation, name, ec, greedy);
- detail::throw_error(ec);
- return ret;
- }
-
- /**
- * @param ec Set such that `(!ec == false)` if an error occurred. This may
- * fail with `ec == cgi::error::request_aborted` if the request has been
- * aborted by the client.
- */
- std::string POST(const std::string& name, boost::system::error_code& ec
- , bool greedy = true)
- {
- return this->service.POST(this->implementation, name, ec, greedy);
- }
-
- /// Get a `cgi::map&` corresponding to all of the form variables
- map_type& form(bool greedy = true)
- {
- boost::system::error_code ec;
- map_type& data = this->service.form(this->implementation, ec, greedy);
- detail::throw_error(ec);
- return data;
- }
-
- /// Find the form variable matching name
- /**
- * Depending on the request's request_method, either the GET or the POST
- * meta-variables are searched.
- *
- * @throws `boost::system::system_error` if an error occurred. This may
- * fail with `cgi::error::request_aborted` if the request has been aborted
- * by the client.
- */
- std::string form(const std::string& name, bool greedy = true)
- {
- boost::system::error_code ec;
- std::string ret = form(name, ec, greedy);
- detail::throw_error(ec);
- return ret;
- }
-
- /**
- * @param ec Set such that `(!ec == false)` if an error occurred. This may
- * fail with `ec == cgi::error::request_aborted` if the request has been
- * aborted by the client.
- */
- std::string form(const std::string& name, boost::system::error_code& ec
- , bool greedy = true)
- {
- std::string rm(request_method());
- if (rm == "GET")
- return this->service.GET(this->implementation, name, ec);
- else
- if (rm == "POST")
- return this->service.POST(this->implementation, name, ec, greedy);
- else
- return "";
- }
-
- /// Get a `cgi::map&` corresponding to all of the HTTP_COOKIE variables
- map_type& cookie()
- {
- return this->service.cookie(this->implementation);
- }
-
- /// Find the cookie meta-variable matching name
- /**
- * @throws `boost::system::system_error` if an error occurred. This may
- * fail with `cgi::error::request_aborted` if the request has been aborted
- * by the client.
- */
- std::string cookie(const std::string& name)
- {
- boost::system::error_code ec;
- std::string ret
- = this->service.cookie(this->implementation, name, ec);
- detail::throw_error(ec);
- return ret;
- }
-
- /// Find the cookie meta-variable matching name
- /**
- * @param ec Set such that `(!ec == false)` if an error occurred. This may
- * fail with `ec == cgi::error::request_aborted` if the request has been
- * aborted by the client.
- */
- std::string cookie(const std::string& name, boost::system::error_code& ec)
- {
- return this->service.cookie(this->implementation, name, ec);
- }
-
- /// Get a `cgi::map&` corresponding to all of the environment variables
- map_type& env()
- {
- return this->service.env(this->implementation);
- }
-
- /// Find the environment meta-variable matching name
- /**
- * @throws `boost::system::system_error` if an error occurred. This may
- * fail with `cgi::error::request_aborted` if the request has been aborted
- * by the client.
- */
- std::string env(const std::string& name)
- {
- boost::system::error_code ec;
- std::string ret = this->service.env(this->implementation, name, ec);
- detail::throw_error(ec);
- return ret;
- }
-
- /// Find the environment meta-variable matching name
- /**
- * @param ec Set such that `(!ec == false)` if an error occurred. This may
- * fail with `ec == cgi::error::request_aborted` if the request has been
- * aborted by the client.
- */
- std::string env(const std::string& name, boost::system::error_code& ec)
- {
- return this->service.env(this->implementation, name, ec);
- }
-
- /// Search through all meta vars for the meta-variable matching name
- /**
- * The policy w.r.t. POST data (ie. whether it should all
- * be read/parsed and included in this search or not) is
- * to be decided.
- *
- * Notes:
- * One option is to parse everything, making this option
- * very inefficient.
- * Another is to leave this function as a 'lazy' search:
- * it'll search with what it's got and no more. Then, also
- * provide a meta_var_all() function which is greedy; the
- * ugly/long name there to discourage use.
- */
- std::string var(const std::string& name, bool greedy = false)
- {
- boost::system::error_code ec;
- std::string ret = var(name, ec, greedy);
- return this->service.var(this->implementation, name, greedy);
- std::string request_method( env("REQUEST_METHOD") );
-
- std::string tmp;
-
- // If it's not a POST request search meta_get first (to save time)
- if (request_method.empty() || request_method == "GET")
- {
- tmp = GET(name);
- if (!tmp.empty())
- return tmp;
- }
-
- tmp = cookie(name);
- if (!tmp.empty())
- return tmp;
-
- tmp = env(name);
- if (!tmp.empty())
- return tmp;
-
- if (!request_method.empty() && request_method == "POST")
- {
- tmp = POST(name);
- if (!tmp.empty())
- return tmp;
- }
-
- tmp = GET(name);
- return tmp.empty() ? "" : tmp;
- }
-
// [helper-functions for the basic CGI 1.1 meta-variables.
- std::string auth_type()
- { return env("AUTH_TYPE"); }
+ string_type auth_type()
+ { return env_("AUTH_TYPE"); }
- std::string content_length()
- { return env("CONTENT_LENGTH"); }
+ string_type content_length()
+ { return env_("CONTENT_LENGTH"); }
- std::string content_type()
- { return env("CONTENT_TYPE"); }
+ string_type content_type()
+ { return env_("CONTENT_TYPE"); }
- std::string gateway_interface()
- { return env("GATEWAY_INTERFACE"); }
+ string_type gateway_interface()
+ { return env_("GATEWAY_INTERFACE"); }
- std::string path_info()
- { return env("PATH_INFO"); }
+ string_type path_info()
+ { return env_("PATH_INFO"); }
- std::string path_translated()
- { return env("PATH_TRANSLATED"); }
+ string_type path_translated()
+ { return env_("PATH_TRANSLATED"); }
- std::string query_string()
- { return env("QUERY_STRING"); }
+ string_type query_string()
+ { return env_("QUERY_STRING"); }
- std::string remote_addr()
- { return env("REMOTE_ADDR"); }
+ string_type remote_addr()
+ { return env_("REMOTE_ADDR"); }
- std::string remote_host()
- { return env("REMOTE_HOST"); }
+ string_type remote_host()
+ { return env_("REMOTE_HOST"); }
- std::string remote_ident()
- { return env("REMOTE_IDENT"); }
+ string_type remote_ident()
+ { return env_("REMOTE_IDENT"); }
- std::string remote_user()
- { return env("REMOTE_USER"); }
+ string_type remote_user()
+ { return env_("REMOTE_USER"); }
- std::string request_method()
- { return env("REQUEST_METHOD"); }
+ string_type request_method()
+ { return env_("REQUEST_METHOD"); }
- std::string script_name()
- { return env("SCRIPT_NAME"); }
+ string_type script_name()
+ { return env_("SCRIPT_NAME"); }
- std::string server_name()
- { return env("SERVER_NAME"); }
+ string_type server_name()
+ { return env_("SERVER_NAME"); }
- std::string server_port()
- { return env("SERVER_PORT"); }
+ string_type server_port()
+ { return env_("SERVER_PORT"); }
- std::string server_protocol()
- { return env("SERVER_PROTOCOL"); }
+ string_type server_protocol()
+ { return env_("SERVER_PROTOCOL"); }
- std::string server_software()
- { return env("SERVER_SOFTWARE"); }
+ string_type server_software()
+ { return env_("SERVER_SOFTWARE"); }
// -- end helper-functions]
/// Get the charset from the CONTENT_TYPE header
- std::string charset()
+ string_type charset()
{
// Not sure if regex is needlessly heavy-weight here.
boost::regex re(";[ ]?charset=([-\\w]+);");
@@ -620,43 +383,92 @@
return this->service.get_role(this->implementation);
}
- /// Get the strand associated with the request (if any)
- // Not sure if the strand concept should be kept separate or a member
- // function like basic_request<>::wrap() should be provided: in the case of
- // a synchronous request type the wrapping would still function as expected
- // and there would be no need for protocol-specific code in user programs.
- /* boost::asio::strand* strand()
+ void set_status(common::http::status_code const& status)
{
- return this->implementation.strand();
+ this->service.set_status(this->implementation, status);
}
- */
- /// Get the implementation type for the request
- //implementation_type* impl()
- //{
- // return &(this->implementation);
- //}
+ ////////////////////////////////////////////////////////////
+ // Note on operator[]
+ // ------------------
+ // It is overloaded on different enum types to allow
+ // compile-time (I hope) retrieval of different data
+ // maps.
+ //
- void set_status(http::status_code status)
+ // The first three overloads are for directly looking into the
+ // environment.
+ // eg.
+ // string_type& val = req["some name"];
+ env_map& operator[](string_type const& n)
{
- this->service.set_status(this->implementation, status);
+ return env_vars(this->implementation.vars_)[n.c_str()];
+ }
+
+ env_map& operator[](const char* n)
+ {
+ return env_vars(this->implementation.vars_)[n];
+ }
+
+ env_map& operator[](common::name const& n)
+ {
+ return env_vars(this->implementation.vars_)[n];
+ }
+
+ /// Get a `common::env_map&` of all the environment variables.
+ env_map& operator[](common::env_data_type const&)
+ {
+ return env_vars(this->implementation.vars_);
+ }
+
+ /// Get a `common::get_map&` of all the GET variables.
+ get_map& operator[](common::get_data_type const&)
+ {
+ return get_vars(this->implementation.vars_);
+ }
+
+ /// Get a `common::post_map&` of all the POST variables.
+ post_map& operator[](common::post_data_type const&)
+ {
+ return post_vars(this->implementation.vars_);
+ }
+
+ /// Get a `common::cookie_map&` of all the cookies.
+ cookie_map& operator[](common::cookie_data_type const&)
+ {
+ return cookie_vars(this->implementation.vars_);
+ }
+
+ /// Get a `common::form_map&` of either the GET or POST variables.
+ form_map& operator[](common::form_data_type const&)
+ {
+ if (request_method() == "GET")
+ return get_vars(this->implementation.vars_);
+ else
+ if (request_method() == "POST")
+ return post_vars(this->implementation.vars_);
+ else
+ return env_vars(this->implementation.vars_);
+ }
+ ////////////////////////////////////////////////////////////
+
+ /// The id of this request.
+ /**
+ * This is 1 for CGI/aCGI requests, but may be != 1 for FastCGI requests.
+ * Note that for FastCGI requests, the id's are assigned on a
+ * *per-connection* policy, so in one application you may have several
+ * requests with the same id.
+ */
+ int id()
+ {
+ return this->service.request_id(this->implementation);
}
- map_type& operator[](common::data_source source)
+ private:
+ // Internal shortcut for named env-var functions (eg. script_name() above).
+ string_type& env_(const char* name)
{
- switch(source)
- {
- case get_data: return this->implementation.get_vars_;
- case post_data: return this->implementation.post_vars_;
- case cookie_data: return this->implementation.cookie_vars_;
- case env_data: return this->implementation.env_vars_;
- case form_data:
- default:
- std::string rm( request_method() );
- if (rm == "GET") return this->implementation.get_vars_;
- else if (rm == "POST") return this->implementation.post_vars_;
- else return this->implementation.env_vars_;
- }
+ return env_vars(this->implementation.vars_)[name];
}
};
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request_acceptor.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request_acceptor.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request_acceptor.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -10,13 +10,13 @@
#define CGI_BASIC_REQUEST_ACCEPTOR_HPP_INCLUDED__
#include <boost/noncopyable.hpp>
+#include <boost/asio/ip/tcp.hpp>
#include <boost/system/error_code.hpp>
-
#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"
+#include "boost/cgi/common/basic_protocol_service.hpp"
namespace cgi {
namespace common {
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request_acceptor_fwd.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request_acceptor_fwd.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,19 +0,0 @@
-// -- basic_acceptor_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_ACCEPTOR_FWD_HPP_INCLUDED__
-#define CGI_BASIC_ACCEPTOR_FWD_HPP_INCLUDED__
-
-namespace cgi {
-
- template<typename>
- class basic_acceptor;
-
-} // namespace cgi
-
-#endif // CGI_BASIC_ACCEPTOR_FWD_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request_fwd.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_request_fwd.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,30 +0,0 @@
-// -- basic_request_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_REQUEST_FWD_HPP_INCLUDED__
-#define CGI_BASIC_REQUEST_FWD_HPP_INCLUDED__
-
-#include <memory>
-
-#include "request_service_fwd.hpp"
-#include "role_type.hpp"
-#include "basic_protocol_service_fwd.hpp"
-
-namespace cgi {
- namespace common {
-
- template<typename RequestService
- , typename ProtocolService
- , enum role_type Role = responder
- , typename Allocator = std::allocator<char> >
- class basic_request;
-
- } // namespace common
-} // namespace cgi
-
-#endif // CGI_BASIC_REQUEST_FWD_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_sync_io_object.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/basic_sync_io_object.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,44 +0,0 @@
-// -- basic_sync_io_object.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_SYNC_IO_OBJECT_HPP_INCLUDED__
-#define CGI_BASIC_SYNC_IO_OBJECT_HPP_INCLUDED__
-
-#include <boost/noncopyable.hpp>
-
-namespace cgi {
- namespace common {
-
- /// basic_io_object alternative when an io_service isn't used
- template<typename Service>
- class basic_sync_io_object
- : private boost::noncopyable
- {
- public:
- typedef Service service_type;
- typedef typename Service::implementation_type implementation_type;
-
- protected:
- explicit basic_sync_io_object()
- {
- service.construct(implementation);
- }
-
- ~basic_sync_io_object()
- {
- service.destroy(implementation);
- }
-
- service_type service;
- implementation_type implementation;
- };
-
- } // namespace common
-} // namespace cgi
-
-#endif // CGI_BASIC_SYNC_IO_OBJECT_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/buffer.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/buffer.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,25 +0,0 @@
-// -- buffer.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_BUFFER_HPP_INCLUDED__
-#define CGI_BUFFER_HPP_INCLUDED__
-
-#include <boost/asio/buffer.hpp>
-
-namespace cgi {
- namespace common {
-
- using boost::asio::buffer;
-
- } // namespace common
-
- using common::buffer;
-
-} // namespace cgi
-
-#endif // CGI_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/request.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/request.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/request.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -11,8 +11,8 @@
#include "service.hpp"
#include "request_service.hpp"
-#include "boost/cgi/tags.hpp"
-#include "boost/cgi/basic_request_fwd.hpp"
+#include "boost/cgi/common/tags.hpp"
+#include "boost/cgi/fwd/basic_request_fwd.hpp"
#include "boost/cgi/cgi/request_impl.hpp"
#include "boost/cgi/basic_request.hpp"
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/request_impl.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/request_impl.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/request_impl.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -11,15 +11,16 @@
#include <map>
#include <string>
-#include <boost/noncopyable.hpp>
+///////////////////////////////////////////////////////////
#include <boost/shared_ptr.hpp>
-
-#include "boost/cgi/http/status_code.hpp"
+#include <boost/noncopyable.hpp>
+///////////////////////////////////////////////////////////
+#include "boost/cgi/common/map.hpp"
#include "boost/cgi/basic_client.hpp"
+#include "boost/cgi/common/role_type.hpp"
+#include "boost/cgi/http/status_code.hpp"
#include "boost/cgi/connections/stdio.hpp"
-#include "boost/cgi/role_type.hpp"
-#include "boost/cgi/status_type.hpp"
-#include "boost/cgi/map.hpp"
+#include "boost/cgi/common/status_type.hpp"
#include "boost/cgi/detail/cgi_request_impl_base.hpp"
// Make this ProtocolService-independent
@@ -38,11 +39,12 @@
* restricted but if someone really wants to copy the data, then they can.
*/
class cgi_request_impl
- : public cgi_request_impl_base<common::stdio_connection>
+ : public detail::cgi_request_impl_base<common::stdio_connection>
{
public:
- //typedef stdio_connection client_type;
- typedef ::cgi::common::basic_client<common::stdio_connection, tags::cgi> client_type;
+ typedef common::basic_client<
+ common::stdio_connection, common::tags::cgi
+ > client_type;
/// Constructor
/**
@@ -51,52 +53,19 @@
*/
template<typename ProtocolService>
cgi_request_impl(ProtocolService& pserv)
- : cgi_request_impl_base<connection_type>(pserv)
+ : detail::cgi_request_impl_base<connection_type>(pserv)
{
}
cgi_request_impl()
- : cgi_request_impl_base<connection_type>()
+ : detail::cgi_request_impl_base<connection_type>()
{
}
protected:
- friend class cgi_service_impl;//<cgi_request_impl>;
+ friend class cgi_service_impl;
};
- //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_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/request_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/request_service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/request_service.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,14 +9,15 @@
#ifndef CGI_CGI_SERVICE_IMPL_HPP_INCLUDED__
#define CGI_CGI_SERVICE_IMPL_HPP_INCLUDED__
-#include <string>
#include <map>
+#include <string>
+///////////////////////////////////////////////////////////
#include <boost/system/error_code.hpp>
-
+///////////////////////////////////////////////////////////
#include "boost/cgi/cgi/request_impl.hpp"
-#include "boost/cgi/detail/cgi_service_impl_base.hpp"
-#include "boost/cgi/detail/extract_params.hpp"
#include "boost/cgi/connections/stdio.hpp"
+#include "boost/cgi/detail/extract_params.hpp"
+#include "boost/cgi/detail/cgi_service_impl_base.hpp"
namespace cgi {
@@ -26,11 +27,9 @@
class cgi_request_service
: public cgi_service_impl_base<cgi_request_impl>
{
- typedef ::cgi::common::map map_type;
public:
typedef cgi_request_impl impl_type;
- typedef tags::cgi protocol_type;
- //typedef cgi_service_impl_base<cgi_request_impl> base;
+ typedef common::tags::cgi protocol_type;
cgi_request_service()
: cgi_service_impl_base<cgi_request_impl>()
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/cgi/service.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,10 +9,10 @@
#ifndef CGI_CGI_SERVICE_HPP_INCLUDED__
#define CGI_CGI_SERVICE_HPP_INCLUDED__
-#include "boost/cgi/tags.hpp"
+#include "boost/cgi/common/tags.hpp"
#include "boost/cgi/connections/stdio.hpp"
#include "boost/cgi/connections/async_stdio.hpp"
-#include "boost/cgi/basic_protocol_service_fwd.hpp"
+#include "boost/cgi/fwd/basic_protocol_service_fwd.hpp"
namespace cgi {
@@ -20,7 +20,7 @@
/**
* Works with both cgi_request and acgi_request.
*/
- typedef common::basic_protocol_service<tags::acgi> cgi_service;
+ typedef common::basic_protocol_service<common::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/release/boost/cgi/common/form_parser.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/form_parser.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/form_parser.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -1,18 +1,29 @@
+// -- form_parser.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_DETAIL_FORM_PARSER_HPP_INCLUDED__
#define CGI_DETAIL_FORM_PARSER_HPP_INCLUDED__
#include "boost/cgi/detail/push_options.hpp"
+///////////////////////////////////////////////////////////
#include <set>
#include <vector>
#include <string>
+///////////////////////////////////////////////////////////
#include <boost/regex.hpp>
-#include <boost/asio/buffer.hpp>
-#include <boost/asio/error.hpp>
#include <boost/function.hpp>
-#include <boost/system/error_code.hpp>
+#include <boost/asio/error.hpp>
+#include <boost/asio/buffer.hpp>
+#include <boost/algorithm/string/find.hpp>
+///////////////////////////////////////////////////////////
+#include "boost/cgi/common/map.hpp"
#include "boost/cgi/common/form_part.hpp"
-#include "boost/cgi/basic_client.hpp"
namespace cgi {
namespace detail {
@@ -36,388 +47,55 @@
typedef RequestImplType implementation_type;
- implementation_type& impl_;
- std::size_t& bytes_left_;
- buffer_type::iterator pos_;
- bool& stdin_data_read_;
- std::size_t offset_;
-
- std::string boundary_marker;
- std::list<std::string> boundary_markers;
- std::vector<common::form_part> form_parts_;
-
- form_parser(implementation_type& impl)
- : impl_(impl)
- , bytes_left_(impl.characters_left_)
- , stdin_data_read_(impl.stdin_data_read_)
- , offset_(0)
- {
- }
- /*
- form_parser(std::size_t& cl, buffer_type& buf, map_type& m
- , unsigned int& client_bytes, bool& sp, bool& sdr
- , std::string ct, callback_type const & cb)
- : bytes_left_(cl)
- , buf_(buf)
- , map_(m)
- , client_bytes_left_(client_bytes)
- , stdin_parsed_flag_(sp)
- , stdin_data_read_(sdr)
- , offset_(0)
- , content_type_(ct)
- //, client_(c)
- , callback_(cb)
- {
-
- }
- */
+ form_parser(implementation_type& impl);
mutable_buffers_type prepare(std::size_t size)
{
- std::size_t bufsz(impl_.buf_.size());
- impl_.buf_.resize(bufsz + size);
- return boost::asio::buffer(&impl_.buf_[bufsz], size);
+ std::size_t bufsz(impl_.buffer_.size());
+ impl_.buffer_.resize(bufsz + size);
+ return boost::asio::buffer(&impl_.buffer_[bufsz], size);
}
std::string buffer_string()
{
- return std::string(impl_.buf_.begin() + offset_, impl_.buf_.end());
+ return std::string(impl_.buffer_.begin() + offset_, impl_.buffer_.end());
}
boost::system::error_code
- parse(boost::system::error_code& ec)
- {
- parse_boundary_marker(ec);
- //parse_one_form_part(impl, ec);
-
- move_to_start_of_first_part(ec);
-
- if (ec == boost::asio::error::eof) {
- return boost::system::error_code();
- }else
- if (ec)
- return ec;
-
- do {
- parse_form_part(ec);
- }while( !impl_.stdin_parsed_
- && impl_.client_.bytes_left() != 0
- );//&& ec != boost::asio::error::eof );
-
- return ec;
- }
+ parse(boost::system::error_code& ec);
boost::system::error_code
- parse_form_part(boost::system::error_code& ec)
- {
- if (!parse_form_part_meta_data(ec)
- && !parse_form_part_data(ec))
- return ec;
-
- return ec;
- }
+ parse_url_encoded_form(boost::system::error_code& ec);
boost::system::error_code
- parse_form_part_data(boost::system::error_code& ec)
- {
- std::string regex("^(.*?)" // the data
- "\\x0D\\x0A" // CR LF
- "--" "(");
- if (boundary_markers.size() > 1)
- {
- std::list<std::string>::iterator i(boundary_markers.begin());
- regex = regex + "(?:" + *i + ")";
- ++i;
- for(; i != boundary_markers.end(); ++i)
- {
- regex = regex + "|(?:" + *i + ")";
- }
- }
- else
- {
- regex += *boundary_markers.begin();
- }
-
- regex += ")(--)?[ ]*\\x0D\\x0A";
- boost::regex re(regex);
-
- typedef buffer_type::iterator buffer_iter;
-
- boost::match_results<buffer_iter> matches;
-
- std::size_t offset = offset_;
-
- //int runs = 0;
- buffer_iter begin(impl_.buf_.begin() + offset);
- buffer_iter end(impl_.buf_.end());
-
- for(;;)
- {
- if (!boost::regex_search(begin, end, matches, re
- , boost::match_default
- | boost::match_partial))
- {
- return boost::system::error_code(345, boost::system::system_category);
- }
- else
- {
- if (matches[1].matched)
- {
- form_parts_.back().buffer_
- // = boost::range_iterator<;
- = std::make_pair(matches[1].first, matches[1].second);
- impl_.post_vars_[form_parts_.back().name] = matches[1];
- offset_ = offset + matches[0].length();
- pos_ = matches[0].second;
-
- if (matches[3].matched)
- impl_.stdin_parsed_ = true;
- return ec;
- }
- else
- {
- std::size_t bytes_read = impl_.client_.read_some(prepare(64), ec);
-
- if (bytes_read == 0)
- {
- stdin_data_read_ = true;
- return ec;
- }
-
- begin = impl_.buf_.begin() + offset;
- end = impl_.buf_.end();
-
- if (ec)
- return ec;
- }
- }
- }
-
- return ec;
- }
+ parse_multipart_form(boost::system::error_code& ec);
boost::system::error_code
- parse_form_part_meta_data(boost::system::error_code& ec)
- {
- // 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
- ""
- "(?:"
- ";"
- "[ ]*" // 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" // followed by the end of the line
- ")?"
- "(\\x0D\\x0A)"); // followed by the 'header termination' line
-
- typedef buffer_type::iterator buffer_iter;
-
- boost::match_results<buffer_iter> matches;
-
- std::size_t offset = offset_;
- pos_ = impl_.buf_.begin();
- int runs = 0;
-
- std::size_t bytes_read = 0;
- for(;;)
- {
- 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))
- {
- impl_.stdin_parsed_ = true;
- return ec;
- }
- if (matches[0].matched)
- {
- common::form_part part;
- for ( unsigned int i = 1
- ; i < matches.size()
- && matches[i].matched
- && !matches[i].str().empty()
- ; i+=2)
- {
- if (matches[i].str() == "name")
- {
- part.name = matches[i+1];
- }
- else
- {
- part.meta_data_[matches[i]]
- = std::make_pair(matches[i+1].first, matches[i+1].second);
- }
- form_parts_.push_back(part);
- }
-
- if (matches[13].str() == "\r\n")
- {
- offset_ = offset + matches[0].length();
- offset += matches[0].length();
- pos_ = matches[0].second;
-
- return ec;
- }
- else
- {
- throw std::runtime_error("Invalid POST data (header wasn't terminated as expected)");
- }
-
- }else{
- bytes_read = impl_.client_.read_some(prepare(64), ec);
- if (ec)
- return ec;
- if (++runs > 40)
- {
- std::cerr<< "Done 40 runs; bailing out" << std::endl;
- break;
- }
- }
- }
-
- return ec;
- }
+ parse_form_part(boost::system::error_code& ec);
boost::system::error_code
- move_to_start_of_first_part(boost::system::error_code& ec)
- {
- boost::regex re("((?:.*)?" // optional leading characters
- //"(?:\\x0D\\x0A)|^" // start of line
- "[\\x0D\\x0A^]*?"
- "("
- "--" + boundary_markers.front() + // two dashes and our marker
- ")"
- "(--)?" // optional two dashes (not sure if this is allowed)
- " *\\x0D\\x0A)");
- // on the first marker.
-
- typedef buffer_type::iterator buffer_iter;
- //std::cerr<< "Regex := " << re << std::endl;
-
- boost::match_results<buffer_iter> matches;
-
- // get data into our buffer until we reach the first boundary marker.
- int runs = 0;
- std::size_t offset = 0;
- std::size_t bytes_read = 0;
- for(;;)
- {
- bytes_read = impl_.client_.read_some(prepare(32), ec);
- if (ec || (bytes_read == 0))
- return ec;
- buffer_iter begin(impl_.buf_.begin());// + offset);
- buffer_iter end(impl_.buf_.end());
- if (!boost::regex_search(begin, end //impl.buf_.begin(), impl.buf_.end()
- , matches, re, boost::match_default | boost::match_partial))
- {
- offset = impl_.buf_.size();
- continue;
- }
- else
- {
- if (matches[2].matched)
- {
- impl_.buf_.erase(impl_.buf_.begin(), matches[0].second);
- offset_ = 0;
- pos_ = impl_.buf_.begin();
- return ec;
- }
- else
- {
- if (++runs > 10)
- return ec;
- continue;
- }
- }
- }
- // skip that line and then erase the buffer
- return ec;
- }
+ parse_form_part_data(boost::system::error_code& ec);
boost::system::error_code
- parse_one_form_part(boost::system::error_code& ec)
- {
- // continuously read data while parsing it until one complete form part has
- // been read.
- // Note, this may mean recursing into embedded sub-parts if necessary, but
- // still only the first *complete* part/sub-part would be read.
- //boost::regex re("\r\n--" + boundary_marker + " +
-
- for(;;)
- {
- //if (impl.client_->read_some(impl.prepare(1024), ec))
- // return ec;
- //boost::asio::read_until(impl.client_-> impl.buffer_, boundary_marker, ec);
- break;
-
-
- }
+ parse_form_part_meta_data(boost::system::error_code& ec);
- return ec;
- }
+ boost::system::error_code
+ move_to_start_of_first_part(boost::system::error_code& ec);
/// Get the boundary marker from the CONTENT_TYPE header.
boost::system::error_code
- parse_boundary_marker(boost::system::error_code& ec)
- {
- // get the meta-data appended to the content_type
- std::string content_type_(impl_.env_vars_["CONTENT_TYPE"]);
- //BOOST_ASSERT(!content_type.empty());
-
- boost::regex re("; ?boundary=\"?([^\"\n\r]+)\"?");
- boost::smatch match_results;
- if (!boost::regex_search(content_type_, match_results, re))
- return boost::system::error_code(666, boost::system::system_category);
-
- boundary_marker = match_results[1].str();
- // New boundary markers are added to the front of the list.
- boundary_markers.push_front(match_results[1].str());
-
- return ec;
- }
+ parse_boundary_marker(boost::system::error_code& ec);
private:
- //std::set<std::string> boundary_markers_;
- //std::vector<common::form_part> form_parts_;
+ implementation_type& impl_;
+ std::size_t& bytes_left_;
+ buffer_type::iterator pos_;
+ //bool& stdin_data_read_;
+ std::size_t offset_;
- //buffer_type& buffer_;
+ std::string boundary_marker;
+ std::list<std::string> boundary_markers;
+ std::vector<common::form_part> form_parts_;
//callback_type callback_;
};
@@ -425,5 +103,9 @@
} // namespace detail
} // namespace cgi
+#ifndef BOOST_CGI_BUILD_LIB
+# include "boost/cgi/impl/form_parser.ipp"
+#endif
+
#endif // CGI_DETAIL_FORM_PARSER_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/form_part.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/form_part.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/common/form_part.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -37,7 +37,7 @@
pair_t buffer_;
std::string content_type; // must exist
- std::string name; // Has to exist?
+ std::string name; // must exist (?) **FIXME**
// 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
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/connection_base.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/connection_base.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,40 +0,0 @@
-// -- connection_base.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_CONNECTION_BASE_HPP_INCLUDED__
-#define CGI_CONNECTION_BASE_HPP_INCLUDED__
-
-namespace cgi {
-
- /// Abstract Base Class for all connection types
- class connection_base
- {
- public:
- virtual ~connection_base() {}
-
- // read functions
- //template<typename MutableBufferSequence>
- //virtual std::size_t read(MutableBufferSequence) = 0;
-
- //template<typename MutableBufferSequence, typename Handler>
- //virtual void async_read(MutableBufferSequence, Handler) = 0;
-
- // write functions
- //template<typename ConstBufferSequence>
- //virtual std::size_t write(ConstBufferSequence) = 0;
-
- //template<typename ConstBufferSequence, typename Handler>
- //virtual void async_write(ConstBufferSequence, Handler) = 0;
-
- protected:
- //~connection_base() { }
- };
-
-} // namespace cgi
-
-#endif // CGI_CONNECTION_BASE_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/async_stdio.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/async_stdio.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/async_stdio.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -13,10 +13,10 @@
#include <boost/shared_ptr.hpp>
#include <boost/system/error_code.hpp>
#include <boost/enable_shared_from_this.hpp>
-
+///////////////////////////////////////////////////////////
+#include "boost/cgi/common/tags.hpp"
#include "boost/cgi/connections/stdio.hpp"
-#include "boost/cgi/io_service.hpp"
-#include "boost/cgi/tags.hpp"
+#include "boost/cgi/import/io_service.hpp"
namespace cgi {
namespace common {
@@ -31,7 +31,7 @@
typedef basic_connection<tags::async_stdio> type;
typedef boost::shared_ptr<type> pointer;
- basic_connection(::cgi::io_service& ios)
+ basic_connection(common::io_service& ios)
: basic_connection<tags::stdio>()
, io_service_(ios)
{
@@ -47,7 +47,7 @@
is_open_ = false;
}
- static pointer create(::cgi::io_service& ios)
+ static pointer create(::cgi::common::io_service& ios)
{
return pointer(new basic_connection<tags::async_stdio>(ios));
}
@@ -119,7 +119,7 @@
}
private:
- ::cgi::io_service& io_service_;
+ ::cgi::common::io_service& io_service_;
};
typedef basic_connection<tags::async_stdio> async_stdio_connection;
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/shareable_tcp_socket.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/shareable_tcp_socket.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/shareable_tcp_socket.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -11,21 +11,20 @@
#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"
-#include "boost/cgi/io_service.hpp"
-#include "boost/cgi/connection_base.hpp"
+#include "boost/cgi/common/tags.hpp"
#include "boost/cgi/basic_connection.hpp"
+#include "boost/cgi/import/io_service.hpp"
#include "boost/cgi/detail/push_options.hpp"
+#include "boost/cgi/common/connection_base.hpp"
-//#include "boost/cgi/fcgi/client_fwd.hpp"
-//#include "boost/cgi/fcgi/request_fwd.hpp"
#include "boost/cgi/detail/protocol_traits.hpp"
namespace cgi {
@@ -63,8 +62,8 @@
/** End FastCGI stuff **/
// A wrapper to provide condition_type::pointer
- struct condition_type : public boost::condition
- { typedef boost::shared_ptr<boost::condition> pointer; };
+ struct condition_type : public boost::condition_variable
+ { typedef boost::shared_ptr<boost::condition_variable> pointer; };
basic_connection(io_service& ios)
: sock_(ios)
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/stdio.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/stdio.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/stdio.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -11,14 +11,14 @@
#include <cstdio>
#include <string>
+///////////////////////////////////////////////////////////
#include <boost/system/error_code.hpp>
#include <boost/asio.hpp>
-
-#include "boost/cgi/basic_connection_fwd.hpp"
-#include "boost/cgi/tags.hpp"
-#include "boost/cgi/connection_base.hpp"
+///////////////////////////////////////////////////////////
#include "boost/cgi/error.hpp"
-//#include "boost/cgi/io_service.hpp"
+#include "boost/cgi/common/tags.hpp"
+#include "boost/cgi/common/connection_base.hpp"
+#include "boost/cgi/fwd/basic_connection_fwd.hpp"
namespace cgi {
namespace common {
@@ -59,33 +59,7 @@
template<typename MutableBufferSequence>
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();
-
- //std::cerr<< "In stdio::read_some()" << std::endl
- // << "before = {" << std::endl
- // << std::string(boost::asio::buffer_cast<char *>(buf), boost::asio::buffer_size(buf)) << std::endl
- // << "}" << std::endl;
- /*
- std::cin.read(boost::asio::buffer_cast<char *>(buf)
- , boost::asio::buffer_size(buf));
- if (std::cin.fail() && !std::cin.eof())
- {
- ec = boost::system::error_code(654, boost::system::system_category);
- return 0;
- }
- */
- //std::cerr<< "before = {" << std::endl
- // << std::string(boost::asio::buffer_cast<char *>(buf), boost::asio::buffer_size(buf)) << std::endl
- // << "}" << std::endl;
-
+ {
if (std::fread(boost::asio::buffer_cast<void *>(buf)
, boost::asio::buffer_size(buf)
, 1, stdin))
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/tcp_socket.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/tcp_socket.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/connections/tcp_socket.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -11,11 +11,11 @@
#include <boost/shared_ptr.hpp>
#include <boost/asio/ip/tcp.hpp>
-
-#include "boost/cgi/tags.hpp"
-#include "boost/cgi/io_service.hpp"
-#include "boost/cgi/connection_base.hpp"
+///////////////////////////////////////////////////////////
+#include "boost/cgi/common/tags.hpp"
+#include "boost/cgi/common/connection_base.hpp"
#include "boost/cgi/basic_connection.hpp"
+#include "boost/cgi/import/io_service.hpp"
#include "boost/cgi/detail/push_options.hpp"
namespace cgi {
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/cookie.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/cookie.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,144 +0,0 @@
-// -- cookie.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_COOKIE_HPP_INCLUDED__
-#define CGI_COOKIE_HPP_INCLUDED__
-
-#include <string>
-#include <boost/system/error_code.hpp>
-#include <boost/tokenizer.hpp>
-
-namespace cgi {
-
- template<typename String> struct basic_cookie;
-
- // typedefs for common usage
- typedef basic_cookie<std::string> cookie;
- typedef basic_cookie<std::wstring> wcookie;
-
- /// A `basic_cookie<>` object that can be (out-) streamed
- /**
- * Either set the parameters in the constructor, or set them directly.
- * Note: If you want to set the parameters individually, remember that each
- * parameter must NOT have a trailing semi-colon!
- *
- * TODO
- * - Data should be URL-encoded, or maybe provide an overload for url_decode
- * that takes an HttpCookie?
- * - Add from_string() ?
- */
- template<typename String>
- struct basic_cookie
- {
- typedef String string_type;
-
- basic_cookie() {}
-
- /// Delete the cookie named `_name`.
- basic_cookie(const string_type& _name)
- : name(_name)
- , value()
- , expires("Fri, 05-Jun-1989 15:30:00 GMT")
- , path("/")
- , secure(false)
- , http_only(false)
- {
- }
-
- /// Create a cookie.
- basic_cookie(const string_type& _name, const string_type& _val
- , const string_type& _expires = ""
- , const string_type& _path = "/"
- , const string_type& _domain = ""
- , bool _secure = false
- , bool HttpOnly = false)
- : name(_name)
- , value(_val)
- , expires(_expires)
- , path(_path)
- , domain(_domain)
- , secure(_secure)
- , http_only(HttpOnly)
- {
- }
-
- string_type name;
- string_type value;
- string_type expires;
- string_type path;
- string_type domain;
- bool secure;
- bool http_only;
-
- /// Create a cookie from a const char*
- /**
- * Rules taken from: http://wp.netscape.com/newsref/std/cookie_spec.html
- *
- * Assumes:
- * - Parts of the cookie are delimited by '; '. ie. if there is no space,
- * or multiple spaces after the semi-colon, this function won't work...
- */
- /* Actually, I'm omitting these functions for now, just had a thought...
- static basic_cookie<string_type>
- from_string(const char* str, boost::system::error_code& ec)
- {
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep(";=");
- tokenizer tokens(str, sep);
- for (tokenizer::iterator iter = tokens.begin();
- iter != tokens.end(); ++iter)
- {
-
- }
- return ck;
- }
-
- static basic_cookie<string_type> from_string(const char* str)
- {
- boost::system::error_code ec;
- cookie ck = from_string(ec);
- detail::throw_error(ec);
- return ck;
- }
-
- static basic_cookie<string_type> from_string(std::string& str)
- {
- return from_string(str.c_str());
- }
-
- static basic_cookie<string_type>
- from_string(std::string& str, boost::system::error_code& ec)
- {
- return from_string(str.c_str(), ec);
- }
- */
-
- /// Make a string out of the cookie
- std::string to_string()
- {
- std::string str(name + "=" + value);
- if (!expires.empty()) str += ("; expires=" + expires);
- if (!path.empty() ) str += ("; path=" + path);
- if (!domain.empty() ) str += ("; domain=" + domain);
- if ( secure ) str += "; secure";
- if ( http_only ) str += "; HttpOnly";
- return str;
- }
- };
-
- template<typename OutStream, typename T>
- OutStream& operator<<(OutStream& os, basic_cookie<T>& ck)
- {
- os<< ck.to_string();
- return os;
- }
-
-} // namespace cgi
-
-#endif // CGI_COOKIE_HPP_INCLUDED__
-
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/data_sink.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/data_sink.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,27 +0,0 @@
-// -- data_sink.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_DATA_SINK_HPP_INCLUDED__
-#define CGI_DATA_SINK_HPP_INCLUDED__
-
-namespace cgi {
-
- enum sink
- { stdout_ = 0
- , stderr_ = 1
- };
-
- namespace data_sink {
-
- //struct stdout_ {};
- //struct stderr_ {};
-
- } // namespace data_sink
-} // namespace cgi
-
-#endif // CGI_DATA_SINK_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/data_source.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/data_source.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,30 +0,0 @@
-// -- data_source.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_DATA_SOURCE_HPP_INCLUDED__
-#define CGI_DATA_SOURCE_HPP_INCLUDED__
-
-namespace cgi {
-
- enum source
- { stdin_ };
-
- namespace common {
-
- enum data_source
- { get_data
- , post_data
- , cookie_data
- , env_data
- , form_data
- };
-
- } // namespace common
-} // namespace cgi
-
-#endif // CGI_DATA_SOURCE_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/cgi_request_impl_base.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/cgi_request_impl_base.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/cgi_request_impl_base.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -11,19 +11,20 @@
#include <map>
#include <string>
-#include <boost/noncopyable.hpp>
+///////////////////////////////////////////////////////////
#include <boost/shared_ptr.hpp>
-
+#include <boost/noncopyable.hpp>
+#include <boost/fusion/support.hpp>
+#include <boost/fusion/include/vector.hpp>
+///////////////////////////////////////////////////////////
+#include "boost/cgi/common/map.hpp"
+#include "boost/cgi/common/role_type.hpp"
#include "boost/cgi/http/status_code.hpp"
#include "boost/cgi/connections/stdio.hpp"
-#include "boost/cgi/role_type.hpp"
-#include "boost/cgi/status_type.hpp"
-#include "boost/cgi/map.hpp"
-//#include
-
-// Make this ProtocolService-independent
+#include "boost/cgi/common/status_type.hpp"
namespace cgi {
+ namespace detail {
//Forward declaration
template<typename T>
@@ -38,58 +39,50 @@
*/
template<typename Connection>
class cgi_request_impl_base
+
{
public:
- typedef ::cgi::common::map map_type;
- typedef Connection connection_type;
+ typedef ::cgi::common::map map_type;
+ typedef Connection connection_type;
typedef
- common::basic_client<Connection, tags::acgi> client_type;
- typedef typename connection_type::pointer conn_ptr;
+ common::basic_client<Connection, common::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)
+ , http_status_(common::http::ok)
+ , request_status_(common::unloaded)
{
}
- map_type& env_vars() { return env_vars_; }
- map_type& get_vars() { return get_vars_; }
- map_type& post_vars() { return post_vars_; }
- map_type& cookie_vars() { return cookie_vars_; }
-
- bool stdin_parsed() { return stdin_parsed_; }
- http::status_code& http_status() { return http_status_; }
- status_type& status() { return request_status_; }
+ bool stdin_parsed() { return stdin_parsed_; }
+ common::http::status_code& http_status() { return http_status_; }
+ common::status_type& status() { return request_status_; }
- conn_ptr& connection() { return connection_; }
- //std::string& null_str() { return null_str_; }
+ conn_ptr& connection() { return connection_; }
public:
//conn_ptr connection() { return connection_; }
//friend class cgi_service_impl_base<RequestImpl>;
- map_type env_vars_;
- map_type get_vars_;
- 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_;
+ common::http::status_code http_status_;
+ common::status_type request_status_;
conn_ptr connection_;
};
+ } // namespace detail
} // namespace cgi
#endif // CGI_CGI_REQUEST_IMPL_BASE_HPP_INCLUDED__
+
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/cgi_service_impl_base.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/cgi_service_impl_base.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/cgi_service_impl_base.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -1,3 +1,11 @@
+// -- detail/cgi_service_impl_base.hpp --
+//
+// Copyright (c) Darren Garvey 2007-2008.
+// 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_CGI_SERVICE_IMPL_BASE_HPP_INCLUDED__
#define CGI_CGI_SERVICE_IMPL_BASE_HPP_INCLUDED__
@@ -5,34 +13,31 @@
#include <string>
#include <cstdlib>
+///////////////////////////////////////////////////////////
#include <boost/assert.hpp>
#include <boost/regex.hpp>
#include <boost/tokenizer.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/system/error_code.hpp>
#include <boost/algorithm/string/find.hpp>
-
-#include "boost/cgi/map.hpp"
+///////////////////////////////////////////////////////////
+#include "boost/cgi/common/map.hpp"
#include "boost/cgi/basic_client.hpp"
-#include "boost/cgi/role_type.hpp"
-#include "boost/cgi/status_type.hpp"
-#include "boost/cgi/detail/extract_params.hpp"
-#include "boost/cgi/detail/save_environment.hpp"
+#include "boost/cgi/common/role_type.hpp"
#include "boost/cgi/common/form_part.hpp"
#include "boost/cgi/detail/throw_error.hpp"
-
+#include "boost/cgi/common/status_type.hpp"
#include "boost/cgi/common/form_parser.hpp"
+#include "boost/cgi/common/request_base.hpp"
+#include "boost/cgi/detail/extract_params.hpp"
+#include "boost/cgi/detail/save_environment.hpp"
namespace cgi {
-
- namespace detail {
-
-
- } // namespace detail
-
+// **FIXME** Wrong namespace (should be cgi::detail?).
template<typename RequestImplType>
class cgi_service_impl_base
+ : public common::request_base<cgi_service_impl_base<RequestImplType> >
{
public:
//typedef RequestImplType implementation_type;
@@ -49,11 +54,11 @@
struct implementation_type
: RequestImplType
+ , common::request_base<
+ cgi_service_impl_base<RequestImplType>
+ >::impl_base
{
- typedef boost::asio::const_buffers_1 const_buffers_type;
- typedef boost::asio::mutable_buffers_1 mutable_buffers_type;
typedef typename RequestImplType::client_type client_type;
- typedef std::vector<char> buffer_type;
typedef detail::form_parser<implementation_type> form_parser_type;
implementation_type()
@@ -66,12 +71,7 @@
// The number of characters left to read (ie. "content_length - bytes_read")
std::size_t characters_left_;
- buffer_type buf_;
-
- std::vector<common::form_part> form_parts_;
-
boost::scoped_ptr<form_parser_type> fp_;
-
};
/// Return if the request is still open
@@ -82,7 +82,7 @@
*/
bool is_open(implementation_type& impl)
{
- return impl.status() >= aborted;
+ return impl.status() >= common::aborted;
}
/// Return the connection associated with the request
@@ -92,9 +92,12 @@
return impl.client_;
}
- int close(implementation_type& impl, http::status_code& http_s, int status)
+ int request_id(implementation_type& impl) { return 1; }
+
+ int close(implementation_type& impl, common::http::status_code& http_s
+ , int status)
{
- impl.status() = closed;
+ impl.status() = common::closed;
impl.http_status() = http_s;
return status;
}
@@ -107,91 +110,28 @@
load(implementation_type& impl, bool parse_stdin
, boost::system::error_code& ec)
{
- detail::save_environment(impl.env_vars());
- const std::string& cl = var(impl.env_vars(), "CONTENT_LENGTH", ec);
+ detail::save_environment(env_vars(impl.vars_));
+ std::string const& cl = env_vars(impl.vars_)["CONTENT_LENGTH"];
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);
+ std::string const& request_method = env_vars(impl.vars_)["REQUEST_METHOD"];
if (request_method == "GET")
- parse_get_vars(impl, ec);
+ this->parse_get_vars(impl, ec);
else
if (request_method == "POST" && parse_stdin)
parse_post_vars(impl, ec);
if (ec) return ec;
- parse_cookie_vars(impl, ec);
- impl.status() = loaded;
+ this->parse_cookie_vars(impl, ec);
+ impl.status() = common::loaded;
//BOOST_ASSERT(impl.status() >= loaded);
return ec;
}
-
- std::string&
- var(map_type& meta_data, const std::string& name
- , boost::system::error_code& ec)
- {
- return meta_data[name];
- }
-
- std::string
- GET(implementation_type& impl, const std::string& name
- , boost::system::error_code& ec)
- {
- //BOOST_ASSERT(impl.status() >= loaded);
- return var(impl.get_vars(), name, ec);
- }
-
- map_type&
- GET(implementation_type& impl)
- {
- //BOOST_ASSERT(impl.status() >= loaded);
- return impl.get_vars();
- }
-
- /// Find the post meta-variable matching name
- /**
- * @param greedy This determines whether more data can be read to find
- * the variable. The default is true to cause least surprise in the common
- * case of having not parsed any of the POST data.
-
- -----------------------------------------------
- Should this return a pair of iterators instead?
- What about url_decoding?
- -----------------------------------------------
-
- */
- std::string
- POST(implementation_type& impl, const std::string& name
- , boost::system::error_code& ec, bool greedy = true)
- {
- //BOOST_ASSERT(impl.status() >= loaded);
- const std::string& val = var(impl.post_vars(), name, ec);
- if (val.empty() && greedy && !ec)
- {
-
- }
-
- return val;
- }
-
- map_type&
- POST(implementation_type& impl)
- {
- //BOOST_ASSERT(impl.status() >= loaded);
- return impl.post_vars();
- }
-
- // prefer this to the above
- map_type&
- POST(implementation_type& impl, boost::system::error_code& ec)
- {
- //BOOST_ASSERT(impl.status() >= loaded);
- return impl.post_vars();
- }
-
+/*
// TODO: use `greedy`
std::string
form(implementation_type& impl, const std::string& name
@@ -205,6 +145,7 @@
if (rm == "POST")
return POST(impl, name, ec);
else
+ // **FIXME** What about HEAD, PUT ???
return "***BOOST_CGI_ERROR_INVALID_REQUEST_METHOD***";
}
@@ -221,42 +162,7 @@
if (rm == "POST")
return POST(impl, ec);
}
-
- /// Find the cookie meta-variable matching name
- std::string
- cookie(implementation_type& impl, const std::string& name
- , boost::system::error_code& ec)
- {
- //BOOST_ASSERT(impl.status() >= loaded);
- return var(impl.cookie_vars(), name, ec);
- }
-
- map_type&
- cookie(implementation_type& impl)
- {
- //BOOST_ASSERT(impl.status() >= loaded);
- return impl.cookie_vars();
- }
-
-
- /// Find the environment meta-variable matching name
- std::string
- env(implementation_type& impl, const std::string& name
- , boost::system::error_code& ec)
- {
- //BOOST_ASSERT(impl.status() >= loaded);
- const char* c = ::getenv(name.c_str());
- return c ? c : std::string();
- }
-
- map_type&
- env(implementation_type& impl)
- {
- //BOOST_ASSERT(impl.status() >= loaded);
- return impl.env_vars();
- }
-
-
+*/
role_type
get_role(implementation_type& impl)
{
@@ -264,51 +170,11 @@
}
/// Set the http status (this does nothing for aCGI)
- void set_status(implementation_type& impl, http::status_code&)
+ void set_status(implementation_type& impl, common::http::status_code&)
{
}
protected:
- /// Read and parse the cgi GET meta variables
- template<typename RequestImpl>
- boost::system::error_code
- parse_get_vars(RequestImpl& impl, boost::system::error_code& ec)
- {
- // Make sure the request is in a pre-loaded state
- //BOOST_ASSERT (impl.status() <= unloaded);
-
- std::string& vars = impl.env_vars()["QUERY_STRING"];
- if (vars.empty())
- return ec;
-
- detail::extract_params(vars, impl.get_vars()
- , boost::char_separator<char>
- ("", "=&", boost::keep_empty_tokens)
- , ec);
-
- return ec;
- }
-
- /// Read and parse the HTTP_COOKIE meta variable
- template<typename RequestImpl>
- boost::system::error_code
- parse_cookie_vars(RequestImpl& impl, boost::system::error_code& ec)
- {
- // Make sure the request is in a pre-loaded state
- //BOOST_ASSERT (impl.status() <= unloaded);
-
- std::string& vars(impl.env_vars()["HTTP_COOKIE"]);
- if (vars.empty())
- return ec;
-
- detail::extract_params(vars, impl.cookie_vars()
- , boost::char_separator<char>
- ("", "=&", boost::keep_empty_tokens)
- , ec);
-
- return ec;
- }
-
/// Read and parse the cgi POST meta variables (greedily)
template<typename RequestImpl>
boost::system::error_code
@@ -317,95 +183,6 @@
// Make sure this function hasn't already been called
//BOOST_ASSERT (!impl.stdin_parsed());
- std::string content_type (var(impl.env_vars(), "CONTENT_TYPE", ec));
-
- BOOST_ASSERT(!content_type.empty());
-
- if (boost::algorithm::ifind_first(content_type,
- "application/x-www-form-urlencoded"))
- {
- detail::throw_error(
- parse_url_encoded_form(impl, ec)
- );
- }
- else
- {
- detail::throw_error(
- parse_multipart_form(impl, ec)
- );
- }
-
- return ec;
- }
-
- boost::system::error_code
- parse_url_encoded_form(implementation_type& impl
- , boost::system::error_code& ec)
- {
- std::string name;
- std::string str;
- map_type& post_map(impl.post_vars());
-
- char ch;
- char ch1;
- while( impl.characters_left_ )
- {
- ch = getchar();
- --impl.characters_left_;
-
- switch(ch)
- {
- case '%': // unencode a hex character sequence
- if (impl.characters_left_ >= 2)
- {
- ch = getchar();
- ch1 = getchar();
- if (std::isxdigit(ch) && std::isxdigit(ch1))
- {
- str.append(1, detail::hex_to_char(ch, ch1));
- }
- else // we don't have a hex sequence
- {
- str.append(1, '%').append(1, ch).append(1, ch1);
- }
- impl.characters_left_ -= 2;
- }
- else // There aren't enough characters to make a hex sequence
- {
- str.append(1, '%');
- --impl.characters_left_;
- }
- break;
- case '+':
- str.append(1, ' ');
- break;
- case ' ':
- continue;
- case '=': // the name is complete, now get the corresponding value
- name = str;
- str.clear();
- break;
- case '&': // we now have the name/value pair, so save it
- post_map[name] = str;
- str.clear();
- name.clear();
- break;
- default:
- str.append(1, ch);
- }
- }
- // save the last param (it won't have a trailing &)
- if( !name.empty() )
- post_map[name] = str;//.empty() ? "" : str;
-
-
- return ec;
- }
-
- /// Parse a multipart form.
- boost::system::error_code
- parse_multipart_form(implementation_type& impl, boost::system::error_code& ec)
- {
impl.fp_.reset
(
new typename implementation_type::form_parser_type
@@ -414,495 +191,6 @@
impl.fp_->parse(ec);
return ec;
}
- /*
- parse_boundary_marker(impl, ec);
- //parse_one_form_part(impl, ec);
- move_to_start_of_first_part(impl, ec);
- if (ec == boost::asio::error::eof) {
- //cerr<< " -- Parsing done -- " << endl;
- //return ec.clear();
- return boost::system::error_code();
- }
-
- 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);
- return ec;
- }
-
- boost::system::error_code
- parse_form_part(implementation_type& impl, boost::system::error_code& ec)
- {
- if (!parse_form_part_meta_data(impl, ec)
- && !parse_form_part_data(impl, ec))
- return ec;
-
- return ec;
- }
-
- boost::system::error_code
- parse_form_part_data(implementation_type& impl, boost::system::error_code& ec)
- {
- std::string regex("^(.*?)" // the data
- "\\x0D\\x0A" // CR LF
- "--" "(");
- if (impl.boundary_markers.size() > 1)
- {
- std::list<std::string>::iterator i(impl.boundary_markers.begin());
- regex = regex + "(?:" + *i + ")";
- ++i;
- for(; i != impl.boundary_markers.end(); ++i)
- {
- regex = regex + "|(?:" + *i + ")";
- }
- }
- else
- {
- regex += *impl.boundary_markers.begin();
- }
-
- regex += ")(--)?[ ]*\\x0D\\x0A";
- //cerr<< "Regex: " << regex << endl;
- boost::regex re(regex);
-
- typedef typename
- implementation_type::buffer_type::iterator
- buffer_iter;
-
- boost::match_results<buffer_iter> matches;
-
- std::size_t offset = impl.offset_;
- //cerr<< "offset = " << offset << endl;
-
- //int runs = 0;
- buffer_iter begin(impl.buf_.begin() + offset);
- buffer_iter end(impl.buf_.end());
-
- for(;;)
- {
- //cerr<< "Starting regex_search" << endl;
- if (!boost::regex_search(begin, end, matches, re
- , boost::match_default
- | boost::match_partial))
- {
- // cerr<< "Can't match any of this. {" << endl
- // << std::string(begin, end) << endl
- // << "}" << endl;
- return boost::system::error_code(345, boost::system::system_category);
- }
- else
- {
- for (unsigned int i = 0; i < matches.size(); ++i)
- {
- if (matches[i].length())
- {
- // cerr<< "[" << i << "] == {" << endl
- // << matches[i] << endl
- // << "}" << endl;
- }
- }
- // cerr<< "matches[0] = {" << endl
- // << matches[0].str() << endl
- // << "}" << endl;
- if (matches[1].matched)
- {
- impl.form_parts_.back().buffer_
- // = boost::range_iterator<;
- = std::make_pair(matches[1].first, matches[1].second);
- // cerr<< "Saved buffer (size: "
- // << std::distance(matches[1].first, matches[1].second)
- // << ") := { " << 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(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
- // << std::string(begin, end) << endl
- // << "}" << endl;
-
- if (ec)
- {
- //cerr<< "Error in parse_form_part_data()." << endl;
- return ec;
- }
-
- }
- }
-
- }
-
-
- return ec;
- }
-
- boost::system::error_code
- parse_form_part_meta_data(implementation_type& impl, boost::system::error_code& ec)
- {
- // 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
- ""
- "(?:"
- ";"
- "[ ]*" // 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" // followed by the end of the line
- ")?"
- "(\\x0D\\x0A)"); // followed by the 'header termination' line
-
- typedef typename
- implementation_type::buffer_type::iterator
- buffer_iter;
-
- boost::match_results<
- typename
- implementation_type::buffer_type::iterator
- > matches;
-
- std::size_t offset = impl.offset_;
- //cerr.flush();
- impl.pos_ = impl.buf_.begin();
- int runs = 0;
- //cerr<< "Entering for() loop." << endl;
- std::size_t bytes_read = 0;
- for(;;)
- {
- 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
- // << matches.size() << " submatches" << endl;
- // for (unsigned i = matches.size(); i != 0; --i)
- // {
- //cerr<< "match[" << i << "] := { " << matches[i] << " }" << endl;
- //}
- if (matches[0].matched)
- {
- common::form_part part;
- for ( unsigned int i = 1
- ; i < matches.size()
- && matches[i].matched
- && !matches[i].str().empty()
- ; i+=2)
- {
- if (matches[i].str() == "name")
- {
- part.name = matches[i+1];
- // cerr<< "Saved name" << 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);
-
-
- }
-
- 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(64), ec);
- if (ec)
- {
- // cerr<< "Error reading data: " << ec.message() << endl;
- // cerr<< "Leaving parse_form_part_meta_data()" << endl;
- return ec;
- }
- // cerr<< "Read " << bytes_read << " bytes." << endl;
- //cerr<< "buffer = {" << endl
- // << impl.buffer_string() << endl
- // << "} or {" << endl;
- //<< std::string(impl.pos_, ;
- / *
- for (unsigned int i = 0; i < matches.size(); ++i)
- {
- if (matches[i].length())
- {
- cerr<< "[" << i << "] == {" << endl
- << matches[i] << endl
- << "}" << endl;
- }
- }
- cerr<< "-------buf------" << endl
- << std::string(begin, end) << endl
- << "----------------" << endl;
- * /
- //offset = impl.buf_.end();
- if (++runs > 40)
- {
- // cerr<< "Run 40 times; bailing out." << endl;
- break;
- }
- // cerr<< "Waiting buffer (unparsed) == {" << endl << std::flush
- // << impl.buffer_string() << endl
- // << "}" << endl
- // << "offset = " << offset << endl;
- //if (bytes_read == 0)
- // break;
- }
- }
-
- //cerr<< "impl.part
-
- // cerr<< "Leaving parse_form_part_meta_data()" << endl;
- return ec;
- }
-
- boost::system::error_code
- move_to_start_of_first_part(implementation_type& impl, boost::system::error_code& ec)
- {
- //cerr<< "Marker = " << impl.boundary_markers.front() << endl
- // << "blah" << "--" + impl.boundary_markers.front() + ")" << endl;
- boost::regex re("((?:.*)?" // optional leading characters
- //"(?:\\x0D\\x0A)|^" // start of line
- "[\\x0D\\x0A^]*?"
- "("
- "--" + impl.boundary_markers.front() + // two dashes and our marker
- ")"
- "(--)?" // optional two dashes (not sure if this is allowed)
- " *\\x0D\\x0A)");
- // on the first marker.
-
- typedef typename
- implementation_type::buffer_type::iterator
- buffer_iter;
-
- boost::match_results<
- typename
- implementation_type::buffer_type::iterator
- > matches;
- //cerr<< "Boundary marker == {" << endl
- // << impl.boundary_marker << endl
- // << "}" << endl;
-
- // get data into our buffer until we reach the first boundary marker.
- int runs = 0;
- std::size_t offset = 0;
-// std::size_t bytes_read = impl.client_.read_some(impl.prepare(32), ec);
-// if (ec || (bytes_read == 0))
-// return ec;
- std::size_t bytes_read = 0;
- for(;;)
- {
- bytes_read = impl.client_.read_some(impl.prepare(32), ec);
- if (ec || (bytes_read == 0))
- return ec;
- buffer_iter begin(impl.buf_.begin());// + offset);
- buffer_iter end(impl.buf_.end());
- if (!boost::regex_search(begin, end //impl.buf_.begin(), impl.buf_.end()
- , matches, re, boost::match_default | boost::match_partial))
- {
- // No chance of matching input with expected, so erase it and start again.
- //std::cerr<< " == buffer = " << std::string(impl.buf_.begin(), impl.buf_.end())
- // << " == capacity = " << impl.buf_.capacity() << " ======= ";
- //impl.buf_.clear();
- // cerr<< "No chance of matching." << endl;
- offset = impl.buf_.size();
- //std::cerr<< "Buffer cleared." << endl;
- continue;
- }
- else
- {
- //std::cerr<< "regex_search == true" << std::endl
- // << "matches[0] =={{ " << matches[0] << " }}=== " << std::endl
- // << "matches[1] =={{ " << matches[1] << " }}=== " << std::endl
- // << "matches[2] =={{ " << matches[2] << " }}=== " << std::endl;
- if (matches[2].matched){
- // cerr<< "Found boundary marker... OK!!" << endl;
- //cerr<< "[0] = " << matches[0].str() << endl;
- //cerr<< "[1] = " << matches[1].str() << endl;
- //impl.offset_ = matches[1].length();
- //impl.pos_ = matches[0].second;
- //cerr<< "setting pos_ to < " << std::string(impl.pos_, impl.pos_ + 5) << "... >" << endl
- // << "setting offset_ = " << impl.offset_ << endl;
- // << std::string(matches[1].first, matches[1].second) << endl;
- //impl.pos_ = matches[1].second;
- //cerr<< "deleting {" << endl
- // << std::string(impl.buf_.begin(), matches[0].second) << endl
- // << "} leaving {" << endl
- // << std::string(matches[0].second, impl.buf_.end()) << endl
- // << "}" << endl;
- //cerr<< "bufsize = " << impl.buf_.size() << endl;
- //cerr<< "bufsize = " << impl.buf_.size() << endl;
- // cerr<< "buffer now (before erase) == {" << endl
- // << std::string(impl.buf_.begin(), impl.buf_.end()) << endl
- // << "}" << endl;
- impl.buf_.erase(impl.buf_.begin(), matches[0].second);
- impl.offset_ = 0;
- impl.pos_ = impl.buf_.begin();
- return ec;
- } else {
- // cerr<< "not read enough data" << std::endl;
- //std::cerr<< "; bytes_read = " << bytes_read
- // << "; bufsize = " << impl.buf_.size()
- // << "; capacity = " << impl.buf_.capacity() << std::flush
- // << "; data = {{" << std::string(impl.buf_.begin(), impl.buf_.end()) << "}}";
-
- if (++runs > 10)
- return ec;
- continue;
- }
- }
- }
-
-
- // skip that line and then erase the buffer
- return ec;
- }
-
- boost::system::error_code
- parse_one_form_part(implementation_type& impl, boost::system::error_code& ec)
- {
- // continuously read data while parsing it until one complete form part has
- // been read.
- // Note, this may mean recursing into embedded sub-parts if necessary, but
- // still only the first *complete* part/sub-part would be read.
- //boost::regex re("\r\n--" + impl.boundary_marker + " +
-
- for(;;)
- {
- //if (impl.client_.read_some(impl.prepare(1024), ec))
- // return ec;
- //boost::asio::read_until(impl.client_, impl.buffer_, impl.boundary_marker, ec);
- break;
-
-
- }
-
- return ec;
- }
-
- /// Get the boundary marker from the CONTENT_TYPE header.
- boost::system::error_code
- parse_boundary_marker(implementation_type& impl, boost::system::error_code& ec)
- {
- // get the meta-data appended to the content_type
- std::string content_type(var(impl.env_vars(), "CONTENT_TYPE", ec));
- //BOOST_ASSERT(!content_type.empty());
-
- //boost::algorithm::ifind(var(impl, "CONTENT_TYPE"), "bounday="
-
- boost::regex re("; ?boundary=\"?([^\"\n\r]+)\"?");
- boost::smatch match_results;
- if (!boost::regex_search(content_type, match_results, re))
- return boost::system::error_code(666, boost::system::system_category);
-
- impl.boundary_marker = match_results[1].str();
- // New boundary markers are added to the front of the list.
- impl.boundary_markers.push_front(match_results[1].str());
-
- / *
- cerr<< "full = " << content_type << endl
- << "full search string = " << match_results[0] << endl
- << "marker length = " << match_results[1].length() << endl
- << "marker = " << impl.boundary_marker << endl
- << "_[2] = " << match_results[2] << endl;
- * /
-
- return ec;
- }
-*/
- /// Read and parse a single cgi POST meta variable (greedily)
- template<typename RequestImpl>
- boost::system::error_code
- parse_one_post_var(RequestImpl& impl, boost::system::error_code& ec)
- {
- //# error "Not implemented"
- return ec;
- }
};
} // namespace cgi
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/common_headers.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/common_headers.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/common_headers.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -12,17 +12,17 @@
// #include all protocol-independent headers only. Protocol-specific
// headers can just include this after other headers.
-#include "boost/cgi/buffer.hpp"
-#include "boost/cgi/map.hpp"
-#include "boost/cgi/io_service.hpp"
-#include "boost/cgi/streambuf.hpp"
-#include "boost/cgi/basic_request.hpp"
-//#include "boost/cgi/basic_request_acceptor.hpp"
-#include "boost/cgi/response.hpp"
//#include "boost/cgi/logger.hpp"
-#include "boost/cgi/read.hpp"
-#include "boost/cgi/write.hpp"
-#include "boost/cgi/header.hpp"
-#include "boost/cgi/return.hpp"
+#include "boost/cgi/common/map.hpp"
+#include "boost/cgi/import/read.hpp"
+#include "boost/cgi/import/write.hpp"
+#include "boost/cgi/basic_request.hpp"
+#include "boost/cgi/import/buffer.hpp"
+#include "boost/cgi/common/header.hpp"
+#include "boost/cgi/common/return.hpp"
+#include "boost/cgi/common/response.hpp"
+#include "boost/cgi/import/streambuf.hpp"
+#include "boost/cgi/http/status_code.hpp"
+#include "boost/cgi/import/io_service.hpp"
#endif // CGI_CGI_CGI_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/extract_params.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/extract_params.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/extract_params.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -13,7 +13,7 @@
#include <boost/tokenizer.hpp>
#include <boost/system/error_code.hpp>
-#include "url_decode.hpp"
+#include "boost/cgi/detail/url_decode.hpp"
namespace cgi {
namespace detail {
@@ -47,9 +47,9 @@
name = current_token;
current_token.clear();
}else
- if( *iter == "&" )
+ if( *iter == "&" || *iter == ";" )
{
- destination[name] = current_token;
+ destination[name.c_str()] = current_token;
current_token.clear();
name.clear();
}else
@@ -58,7 +58,7 @@
}
}
if( !name.empty() )
- destination[name] = current_token;
+ destination[name.c_str()] = current_token;
return ec;
}
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/protocol_traits.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/protocol_traits.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/protocol_traits.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -17,10 +17,11 @@
#define CGI_REQUEST_TRAITS_HPP_INCLUDED__
#include <boost/shared_ptr.hpp>
-#include "boost/cgi/tags.hpp"
-#include "boost/cgi/basic_request_fwd.hpp"
-#include "boost/cgi/basic_connection_fwd.hpp"
-#include "boost/cgi/basic_protocol_service_fwd.hpp"
+///////////////////////////////////////////////////////////
+#include "boost/cgi/fwd/basic_protocol_service_fwd.hpp"
+#include "boost/cgi/common/tags.hpp"
+#include "boost/cgi/fwd/basic_request_fwd.hpp"
+#include "boost/cgi/fwd/basic_connection_fwd.hpp"
namespace cgi {
@@ -78,6 +79,8 @@
namespace detail {
+ namespace tags = ::cgi::common::tags;
+
template<typename Protocol>
struct protocol_traits
{
@@ -89,12 +92,15 @@
typedef protocol_traits<tags::cgi> type;
typedef cgi_request_impl impl_type;
typedef cgi_request_service request_service_impl;
- typedef common::basic_protocol_service<tags::cgi> protocol_service_type;
+ typedef common::basic_protocol_service<
+ tags::cgi
+ > protocol_service_type;
typedef common::basic_request<
- request_service_impl, protocol_service_type
- > request_type;
+ request_service_impl
+ , protocol_service_type
+ > request_type;
typedef cgi_service_impl service_impl_type;
- typedef common::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 +111,17 @@
typedef protocol_traits<tags::async_cgi> type;
typedef async_cgi_request_impl impl_type;
typedef acgi_request_service request_service_impl;
- typedef common::basic_protocol_service<tags::acgi> protocol_service_type;
+ typedef common::basic_protocol_service<
+ tags::acgi
+ > protocol_service_type;
typedef common::basic_request<
- request_service_impl, protocol_service_type
- > request_type;
+ request_service_impl
+ , protocol_service_type
+ > request_type;
typedef async_cgi_service_impl service_impl_type;
- typedef common::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 +133,17 @@
typedef protocol_traits<tags::acgi> type;
typedef acgi_request_impl impl_type;
typedef acgi_request_service request_service_impl;
- typedef common::basic_protocol_service<tags::acgi> protocol_service_type;
+ typedef common::basic_protocol_service<
+ tags::acgi
+ > protocol_service_type;
typedef common::basic_request<
- request_service_impl, protocol_service_type
- > request_type;
+ request_service_impl
+ , protocol_service_type
+ > request_type;
typedef acgi_service_impl service_impl_type;
- typedef common::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,18 +154,21 @@
typedef protocol_traits<tags::fcgi> type;
typedef fcgi::fcgi_request_impl impl_type;
typedef fcgi::fcgi_request_service request_service_impl;
- typedef common::basic_protocol_service<fcgi_> protocol_service_type;
+ typedef common::basic_protocol_service<
+ common::fcgi_
+ > protocol_service_type;
typedef common::basic_request<
- request_service_impl, protocol_service_type
- > request_type;
+ request_service_impl
+ , protocol_service_type
+ > request_type;
typedef boost::shared_ptr<request_type> request_ptr;
//typedef fcgi_request_service
// ::implementation_type request_impl_type;
typedef fcgi::fcgi_service_impl service_impl_type;
typedef fcgi::fcgi_acceptor_service acceptor_service_impl;
typedef common::basic_connection<
- tags::shareable_tcp_socket
- > connection_type;
+ tags::shareable_tcp_socket
+ > connection_type;
//typedef fcgi_gateway_impl gateway_impl_type;
//typedef fcgi_gateway_service gateway_service_type;
};
@@ -171,14 +190,16 @@
//typedef scgi_gateway_service gateway_service_type;
};
+ // **FIXME** (remove)
template<>
- struct protocol_traits< ::cgi::scgi_>
+ struct protocol_traits< ::cgi::common::scgi_>
: protocol_traits<tags::scgi>
{
};
+ // **FIXME** (remove)
template<>
- struct protocol_traits< ::cgi::fcgi_>
+ struct protocol_traits< ::cgi::common::fcgi_>
: protocol_traits<tags::fcgi>
{
};
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/push_options.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/push_options.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/push_options.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -14,3 +14,12 @@
//#pragma warning (disable:4996)
//#endif
+
+#if !defined(BOOST_CGI_INLINE)
+# if defined(BOOST_CGI_BUILD_LIB)
+# define BOOST_CGI_INLINE
+# else
+# define BOOST_CGI_INLINE inline
+# endif
+#endif
+
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/save_environment.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/save_environment.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/save_environment.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -12,7 +12,7 @@
#include <map>
#include <string>
#include <cstdlib>
-#include "boost/cgi/map.hpp"
+#include "boost/cgi/common/map.hpp"
// The process' environment
#if BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1500))
@@ -34,6 +34,9 @@
template<typename MapT>
void save_environment(MapT& env_map, char** env = environ)
{
+ std::string sa;
+ std::string sb;
+
for(; *env; ++env)
{
int i=0;
@@ -46,9 +49,9 @@
// we are free to ignore them too.
if ((*env)[i+1] != '\0')
{
- std::string sa(*env, i);
- std::string sb((*env+i+1), j-i-1);
- env_map[sa] = sb;
+ sa.assign(*env, i);
+ sb.assign((*env+i+1), j-i-1);
+ env_map[sa.c_str()] = sb;
}
}
}
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/url_decode.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/url_decode.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/detail/url_decode.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,96 +9,31 @@
#ifndef CGI_DETAIL_URL_DECODE_HPP_INCLUDED__
#define CGI_DETAIL_URL_DECODE_HPP_INCLUDED__
+#include "boost/cgi/detail/push_options.hpp"
+
#include <string>
namespace cgi {
namespace detail {
/// Convert a char into a hexadecimal value
- std::string char_to_hex(char const& ch)
- {
- return std::string();
- }
+ BOOST_CGI_INLINE std::string char_to_hex(char const& ch);
/// Convert two characters into a single, hex-encoded character
- char hex_to_char(char const& c1, char const& c2)
- {
- int ret ( ( std::isalpha(c1)
- ? ((c1 & 0xdf) - 'A') + 10
- : (c1 - '0')
- ) << 4
- );
-
- ret += ( std::isalpha(c2)
- ? ((c2 & 0xdf) - 'A') + 10
- : (c2 - '0')
- );
-
- return static_cast<char>(ret);
- }
+ BOOST_CGI_INLINE char hex_to_char(char const& c1, char const& c2);
/// Take two characters (a hex sequence) and return a char
// **DEPRECATED**
- char url_decode( const char& c1, const char& c2 )
- {
- int ret = ( (c1 >= 'A' && c1 <= 'Z') || (c1 >= 'a' && c1 <= 'z')
- ? ((c1 & 0xdf) - 'A') + 10
- : (c1 - '0')
- ) << 4;
-
- ret += ( (c2 >= 'A' && c2 <= 'Z') || (c2 >= 'a' && c2 <= 'z')
- ? ((c2 & 0xdf) - 'A') + 10
- : (c2 - '0')
- );
-
- return static_cast<char>(ret);
- }
-
- /// Workaround for istreams, since the above can't be used directly
- char url_decode(std::istream& is)
- {
- const char c1 = is.get();
- return url_decode(c1, is.get());
- }
+ BOOST_CGI_INLINE char url_decode( const char& c1, const char& c2 );
/// URL-decode a string
- std::string url_decode( const std::string& str )
- {
- std::string ret;
-
- for( std::string::const_iterator iter = str.begin(), end = str.end()
- ; iter != end; ++iter )
- {
- switch( *iter )
- {
- case ' ':
- break;
- case '+':
- ret.append(1, ' ');
- break;
- case '%':
- if (std::distance(iter, end) >= 2
- && std::isxdigit(*(iter+1))
- && std::isxdigit(*(iter+2)))
- {
- char ch = *++iter; // need this because order of function arg
- // evaluation is UB.
- ret.append(1, hex_to_char(ch, *++iter));
- }
- else // we're not dealing with a properly encoded hex value.
- {
- ret.append(1, '%');
- }
- break;
- default:
- ret.append(1, *iter);
- }
- }
-
- return ret;
- }
+ BOOST_CGI_INLINE std::string url_decode( const std::string& str );
} // namespace detail
} // namespace cgi
+#include "boost/cgi/detail/url_decode.ipp"
+
+#include "boost/cgi/detail/pop_options.hpp"
+
#endif // CGI_DETAIL_URL_DECODE_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/error.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/error.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/error.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -11,6 +11,8 @@
// The errors for everything are defined in here. ie. FastCGI,
// CGI and SCGI errors.
//
+// **FIXME** This is a mess.
+//
////////////////////////////////////////////////////////////////
#ifndef CGI_ERROR_HPP_INCLUDED__
#define CGI_ERROR_HPP_INCLUDED__
@@ -52,6 +54,9 @@
invalid_socket,
+ // The CONTENT_TYPE for form data wasn't recognised.
+ invalid_form_type,
+
// Used in basic_connection<tags::stdio>
// **FIXME**
broken_pipe,
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -20,7 +20,7 @@
namespace cgi {
namespace fcgi {
- using namespace ::cgi; // **FIXME** this must go.
+ //using namespace ::cgi; // **FIXME** this must go.
using namespace ::cgi::common; // import common elements.
} // namespace fcgi
} // namespace cgi
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/acceptor_service_impl.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/acceptor_service_impl.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/acceptor_service_impl.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -12,22 +12,20 @@
#include "boost/cgi/detail/push_options.hpp"
#include <boost/ref.hpp>
-#include <boost/static_assert.hpp>
#include <boost/bind.hpp>
-#include <boost/asio.hpp>
-#include <boost/shared_ptr.hpp>
+#include <boost/asio.hpp> // **FIXME**
#include <boost/thread.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/static_assert.hpp>
#include <boost/utility/enable_if.hpp>
#include <boost/system/error_code.hpp>
-
-//#include "is_async.hpp"
-#include "boost/cgi/io_service.hpp"
+///////////////////////////////////////////////////////////
+#include "boost/cgi/fcgi/request.hpp"
+#include "boost/cgi/import/io_service.hpp"
#include "boost/cgi/detail/throw_error.hpp"
-#include "boost/cgi/detail/protocol_traits.hpp"
-#include "boost/cgi/basic_protocol_service_fwd.hpp"
#include "boost/cgi/detail/service_base.hpp"
-//#include "service_selector.hpp"
-#include "boost/cgi/fcgi/request.hpp"
+#include "boost/cgi/detail/protocol_traits.hpp"
+#include "boost/cgi/fwd/basic_protocol_service_fwd.hpp"
namespace cgi {
@@ -75,7 +73,7 @@
* which takes a ProtocolService (**LINK**). If the protocol isn't async then
* the class can be used without a ProtocolService.
*/
- template<typename Protocol_ = ::cgi::fcgi_>
+ template<typename Protocol_ = ::cgi::common::fcgi_>
class acceptor_service_impl
: public detail::service_base< ::cgi::fcgi::acceptor_service_impl<Protocol_> >
{
@@ -128,7 +126,7 @@
type::implementation_type::endpoint_type endpoint_type;
- explicit acceptor_service_impl(::cgi::io_service& ios)
+ explicit acceptor_service_impl(::cgi::common::io_service& ios)
: detail::service_base< ::cgi::fcgi::acceptor_service_impl<Protocol_> >(ios)
, acceptor_service_(boost::asio::use_service<acceptor_service_type>(ios))
//, endpoint(boost::asio::ip::tcp::v4())
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/client.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/client.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/client.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -10,22 +10,24 @@
#define CGI_FCGI_CLIENT_HPP_INCLUDED__
#include <vector>
+///////////////////////////////////////////////////////////
#include <boost/shared_ptr.hpp>
#include <boost/logic/tribool.hpp>
#include <boost/asio/buffer.hpp>
-#include "boost/cgi/tags.hpp"
-#include "boost/cgi/map.hpp"
-#include "boost/cgi/io_service.hpp"
+///////////////////////////////////////////////////////////
+#include "boost/cgi/error.hpp"
+#include "boost/cgi/common/map.hpp"
+#include "boost/cgi/common/tags.hpp"
+#include "boost/cgi/import/read.hpp"
#include "boost/cgi/basic_client.hpp"
-#include "boost/cgi/connections/shareable_tcp_socket.hpp"
+#include "boost/cgi/import/buffer.hpp"
+#include "boost/cgi/import/io_service.hpp"
#include "boost/cgi/fcgi/specification.hpp"
-#include "boost/cgi/read.hpp"
-#include "boost/cgi/buffer.hpp"
-#include "boost/cgi/error.hpp"
-//#include "boost/cgi/fcgi/request_fwd.hpp"
+#include "boost/cgi/detail/throw_error.hpp"
+#include "boost/cgi/fwd/basic_request_fwd.hpp"
#include "boost/cgi/detail/protocol_traits.hpp"
-#include "boost/cgi/basic_request_fwd.hpp"
-//#error BOOST_HAS_RVALUE_REFS
+#include "boost/cgi/connections/shareable_tcp_socket.hpp"
+
namespace cgi {
namespace common {
@@ -45,7 +47,7 @@
class basic_client<common::shareable_tcp_connection, Protocol>
{
public:
- typedef ::cgi::io_service io_service_type;
+ typedef ::cgi::common::io_service io_service_type;
typedef ::cgi::common::map map_type;
typedef Protocol protocol_type;
typedef common::shareable_tcp_connection connection_type;
@@ -254,10 +256,13 @@
return keep_connection_;
}
+ //int id() { return request_id_; }
+
public:
friend class fcgi_request_service;
boost::uint16_t request_id_;
client_status status_;
+ std::size_t bytes_left_;
//request_impl_type* current_request_;
/// A marker to say if the final STDIN (and/or DATA) packets have been
@@ -291,7 +296,7 @@
namespace fcgi {
typedef
common::basic_client<
- common::shareable_tcp_connection, ::cgi::fcgi_
+ common::shareable_tcp_connection, ::cgi::common::fcgi_
>
client;
} // namespace fcgi
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/request.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/request.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/request.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,11 +9,10 @@
#ifndef CGI_FCGI_REQUEST_HPP_INCLUDED__
#define CGI_FCGI_REQUEST_HPP_INCLUDED__
-#include "boost/cgi/tags.hpp"
-#include "boost/cgi/basic_request_fwd.hpp"
-//#include "boost/cgi/request_service_fwd.hpp"
+#include "boost/cgi/common/tags.hpp"
#include "boost/cgi/fcgi/service.hpp"
#include "boost/cgi/fcgi/request_service.hpp"
+#include "boost/cgi/fwd/basic_request_fwd.hpp"
namespace cgi {
namespace fcgi {
@@ -28,6 +27,6 @@
} // namespace fcgi
} // namespace cgi
-//#include "boost/cgi/basic_request.hpp"
+#include "boost/cgi/basic_request.hpp"
#endif // CGI_FCGI_REQUEST_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/request_acceptor_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/request_acceptor_service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/request_acceptor_service.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -11,15 +11,13 @@
#include "boost/cgi/detail/push_options.hpp"
#include <boost/utility/enable_if.hpp>
-
-//#include "is_async.hpp"
-#include "boost/cgi/io_service.hpp"
+///////////////////////////////////////////////////////////
+#include "boost/cgi/import/io_service.hpp"
#include "boost/cgi/detail/throw_error.hpp"
-#include "boost/cgi/detail/protocol_traits.hpp"
-#include "boost/cgi/basic_protocol_service_fwd.hpp"
#include "boost/cgi/detail/service_base.hpp"
-//#include "service_selector.hpp"
+#include "boost/cgi/detail/protocol_traits.hpp"
#include "boost/cgi/fcgi/acceptor_service_impl.hpp"
+#include "boost/cgi/fwd/basic_protocol_service_fwd.hpp"
namespace cgi {
@@ -31,7 +29,7 @@
* which takes a ProtocolService (**LINK**). If the protocol isn't async then
* the class can be used without a ProtocolService.
*/
- template<typename Protocol_ = fcgi_>
+ template<typename Protocol_ = common::fcgi_>
class fcgi_request_acceptor_service
: public detail::service_base<fcgi_request_acceptor_service<Protocol_> >
{
@@ -48,7 +46,7 @@
/// The unique service identifier
//static boost::asio::io_service::id id;
- fcgi_request_acceptor_service(::cgi::io_service& ios)
+ fcgi_request_acceptor_service(common::io_service& ios)
: detail::service_base<fcgi_request_acceptor_service<protocol_type> >(ios)
, service_impl_(ios)
{
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/request_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/request_service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/request_service.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,19 +9,22 @@
#ifndef CGI_FCGI_REQUEST_SERVICE_HPP_INCLUDED__
#define CGI_FCGI_REQUEST_SERVICE_HPP_INCLUDED__
+#include <boost/fusion/support.hpp>
#include <boost/system/error_code.hpp>
-
-//#include "boost/cgi/scgi/request_impl.hpp"
-#include "boost/cgi/map.hpp"
-#include "boost/cgi/tags.hpp"
-#include "boost/cgi/read.hpp"
-#include "boost/cgi/role_type.hpp"
-#include "boost/cgi/io_service.hpp"
+#include <boost/fusion/include/vector.hpp>
+////////////////////////////////////////////////////////////////
+#include "boost/cgi/common/map.hpp"
+#include "boost/cgi/common/tags.hpp"
+#include "boost/cgi/fcgi/client.hpp"
+#include "boost/cgi/import/read.hpp"
+#include "boost/cgi/http/status_code.hpp"
+#include "boost/cgi/common/role_type.hpp"
+#include "boost/cgi/import/io_service.hpp"
#include "boost/cgi/detail/throw_error.hpp"
+#include "boost/cgi/common/source_enums.hpp"
+#include "boost/cgi/common/request_base.hpp"
#include "boost/cgi/detail/service_base.hpp"
-#include "boost/cgi/detail/extract_params.hpp"
-//#include "boost/cgi/basic_request.hpp"
-#include "boost/cgi/fcgi/client.hpp"
+#include "boost/cgi/common/form_parser.hpp"
namespace cgi {
@@ -58,21 +61,16 @@
/// The IoObjectService class for a FCGI basic_request<>s
class fcgi_request_service
: public detail::service_base<fcgi_request_service>
+ , public common::request_base<fcgi_request_service>
{
public:
/// The actual implementation date for an FCGI request.
struct implementation_type
+ : common::request_base<fcgi_request_service>::impl_base
{
- typedef ::cgi::common::map map_type;
- //typedef shareable_tcp_connection connection_type;
- typedef ::cgi::fcgi_ protocol_type;
- //typedef basic_client<
- // connection_type, protocol_type
- //> client_type;
+ typedef ::cgi::common::fcgi_ protocol_type;
typedef ::cgi::fcgi::client client_type;
typedef client_type::connection_type connection_type;
- typedef std::vector<char> buffer_type;
- typedef boost::asio::mutable_buffers_1 mutable_buffers_type;
typedef client_type::header_buffer_type header_buffer_type;
typedef detail::protocol_traits<
protocol_type
@@ -84,8 +82,8 @@
implementation_type()
: client_()
, stdin_parsed_(false)
- , http_status_(http::no_content)
- , request_status_(unloaded)
+ , http_status_(::cgi::common::http::no_content)
+ , request_status_(common::unloaded)
, request_role_(spec_detail::ANY)
, all_done_(false)
{
@@ -96,18 +94,10 @@
client_type client_;
bool stdin_parsed_;
- http::status_code http_status_;
- status_type request_status_;
+ ::cgi::common::http::status_code http_status_;
+ common::status_type request_status_;
fcgi::spec_detail::role_t request_role_;
- buffer_type buffer_;
-
- map_type env_vars_;
- map_type get_vars_;
- map_type post_vars_;
- map_type cookie_vars_;
-
- std::string null_str_;
bool all_done_;
mutable_buffers_type prepare(std::size_t size)
@@ -122,18 +112,6 @@
//{
buffer_.resize(bufsz + size);
//}
- /*
- cerr<< "Pre-read buffer (size: " << buffer_.size()
- << "|capacity: " << buffer_.capacity() << ") == {" << endl
- << std::string(buffer_.begin(), buffer_.end()) << endl
- // << "-----end buffer-----" << endl
- // << "-------buffer-------" << endl
- // << std::string(&buf_[0], &buf_[buf_.size()]) << endl
- << "}" << endl;
- ;
- */
- //return boost::asio::buffer(&(*(buf_.end())), size);
- // return boost::asio::buffer(&(*(buf_.begin())) + bufsz, size);
return boost::asio::buffer(&buffer_[bufsz], size);
}
@@ -141,15 +119,17 @@
/************** New stuff *****************/
header_buffer_type header_buf_;
boost::uint16_t id_;
- };
+ typedef detail::form_parser<implementation_type> form_parser_type;
+
+ boost::scoped_ptr<form_parser_type> fp_;
+ };
typedef fcgi_request_service type;
typedef ::cgi::fcgi::fcgi_request_service full_type;
typedef type::implementation_type::protocol_type protocol_type;
- typedef type::implementation_type::map_type map_type;
typedef type::implementation_type::request_type request_type;
- fcgi_request_service(::cgi::io_service& ios)
+ fcgi_request_service(::cgi::common::io_service& ios)
: detail::service_base<fcgi_request_service>(ios)
{
}
@@ -160,11 +140,9 @@
void construct(implementation_type& impl)
{
- //std::cerr<< "request_service.hpp:83 Creating connection" << std::endl;
impl.client_.set_connection(//new implementation_type::connection_type(this->io_service()));
implementation_type::connection_type::create(this->io_service())
);
- //std::cerr<< "conn.is_open() == " << impl.client_.is_open() << std::endl;
}
void destroy(implementation_type& impl)
@@ -190,7 +168,7 @@
}
/// Close the request.
- int close(implementation_type& impl, http::status_code& hsc
+ int close(implementation_type& impl, ::cgi::common::http::status_code& hsc
, int program_status)
{
impl.all_done_ = true;
@@ -198,7 +176,7 @@
return program_status;
}
- int close(implementation_type& impl, http::status_code& hsc
+ int close(implementation_type& impl, ::cgi::common::http::status_code& hsc
, int program_status, boost::system::error_code& ec)
{
impl.all_done_ = true;
@@ -209,19 +187,19 @@
void clear(implementation_type& impl)
{
BOOST_ASSERT
- ( impl.request_status_ < activated
- && impl.request_status_ > ok
+ ( impl.request_status_ < common::activated
+ && impl.request_status_ > common::ok
&& "Are you trying to clear() a request without closing it?"
);
impl.buffer_.clear();
- impl.get_vars_.clear();
- impl.post_vars_.clear();
- impl.cookie_vars_.clear();
- impl.env_vars_.clear();
+ common::get_vars(impl.vars_).clear();
+ common::post_vars(impl.vars_).clear();
+ common::cookie_vars(impl.vars_).clear();
+ common::env_vars(impl.vars_).clear();
impl.stdin_parsed_ = false;
- impl.http_status_ = http::no_content;
- impl.request_status_ = null;
+ impl.http_status_ = common::http::no_content;
+ impl.request_status_ = common::null;
impl.request_role_ = spec_detail::ANY;
impl.all_done_ = false;
@@ -244,7 +222,6 @@
, boost::system::error_code& ec)
{
//int header_len( get_length_of_header(impl, ec) );
- //std::cerr<< "Loading request...";
BOOST_ASSERT(!ec && "Can't load request due to previous errors.");
impl.client_.construct(impl, ec);
@@ -283,25 +260,23 @@
while(!ec
&& impl.client_.status() < completion_condition
- && impl.request_status_ != loaded)
+ && impl.request_status_ != common::loaded)
{
//impl.client_.parse_packet(impl, ec);
parse_packet(impl, ec);
}
- const std::string& request_method = env(impl, "REQUEST_METHOD", ec);
+ const std::string& request_method = env_vars(impl.vars_)["REQUEST_METHOD"];
if (request_method == "GET")
if (parse_get_vars(impl, ec))
return ec;
-/** FIXME **
else
if (request_method == "POST" && parse_stdin)
if (parse_post_vars(impl, ec))
return ec;
-*/
+
parse_cookie_vars(impl, ec);
- //std::cerr<< "done!" << std::endl;
return ec;
}
@@ -314,93 +289,6 @@
);
}
- /* These Don't Belong Here.
- template<typename MutableBufferSequence>
- std::size_t read_some(implementation_type& impl
- , const MutableBufferSequence& buf
- , boost::system::error_code& ec)
- {
- std::size_t s = impl.connection()->read_some(buf, ec);
- return s;
- }
-
- template<typename ConstBufferSequence>
- std::size_t write_some(implementation_type& impl
- , const ConstBufferSequence& buf
- , boost::system::error_code& ec)
- {
- return impl.connection()->write_some(buf, ec);
- }
-
- //template<typename VarType> map_type& var(implementation_type&) const;
- ********************************************/
-
- std::string GET(implementation_type& impl, const std::string& name
- , boost::system::error_code& ec)
- {
- return var(impl.get_vars_, name, ec);
- }
-
- map_type& GET(implementation_type& impl)
- {
- return impl.get_vars_;
- }
-
- /// Find the post meta-variable matching name
- /**
- * @param greedy This determines whether more data can be read to find
- * the variable. The default is true to cause least surprise in the common
- * case of having not parsed any of the POST data.
-
- -----------------------------------------------
- Should this return a pair of iterators instead?
- What about url_decoding?
- -----------------------------------------------
-
- */
- std::string POST(implementation_type& impl, const std::string& name
- , boost::system::error_code& ec
- , bool greedy = true)
- {
- const std::string& val = var(impl.post_vars_, name, ec);
- if (val.empty() && greedy && !ec)
- {
-
- }
-
- return val;
- }
-
- map_type& POST(implementation_type& impl)
- {
- return impl.post_vars_;
- }
-
-
- /// Find the cookie meta-variable matching name
- std::string cookie(implementation_type& impl, const std::string& name
- , boost::system::error_code& ec)
- {
- return var(impl.cookie_vars_, name, ec);
- }
-
- map_type& cookie(implementation_type& impl)
- {
- return impl.cookie_vars_;
- }
-
- /// Find the environment meta-variable matching name
- std::string env(implementation_type& impl, const std::string& name
- , boost::system::error_code& ec)
- {
- return var(impl.env_vars_, name, ec);
- }
-
- map_type& env(implementation_type& impl)
- {
- return impl.env_vars_;
- }
-
role_type get_role(implementation_type& impl)
{
return responder;
@@ -413,70 +301,22 @@
}
protected:
- /// Extract the var value from
- std::string var(map_type& _data, const std::string& _name
- , boost::system::error_code& ec)
- {
- /* Alt:
- if ((typename map_type::iterator pos = meta_data.find(name))
- != meta_data.end())
- {
- return *pos;
- }
- return std::string();
- **/
-
- if( _data.find(_name) != _data.end() )
- return _data[_name];
- return "";
- }
-
- /// Read and parse the cgi GET meta variables
- boost::system::error_code&
- parse_get_vars(implementation_type& impl, boost::system::error_code& ec)
- {
- detail::extract_params(env(impl, "QUERY_STRING", ec)
- , impl.get_vars_
- , boost::char_separator<char>
- ("", "=&", boost::keep_empty_tokens)
- , ec);
-
- return ec;
- }
-
- /// Read and parse the HTTP_COOKIE meta variable
- boost::system::error_code&
- parse_cookie_vars(implementation_type& impl, boost::system::error_code& ec)
- {
- // Make sure this function hasn't already been called
- //BOOST_ASSERT( impl.cookie_vars_.empty() );
-
- std::string vars = env(impl, "HTTP_COOKIE", ec);
- if (vars.empty())
- return ec;
-
- detail::extract_params(env(impl, "HTTP_COOKIE", ec)
- , impl.cookie_vars_
- , boost::char_separator<char>
- ("", "=&", boost::keep_empty_tokens)
- , ec);
-
- return ec;
- }
-
/// Read and parse the cgi POST meta variables (greedily)
- template<typename RequestImpl>
boost::system::error_code&
parse_post_vars(implementation_type& impl, boost::system::error_code& ec)
{
// Make sure this function hasn't already been called
- //BOOST_ASSERT( impl.post_vars_.empty() );
+ //BOOST_ASSERT( impl.post_vars().empty() );
//# error "Not implemented"
-
- if (impl.stdin_parsed_)
- {
- }
+/*
+ impl.fp_.reset
+ (
+ new typename implementation_type::form_parser_type
+ ( impl )
+ );
+ impl.fp_->parse(ec);
+*/
return ec;
}
@@ -571,7 +411,7 @@
{
if (id == fcgi::spec::get_request_id(impl.header_buf_))
{
- impl.request_status_ = aborted;
+ impl.request_status_ = common::aborted;
return ec;
}
try {
@@ -650,7 +490,8 @@
//std::cerr<< "[hw] name := " << name << std::endl;
//std::cerr<< "[hw] data := " << data << std::endl;
- impl.env_vars_[name] = data;
+ // **FIXME**
+ env_vars(impl.vars_)[name.c_str()] = data;
}
return ec;
@@ -725,13 +566,10 @@
}else
if (!state)
{ // The header is confusing; something's wrong. Abort.
- //std::cerr<< "Bad header received (this isn't implemented properly yet"
- // << std::endl;
return error::bad_header_type;
}
// else route (ie. state == boost::indeterminate)
- //std::cerr<< "Got to read more stuff now I think." << std::endl;
implementation_type::mutable_buffers_type buf
= impl.prepare(fcgi::spec::get_length(impl.header_buf_));
@@ -762,62 +600,41 @@
parse_body(implementation_type& impl, const MutableBuffersType& buffer
, boost::system::error_code& ec)
{
- return //ec;/*
+ return
(this->* proc_funcs[fcgi::spec::get_type(impl.header_buf_)])
(impl, fcgi::spec::get_request_id(impl.header_buf_)
, boost::asio::buffer_cast<unsigned char*>(buffer)
, boost::asio::buffer_size(buffer), ec);
}
-/*
- implementation_type::request_type&
- get_or_make_request(implementation_type& impl, boost::uint16_t id);
- request_type::pointer ret
-
- try {
- ret = &requests.at(id - 1);
- BOOST_ASSERT(req != 0); // should throw
- return *ret;
- }catch(...){
- req = request_type::create(impl.service_);
- if (requests.size() < (id - 1))
- requests.resize(id);
- requests.at(id-1) = *req;
- return req->impl(); // same as *ret
- }
- }
-*/
- boost::system::error_code
- begin_request_helper(implementation_type& impl
- , implementation_type::header_buffer_type& header
- , boost::system::error_code& ec)
- {
- impl.client_.request_id_ = fcgi::spec::get_request_id(header);
+ boost::system::error_code
+ begin_request_helper(implementation_type& impl
+ , implementation_type::header_buffer_type& header
+ , boost::system::error_code& ec)
+ {
+ impl.client_.request_id_ = fcgi::spec::get_request_id(header);
BOOST_STATIC_ASSERT((
- fcgi::spec::begin_request::body::size::value
- == fcgi::spec::header_length::value));
+ fcgi::spec::begin_request::body::size::value
+ == fcgi::spec::header_length::value));
+
+ // A begin request body is as long as a header, so we can optimise:
+ if (read_header(impl, ec))
+ return ec;
- // A begin request body is as long as a header, so we can optimise:
- if (read_header(impl, ec))
- return ec;
-
- impl.request_role_
- = fcgi::spec::begin_request::get_role(impl.header_buf_);
- // **FIXME** (rm impl.request_role_)
- impl.client_.role_ = impl.request_role_;
- //std::cerr<< "[hw] New request role: " << impl.request_role_
- // << " (" << fcgi::spec::role_type::to_string(impl.header_buf_) << ")"
- // << std::endl;
- impl.client_.keep_connection_
- = fcgi::spec::begin_request::get_flags(impl.header_buf_)
- & fcgi::spec::keep_connection;
-
- impl.client_.status_ = common::constructed;
- return ec;
- }
- };
+ impl.request_role_
+ = fcgi::spec::begin_request::get_role(impl.header_buf_);
+ // **FIXME** (rm impl.request_role_)
+ impl.client_.role_ = impl.request_role_;
+ impl.client_.keep_connection_
+ = fcgi::spec::begin_request::get_flags(impl.header_buf_)
+ & fcgi::spec::keep_connection;
+ impl.client_.status_ = common::constructed;
+
+ return ec;
+ }
+ };
//template<>
const fcgi_request_service::proc_func_t fcgi_request_service::proc_funcs[] =
@@ -905,3 +722,4 @@
} // namespace cgi
#endif // CGI_FCGI_REQUEST_SERVICE_HPP_INCLUDED__
+
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/service.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/fcgi/service.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,8 +9,8 @@
#ifndef CGI_FCGI_SERVICE_HPP_INCLUDED__
#define CGI_FCGI_SERVICE_HPP_INCLUDED__
-#include "boost/cgi/tags.hpp"
-#include "boost/cgi/basic_protocol_service.hpp"
+#include "boost/cgi/common/tags.hpp"
+#include "boost/cgi/common/basic_protocol_service.hpp"
namespace cgi {
@@ -19,7 +19,7 @@
namespace fcgi {
// typedef for standard scgi::service (a model of ProtocolService)
- typedef ::cgi::common::basic_protocol_service< ::cgi::fcgi_> service;
+ typedef ::cgi::common::basic_protocol_service< ::cgi::common::fcgi_> service;
}
} // namespace cgi
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/header.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/header.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,134 +0,0 @@
-// -- header.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_HEADER_HPP_INCLUDED__
-#define CGI_HEADER_HPP_INCLUDED__
-
-#include <string>
-#include <boost/lexical_cast.hpp>
-
-namespace cgi {
- namespace common {
-
- //template<typename StringT = std::string>
- struct header
- {
- typedef std::string string_type;
-
- header()
- : content()
- {
- }
-
-
- /// Templated constructor to allow user-defined types to be converted
- //template<typename T>
- //header(T& t)
- // : content(t.to_string())
- //{
- //}
-
-
- //template<>
- header(const string_type& _content)
- : content(_content)
- {
- }
-
- header(const string_type& name, const string_type& val)
- : content(name + ": " + val)
- {
- }
-
- //header(const std::string& name, const std::string& val)
- // : content(name + ": " + val)
- //{
- //}
-
- /// Construct an header from a cookie.
- template<typename T>
- header(const basic_cookie<T>& ck)
- : content("Set-cookie: " + ck.to_string())
- {
- }
-
- string_type content;
-
- };
-
-/*
- template<typename StringT>
- header<StringT>
- make_header(const StringT& name, const StringT& val)
- {
- return basic_header<StringT>(name, val);
- }* /
-
- template<typename T, typename StringT>
- T make_header(const StringT& name, const StringT& val)
- {
- return basic_header<StringT>(name, val);
- }*/
-
-
- //{ Some shortcuts, to cut down on typing errors.
- template<typename StringT>
- header
- content_type(StringT str)
- {
- return header("Content-type", str);
- }
-
- template<typename StringT>
- header
- content_encoding(const StringT& str)
- {
- return header("Content-encoding", str);
- }
-
- template<typename T>
- header
- content_length(const T& t)
- {
- return header("Content-length", boost::lexical_cast<std::string>(t));
- }
-
- template<typename T, typename Traits, typename Alloc>
- header
- content_length(const std::basic_string<T, Traits, Alloc>& str)
- {
- return header("Content-length", str);
- }
-/*
- template<typename StringT>
- header<StringT>
- location(const StringT& url)
- {
- return header<StringT>("Location", url);
- }
-
- header<std::string>
- location(const std::string& url)
- {
- return header<std::string>("Location", url);
- }*/
- //template<typename T>
- header location(const std::string& url)
- {
- return header("Location", url);
- }
- //}
-
- // typedefs for typical usage
- //typedef basic_header<std::string> header;
- //typedef basic_header<std::wstring> wheader;
-
- } // namespace common
-} // namespace cgi
-
-#endif // CGI_HEADER_HPP_INCLUDED__
Modified: sandbox/SOC/2007/cgi/branches/release/boost/cgi/http/status_code.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/http/status_code.hpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/boost/cgi/http/status_code.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -10,77 +10,82 @@
#define CGI_HTTP_STATUS_CODE_HPP_INCLUDED__
namespace cgi {
- namespace http {
+ namespace common {
+ namespace http {
- /// Standard HTTP status codes
- /**
- * See http://tools.ietf.org/html/rfc2616#section-10
- */
- enum status_code
- {
- /// Informational codes
- continue_ = 100, // note the trailing underscore
- switching_protocols,
- processing,
-
- /// Success codes
- ok = 200,
- created,
- accepted,
- non_authorative_information,
- no_content,
- reset_content,
- partial_content,
- multi_status,
-
- /// Redirect codes
- multiple_choices = 300,
- moved_permanently,
- found,
- see_other,
- not_modified,
- use_proxy,
- switch_proxy,
- temporary_redirect,
-
- /// Domain error codes
- bad_request = 400,
- unauthorized,
- payment_required,
- forbidden,
- not_found,
- method_not_allowed,
- not_acceptable,
- proxy_authentication_required,
- request_timeout,
- conflict,
- gone,
- length_required,
- precondition_failed,
- request_entity_too_large,
- request_uri_too_long,
- unsupported_media_type,
- request_range_not_satisfiable,
- expectation_failed,
- unprocessable_entity = 422,
- locked,
- failed_dependency,
- unordered_collection,
- upgrade_required,
- retry_with = 449,
-
- /// Internal error codes
- internal_server_error = 500,
- not_implemented,
- bad_gateway,
- service_unavailable,
- gateway_timeout,
- http_version_not_supported,
- insufficient_storage,
- bandwidth_limit_exceeded = 509
- };
+ /// Standard HTTP status codes
+ /**
+ * See http://tools.ietf.org/html/rfc2616#section-10
+ */
+ enum status_code
+ {
+ /// Informational codes
+ continue_ = 100, // note the trailing underscore
+ switching_protocols,
+ processing,
+
+ /// Success codes
+ ok = 200,
+ created,
+ accepted,
+ non_authorative_information,
+ no_content,
+ reset_content,
+ partial_content,
+ multi_status,
+
+ /// Redirect codes
+ multiple_choices = 300,
+ moved_permanently,
+ found,
+ see_other,
+ not_modified,
+ use_proxy,
+ switch_proxy,
+ temporary_redirect,
+
+ /// Domain error codes
+ bad_request = 400,
+ unauthorized,
+ payment_required,
+ forbidden,
+ not_found,
+ method_not_allowed,
+ not_acceptable,
+ proxy_authentication_required,
+ request_timeout,
+ conflict,
+ gone,
+ length_required,
+ precondition_failed,
+ request_entity_too_large,
+ request_uri_too_long,
+ unsupported_media_type,
+ request_range_not_satisfiable,
+ expectation_failed,
+ unprocessable_entity = 422,
+ locked,
+ failed_dependency,
+ unordered_collection,
+ upgrade_required,
+ retry_with = 449,
+
+ /// Internal error codes
+ internal_server_error = 500,
+ not_implemented,
+ bad_gateway,
+ service_unavailable,
+ gateway_timeout,
+ http_version_not_supported,
+ insufficient_storage,
+ bandwidth_limit_exceeded = 509
+ };
+
+ } // namespace http
+ } // namespace common
+
+ using namespace common::http; // **FIXME**
- } // namespace http
} // namespace cgi
#endif // CGI_HTTP_STATUS_CODE_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/io_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/io_service.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,30 +0,0 @@
-// -- io_service.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_IO_SERVICE_HPP_INCLUDED__
-#define CGI_IO_SERVICE_HPP_INCLUDED__
-
-//#if _MSC_VER > 1020
-//#pragma once
-//#endif
-
-#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__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/io_service_provider.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/io_service_provider.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,277 +0,0 @@
-// -- io_service_provider.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_IO_SERVICE_PROVIDER_HPP_INCLUDED__
-#define CGI_IO_SERVICE_PROVIDER_HPP_INCLUDED__
-
-#if _MSC_VER > 1020
-#pragma once
-#endif
-
-#include "boost/cgi/detail/push_options.hpp"
-
-//#include <list>
-//#include <boost/ref.hpp>
-//#include <boost/bind.hpp>
-//#include <boost/thread.hpp>
-//#include <boost/shared_ptr.hpp>
-#include <boost/noncopyable.hpp>
-
-#include "boost/cgi/io_service.hpp"
-#include "boost/cgi/io_service_provider_fwd.hpp"
-
-
-namespace cgi {
-
- /// Hold a set number of io_services and return them based on the Policy
- /**
- * Contains six member functions:
- * io_service() - returns a reference to an io_service
- * stop() - stops all io_services
- * run() - runs all io_services
- * reset() - resets all io_services
-
- * (strike) stop_one() - stops one (running) io_service
- * (strike) run_one() - runs one (not-yet-started/reset) io_service
- *
- * It can also be set up so that only required io_services are run:
- * each call to io_service() can get an io_service, call io_service::run() on
- * it and then return it.
- */
- template<typename PoolingPolicy>
- class io_service_provider
- : private boost::noncopyable
- {
- public:
- io_service_provider(int)
- : io_service_()
- {
- }
-
- io_service_provider()
- : io_service_()
- {
- }
-
- ::cgi::common::io_service&
- get_io_service()
- {
- return io_service_;
- }
-
- void run()
- {
- io_service_.run();
- }
-
- void stop()
- {
- io_service_.stop();
- }
-
- void reset()
- {
- io_service_.reset();
- }
- private:
- ::cgi::common::io_service io_service_;
- };
-
-
- /*
- template<>
- class io_service_provider<tags::service_pool>
- {
- public:
- typedef std::list<cgi::io_service> impl_type;
-
- io_service_provider(int pool_size)
- : io_services_(pool_size)
- , current_(io_services_.begin())
- {
- }
-
- cgi::io_service& io_service()
- {
- return boost::ref(*current_++);
- }
-
- void run()
- {
- std::for_each(io_services_.begin(), io_services_.end()
- , boost::bind(&cgi::io_service::run, boost::ref(_1)));
- }
-
- void stop()
- {
- std::for_each(io_services_.begin(), io_services_.end()
- , boost::bind(&cgi::io_service::stop, boost::ref(_1)));
- }
-
- void reset()
- {
- std::for_each(io_services_.begin(), io_services_.end()
- , boost::bind(&cgi::io_service::reset, boost::ref(_1)));
- }
-
- impl_type& impl()
- {
- return io_services_;
- }
-
- private:
- impl_type io_services_;
- impl_type::iterator current_;
- };
- */
-
- /// Specialization for multi-queue/single-io_service strategy
- /**
- * Holds a reference to a passed in io_service. Use of this requires the
- * user passes in an io_service on construction of the
- * basic_protocol_service<>.
- */
-/********************************
- template<typename Policy>
- class io_service_provider<0, Policy>
- : private boost::noncopyable
- {
- public:
- io_service_provider(boost::asio::io_service& ios)
- : io_service_(ios)
- {
- }
-
- boost::asio:io_service& io_service()
- {
- return io_service_;
- }
-
- void run()
- {
- io_service_.run();
- }
-
- void stop()
- {
- io_service_.stop();
- }
-
- void reset()
- {
- io_service_.reset();
- }
- private:
- boost::asio::io_service& io_service_;
- };
-********************************/
-
- /*
- /// Specialization for io_service-per-queue strategy
- template<typename Policy>
- class io_service_provider<1, Policy>//tags::>
- : private boost::noncopyable
- {
- public:
- io_service_provider(int)
- : io_service_()
- , work_(io_service_)
- {
- }
-
- io_service_provider()
- : io_service_()
- , work_(io_service_)
- {
- }
-
- boost::asio::io_service& io_service()
- {
- return io_service_;
- }
- private:
- boost::asio::io_service io_service_;
- boost::asio::io_service::work work_;
- };
-
-
-
- /// Specialization for a variable number of io_services
- template<typename Policy>
- class io_service_provider<-1, Policy>//tags::round_robin_pool>
- : private boost::noncopyable
- {
- typedef boost::shared_ptr<boost::asio::io_service> io_service_ptr;
- typedef boost::shared_ptr<boost::asio::io_service::work> work_ptr;
-
- public:
- io_service_provider(int pool_size = 7)
- : pos_(0)
- , io_services_()
-// , strand_(io_services_[0])
- {
- if (pool_size == 0)
- throw std::runtime_error("io_service_pool size is 0");
-
- // Give all the io_services work to do so that their run() functions will
- // not exit until they are explicitly stopped.
- for (std::size_t i = 0; i < pool_size; ++i)
- {
- io_service_ptr io_service(new boost::asio::io_service);
- work_ptr work(new boost::asio::io_service::work(*io_service));
- io_services_.push_back(io_service);
- work_.push_back(work);
- }
- }
-
- void run()
- {
- // Create a pool of threads to run all of the io_services.
- std::vector<boost::shared_ptr<boost::thread> > threads;
- for (std::size_t i = 0; i < io_services_.size(); ++i)
- {
- boost::shared_ptr<boost::thread>
- thread(new boost::thread(boost::bind(&boost::asio::io_service::run
- , io_services_[i])));
- threads.push_back(thread);
- }
-
- // Wait for all threads in the pool to exit.
- for (std::size_t i = 0; i < threads.size(); ++i)
- threads[i]->join();
- }
-
- void stop()
- {
- // Explicitly stop all io_services.
- for (std::size_t i = 0; i < io_services_.size(); ++i)
- io_services_[i]->stop();
- }
-
- // NOT THREAD-SAFE (but should be)
- boost::asio::io_service& io_service()
- {
- boost::asio::io_service& io_service = *io_services_[pos_];
- if (++pos_ == io_services_.size())
- pos_ = 0;
- return io_service;
- }
- private:
- int pos_;
- std::vector<io_service_ptr> io_services_;
- std::vector<work_ptr> work_;
-
- //boost::asio::io_service::strand strand_;
- };
- */
-
-} // namespace cgi
-
-#include "boost/cgi/detail/pop_options.hpp"
-
-#endif // CGI_IO_SERVICE_PROVIDER_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/io_service_provider_fwd.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/io_service_provider_fwd.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,25 +0,0 @@
-// -- io_service_provider_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_IO_SERVICE_PROVIDER_FWD_HPP_INCLUDED__
-#define CGI_IO_SERVICE_PROVIDER_FWD_HPP_INCLUDED__
-
-#if _MSC_VER > 1020
-#pragma once
-#endif
-
-#include "boost/cgi/tags.hpp"
-
-namespace cgi {
-
- template<typename = tags::single_service>
- class io_service_provider;
-
-} // namespace cgi
-
-#endif // CGI_IO_SERVICE_PROVIDER_FWD_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/is_async.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/is_async.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,32 +0,0 @@
-// -- is_async.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_IS_ASYNC_HPP_INCLUDED__
-#define CGI_IS_ASYNC_HPP_INCLUDED__
-
-#include <boost/mpl/bool.hpp>
-
-#include "tags.hpp"
-
-namespace cgi {
-
- template<typename Protocol>
- struct is_async
- : boost::mpl::bool_<true>::type
- {
- };
-
- template<>
- struct is_async<tags::cgi>
- : boost::mpl::bool_<false>::type
- {
- };
-
-} // namespace cgi
-
-#endif // CGI_IS_ASYNC_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/map.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/map.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,23 +0,0 @@
-// -- map.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_MAP_HPP_INCLUDED__
-#define CGI_MAP_HPP_INCLUDED__
-
-#include <map>
-#include <string>
-
-namespace cgi {
- namespace common {
-
- typedef std::map<std::string,std::string> map;
-
- } // namespace common
-} // namespace cgi
-
-#endif // CGI_MAP_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/read.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/read.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,24 +0,0 @@
-// -- read.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_READ_HPP_INCLUDED
-#define CGI_READ_HPP_INCLUDED
-
-#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
-
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/request.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/request.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,21 +0,0 @@
-// -- request.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_REQUEST_HPP_INCLUDED__
-#define CGI_REQUEST_HPP_INCLUDED__
-
-#include "basic_request.hpp"
-#include "tags.hpp"
-
-namespace cgi {
-
- typedef basic_request<tags::cgi> request;
-
-} // namespace cgi
-
-#endif // CGI_REQUEST_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_acceptor_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_acceptor_service.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,101 +0,0 @@
-// -- request_acceptor_service.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_REQUEST_ACCEPTOR_SERVICE_HPP_INCLUDED
-#define CGI_REQUEST_ACCEPTOR_SERVICE_HPP_INCLUDED
-
-#include "detail/throw_error.hpp"
-#include "detail/protocol_traits.hpp"
-#include "detail/service_base.hpp"
-
-namespace cgi {
-
- template<typename Protocol>
- class request_acceptor_service
- : public detail::service_base<request_acceptor_service<Protocol> >
- {
- typedef detail::protocol_traits<Protocol>::acceptor_service_impl
- service_impl_type;
- public:
- typedef typename service_impl_type::impl_type implementation_type;
- typedef Protocol protocol_type;
-
- request_acceptor_service(basic_protocol_service<protocol_type>& s)
- : detail::service_base<request_acceptor_service<Protocol>(s.io_service())
- {
- }
-
- void shutdown_service()
- {
- }
-
- void construct(implementation_type& impl)
- {
- service_impl_.construct(impl);
- }
-
- void destroy(implementation_type& impl)
- {
- service_impl_.destroy(impl);
- }
-
- /// Accept a request
- /**
- * Check if there is a waiting request in the queue. If not, accept a
- * connection, and associate it with the request.
- */
- 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);
- /*
- boost::thread::mutex::scoped_lock lk(io_service_.mutex_);
- if( !io_service_.request_queue_.empty() )
- {
- request = pservice_.request_queue_.front();
- pservice_.request_queue_.pop();
-
- return ec;
- }
- lk.unlock();
- pservice_.gateway_.accept(&request.connection(), ec);
-
- return ec;
- */
- }
-
- /// Asynchronously accept a request
- template<typename CommonGatewayRequest, typename Handler>
- void async_accept(implementation_type& impl, CommonGatewayRequest& request
- , Handler handler)
- {
- service_impl_.async_accept(impl, request, handler);
- /*
- boost::thread::mutex::scoped_lock lk(io_service_.mutex_);
- if( !io_service_.request_queue_.empty() )
- {
- request = pservice_.request_queue_.front();
- pservice_.request_queue_.pop();
-
- return ec;
- }
- lk.unlock();
- pservice_.gateway_.async_accept(request.connection(), handler);
- */
- }
-
- private:
- service_impl_type& service_impl_;
- // basic_protocol_service<protocol_type>& pservice_;
- };
-
-} // namespace cgi
-
-#endif // CGI_REQUEST_ACCEPTOR_SERVICE_HPP_INCLUDED
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_base.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_base.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,103 +0,0 @@
-#ifndef CGI_REQUEST_BASE_HPP_INCLUDE_
-#define CGI_REQUEST_BASE_HPP_INCLUDE_
-
-//#include "role_type.hpp"
-
-namespace cgi {
-
- /// ABC that defines the basic interface for cgi::basic_cgi_request<>s
- /**
- * This class also allows for the general (rather than generic) verision
- * of cgi::request, which can take any type of request.
- */
- class request_base
- {
- public:
- /// Notify the server that the request has been handled
- /**
- * Under normal circumstances {{ideally}}, this won't be called internally
- * but a user may safely call it anyway, if (for example) they have a lot
- * of post-request-handling housekeeping to do but want the server to
- * finish with that request.
- *
- * @param return_code This is equivalent to the return value from main() in
- * a standard cgi library, or sub_main() in the provided examples. 0 should
- * denote success, anything else an error, however the number will
- * generally be ignored by the server.
- */
- //virtual void end( int return_code ) = 0;
-
- /// Returns the number of bytes available in the read buffer
- //virtual std::size_t available() = 0;
-
- /// Get the streambuf associated with the request
- /**
- * You may want to construct your own i/ostream instead of using the
- * request directly.
- *
- * @note You should NOT use std::cout/std::cin for writes, as they are
- * not thread aware and in some cases won't exist (eg. in a strict fastcgi
- * impletentation).
- *
- * {{should this return an asio::streambuf instead?}}
- */
- //virtual std::streambuf* rdbuf() = 0;
-
- /// Flush the output buffer now
- /**
- * Since the output for a request is buffered until the request has
- * completed (see Design notes), under low-memory or large-output
- * conditions, incrementally flushing the buffer may be necessary
- *
- * @note If something goes awry after calling this, the user will
- * be left with half a reply, rather than a (cleaner) error page.
- */
- //virtual void flush() = 0;
-
- /// Write a message to the error output
- /**
- * In a standard cgi program, this is equivalent to writing to std::cerr,
- * which should be closed in fastcgi (although many implementations leave
- * it writable). In order to write an error message in a cross-platform
- * way, you should use this function.
- *
- * @note On Apache and lighttpd the messages are appended to the server
- * log file, although there is no guarantee that other platforms will
- * recognise it.
- */
- //virtual void log( const std::string& error_message ) = 0;
-
- /// Get the role of the current request
- /**
- * The FastCGI 1.0 protocol specifies three types of request:
- *
- * @li Responder: the familiar type
- *
- * @li Authorizer: the server provides client information and the
- * application responds with a true/false response, plus optional data
- * about where to redirect the client and with what extra variables
- *
- * @li Filter: the program is provided with data and a file, which it is
- * expected to 'filter' and then return to the server. This is poorly
- * supported in production servers {{AFAIK}}
- */
- //virtual role_type role() = 0;
-
- /* SyncReadStream function */
- //template<typename MutableBufferSequence>
- //virtual std::size_t read_some(MutableBufferSequence) = 0;
-
- //template<typename MutableBufferSequence>
- //virtual std::size_t read_some(MutableBufferSequence, error_code&) = 0;
-
- protected:
- /// Prevent deletion through this type
- ~request_base()
- {
- }
- };
-
-} // namespace cgi
-
-#endif // CGI_REQUEST_BASE_HPP_INCLUDE_
-
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_ostream.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_ostream.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,368 +0,0 @@
-// -- request_ostream.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_REQUEST_OSTREAM_HPP_INCLUDED__
-#define CGI_REQUEST_OSTREAM_HPP_INCLUDED__
-
-#if 0
-
-// THIS FILE ISN'T USED!
-// **FIXME**
-
-/*********************************
-ISSUES:
--------
-* async_flush()
-The other flush() functions clear the buffer after flushing the data to the
-request. It's trickier with async_flush(), but for now the buffer is still
-cleared after the flush completes. This means you can't write to the ostream
-until an async_flush completes; that's probably true of any async operation
-however so it seems a reasonable restriction.
-
-* Is ostream the best name for this? request_ostream?
-
-* This class could do more: the functions basic_request<>::write() could write
-to the request unbuffered. ie. a write call would instantly wrap the supplied
-buffer in suitable headers and send it straight away, rather than buffering it
-first. That would also mean the ostream class is of more use than it is now.
-
-* This should probably derive from std::ostream, as users would probably expect
-that.
-*********************************/
-
-#include "detail/push_options.hpp"
-
-#include <ostream>
-#include <sstream>
-#include <vector>
-//#include <streambuf>
-#include <boost/assert.hpp>
-#include <boost/bind.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/system/error_code.hpp>
-#include <boost/asio.hpp>
-
-#include "streambuf.hpp"
-#include "buffer.hpp"
-#include "write.hpp"
-#include "tags.hpp"
-#include "data_sink.hpp"
-#include "request_base.hpp"
-#include "basic_request.hpp"
-#include "http/status_code.hpp"
-//#include "detail/take_buffer.hpp"
-
-namespace cgi {
-
- /* Notes
- * -----
- *
- * The constructor could take an additional bool which determines
- * if any default headers are prepended to the message on sending
- * eg. 'Content-type: text/plain' could by default be added, making
- * the entry barrier lower and testing simpler.
- */
-
-
- /// The ostream class: a stream interface for writing to requests
- /**
- * This is simply a wrapper around an ostream with a few extra details that
- * aid writing to a request's output or error sinks.
- *
- * This is a generalisation of the cgi::reply and cgi::logger classes.
- */
- class request_ostream
- // derive from std::ostream? (yes, basically)
- {
- public:
- /// Default constructor
- request_ostream(http::status_code sc = http::ok)
- : buffer_(new ::cgi::streambuf())
- , ostream_(buffer_.get())
- , http_status_(sc)
- , headers_sent_(false)
- {
- }
-
- /// Construct with a particular buffer
- /**
- * Takes the buffer and uses it internally, does nothing with it on
- * destruction.
- */
- request_ostream(::cgi::streambuf* buf, http::status_code sc = http::ok)
- : /*request_(NULL)
- , */ostream_(buf)
- , http_status_(sc)
- {
- }
-
- /// Construct, taking a buffer from an external source
- /**
- * Gets a buffer from the request/protocol service held by the request.
- * <strike>
- * Takes a buffer from T (can be a model of ProtocolService or
- * CommonGatewayRequest) to use internally.
- * </strike>
- */
-// template<typename CommonGatewayRequest>
-// request_ostream(CommonGatewayRequest& req, http::status_code sc = http::ok)
-// : request_(&req)
-// , buffer_(new cgi::streambuf())
-// , ostream_(buffer_.get()) //detail::take_buffer(req))
-// , http_status_(sc)
-//// , destination_(destination)
-// {
-// }
-
- ~request_ostream()
- {
- //if (request_) send();
- }
-
- void clear()
- {
- ostream_.clear();
- headers_.clear();
- }
-
- // provide this too?
- std::size_t write(const char* str, std::size_t len)
- {
- ostream_.write(str, len);
- return len;
- }
-
- std::size_t write(const std::string& str)
- {
- return write(str.c_str(), str.size());
- }
-
- template<typename ConstBufferSequence>
- std::size_t write(const ConstBufferSequence& buf)
- {
- //ostream_.write(buf.data(), buf.size());
- return buf.size();
- }
-
- /// Synchronously flush the data to the current request
- /**
- * If there is no error, the buffer is cleared.
- */
- //void flush()
- //{
- // BOOST_ASSERT(request_ != NULL);
- // flush(*request_);
- //}
-
- /// Synchronously flush the data to the supplied request
- /**
- * This call uses throwing semantics. ie. an exception will be thrown on
- * any failure.
- * If there is no error, the buffer is cleared.
- */
- template<typename CommonGatewayRequest>
- void flush(CommonGatewayRequest& req)
- {
- if (!headers_sent_)
- {
- ostream_<< "Content-type: text/plain\r\n\r\n";
- headers_sent_ = true;
- }
- ::cgi::write(req, headers_);
- ::cgi::write(req, rdbuf()->data());
- // the above function will throw on an error
- clear();
- }
-
- /// Synchronously flush the data via the supplied request
- /**
- * This call uses error_code semantics. ie. ec is set if an error occurs.
- * If there is no error, the buffer is cleared.
- */
- template<typename CommonGatewayRequest>
- boost::system::error_code&
- flush(CommonGatewayRequest& req, boost::system::error_code& ec)
- {
- if (!headers_sent_)
- {
- ostream_<< "Content-type: text/plain\r\n\r\n";
- headers_sent_ = true;
- }
- if(!::cgi::write(req, rdbuf()->data(), ec))
- clear();
- return ec;
- }
-
- // Class for doing post-flush housekeeping (ie. clearing the stream data)
- template<typename Handler>
- class flush_handler
- {
- public:
- flush_handler(request_ostream& os, Handler handler)
- : ostream_(os)
- , handler_(handler)
- {
- }
-
- void operator()(boost::system::error_code& ec)
- {
- if(!ec) ostream_.clear();
- handler_(ec);
- }
- private:
- request_ostream& ostream_;
- Handler handler_;
- };
-
- /// Asynchronously flush the data through the supplied request
- /**
- * If there is no error, the buffer is cleared *after* the write has
- * finished.
- */
- template<typename CommonGatewayRequest, typename Handler>
- void async_flush(CommonGatewayRequest& req, Handler handler)
- {
- if (!headers_sent_)
- {
- ostream_<< "Content-type: text/plain\r\n\r\n";
- headers_sent_ = true;
- }
- ::cgi::async_write(req, rdbuf()->data()
- , flush_handler<Handler>
- (*this, handler, boost::arg<1>()));
- }
-
-
- /// Synchronously send the reply to the default request
- /**
- * Note: The data in the stream isn't cleared after this call, but the
- * request held in the ostream is removed. ie. send() can't be called
- * twice without an arguement (unless you add another request - something
- * not possible yet).
- */
- //void send()
- //{
- // BOOST_ASSERT(request_ != NULL);
- // send(*request_);
- // request_ = NULL;
- //}
-
- /// Synchronously send the reply to the default request
- /**
- * Note: The data in the stream isn't cleared after this call. If the send
- * is sucessful, the request held in the ostream is removed. ie. send()
- * can't be called twice without an arguement (unless you add another
- * request - something not possible yet).
- */
- //boost::system::error_code& send(boost::system::error_code& ec)
- //{
- // BOOST_ASSERT(request_ != NULL);
- // if(!send(*request_, ec))
- // request_ = NULL;
- // return ec;
- //}
-
-
- /// Synchronously send the data via the supplied request
- /**
- * This call uses throwing semantics. ie. an exception will be thrown on
- * any failure.
- * Note: The data in the stream isn't cleared after this call.
- */
- template<typename CommonGatewayRequest>
- void send(CommonGatewayRequest& req)
- {
- if (!headers_sent_)
- {
- ostream_<< "Content-type: text/plain\r\n\r\n";
- headers_sent_ = true;
- }
- ::cgi::write(req.client(), rdbuf()->data());
- req.set_status(http_status_);
- }
-
- /// Synchronously send the data via the supplied request
- /**
- * This call uses error_code semantics. ie. ec is set if an error occurs.
- * Note: The data in the stream isn't cleared after this call.
- */
- template<typename CommonGatewayRequest>
- boost::system::error_code&
- send(CommonGatewayRequest& req, boost::system::error_code& ec)
- {
- if (!headers_sent_)
- {
- ostream_<< "Content-type: text/plain\r\n\r\n";
- headers_sent_ = true;
- }
- ::cgi::write(req.client(), rdbuf()->data(), ec);
- req.set_status(http_status_);
- return ec;
- }
-
- /// Asynchronously send the data through the supplied request
- /**
- * Note: The data in the stream isn't cleared after this call.
- */
- template<typename CommonGatewayRequest, typename Handler>
- void async_send(CommonGatewayRequest& req, Handler handler)
- {
- req.set_status(http_status_);
- if (!headers_sent_)
- {
- ostream_<< "Content-type: text/plain\r\n\r\n";
- headers_sent_ = true;
- }
- ::cgi::async_write(req, rdbuf()->data(), handler);
- }
-
- /// Get the buffer associated with the stream
- ::cgi::streambuf*
- rdbuf()
- {
- return static_cast<::cgi::streambuf*>(ostream_.rdbuf());
- }
-
- void set_status(const http::status_code& num)
- {
- http_status_ = num;
- }
-
- http::status_code& get_status()
- {
- return http_status_;
- }
-
- protected:
- std::vector<boost::asio::const_buffer> headers_;
- boost::shared_ptr<::cgi::streambuf> buffer_;
- std::ostream ostream_;
- http::status_code http_status_;
- bool headers_sent_;
-
- template<typename T>
- friend request_ostream& operator<<(request_ostream&, const T&);
- };
-
-
-
- /// Operator<< overload for basic outputting ability
- template<typename T>
- request_ostream& operator<<(request_ostream& os, const T& t)
- {
- os.ostream_<< t;
- return os;
- }
-
-} // namespace cgi
-
-#include "boost/cgi/detail/pop_options.hpp"
-
-#endif
-
-#endif // CGI_REQUEST_OSTREAM_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_service.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_service.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,168 +0,0 @@
-// -- request_service.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_REQUEST_SERVICE_HPP_INCLUDED
-#define CGI_REQUEST_SERVICE_HPP_INCLUDED
-
-#include "boost/cgi/detail/push_options.hpp"
-
-#include <boost/utility/enable_if.hpp>
-
-//#include "is_async.hpp"
-#include "boost/cgi/io_service.hpp"
-#include "boost/cgi/detail/protocol_traits.hpp"
-#include "boost/cgi/basic_protocol_service_fwd.hpp"
-#include "boost/cgi/detail/service_base.hpp"
-//#include "service_selector.hpp"
-
-namespace cgi {
- namespace common {
-
- /// The generic service class for basic_request<>s
- /**
- * Note: If the protocol is an asynchronous protocol, which means it requires
- * access to a boost::asio::io_service instance, then this class becomes a
- * model of the Service concept (**LINK**) and must only use the constructor
- * which takes a ProtocolService (**LINK**). If the protocol isn't async then
- * the class can be used without a ProtocolService.
- */
- template<typename Protocol>
- class request_service
- : public detail::service_base<request_service<Protocol> >
- {
- // The platform-specific implementation (only one for now)
- typedef typename detail::protocol_traits<Protocol>::request_service_impl
- service_impl_type;
-
- public:
- typedef typename service_impl_type::impl_type impl_type;
- typedef typename
- service_impl_type::implementation_type implementation_type;
- typedef Protocol protocol_type;
- typedef common::basic_protocol_service<Protocol> protocol_service_type;
-
- /// The unique service identifier
- //static boost::asio::io_service::id id;
- //explicit request_service()
- //{
- //}
-
- request_service(::cgi::io_service& ios)
- : detail::service_base<request_service<Protocol> >(ios)
- , service_impl_(boost::asio::use_service<service_impl_type>(ios))
- {
- }
-
- request_service(protocol_service_type& ps)
- : detail::service_base<request_service<Protocol> >(ps.io_service())
- , service_impl_(boost::asio::use_service<service_impl_type>(ps.io_service()))
- {
- }
-
- void construct(impl_type& impl)
- {
- service_impl_.construct(impl);
- }
-
- void destroy(impl_type& impl)
- {
- service_impl_.destroy(impl);
- }
-
- void shutdown_service()
- {
- service_impl_.shutdown_service();
- }
-
- impl_type null() const
- {
- return service_impl_.null();
- }
-
- //void construct
-
- boost::system::error_code&
- load(impl_type& impl, bool parse_stdin, boost::system::error_code& ec)
- {
- return service_impl_.load(impl, parse_stdin, ec);
- }
-
-
- template<typename Handler>
- void async_load(impl_type& impl, bool parse_stdin, Handler handler)
- {
- service_impl_.async_load(impl, parse_stdin, handler);
- }
-
- bool is_open(impl_type& impl)
- {
- return service_impl_.is_open(impl);
- }
-
- boost::system::error_code&
- set_header(impl_type& impl, const std::string& name
- , const std::string& value, boost::system::error_code& ec)
- {
- return service_impl_.set_header(impl, name, value, ec);
- }
-
-/*
- template<typename ConstBufferSequence>
- std::size_t write_some(impl_type& impl, const ConstBufferSequence& buf
- , boost::system::error_code& ec)
- {
- return service_impl_.write_some(impl, buf, ec);
- }
-
- template<typename MutableBufferSequence>
- std::size_t read_some(impl_type& impl, MutableBufferSequence buf
- , boost::system::error_code& ec)
- {
- return service_impl_.read_some(impl, buf, ec);
- }
-*/
- std::string
- GET(impl_type& impl, const std::string& name
- , boost::system::error_code& ec)
- {
- return service_impl_.GET(impl, name, ec);
- }
-
- std::string
- POST(impl_type& impl, const std::string& name
- , boost::system::error_code& ec)
- {
- return service_impl_.POST(impl, name, ec);
- }
-
- std::string
- cookie(impl_type& impl, const std::string& name
- , boost::system::error_code& ec)
- {
- return service_impl_.cookie(impl, name, ec);
- }
-
- /*
- std::string
- header(impl_type& impl, const std::string& name
- , boost::system::error_code& ec)
- {
- return "";
- }
-*/
-
- private:
- service_impl_type& service_impl_;
- };
-
- } // namespace common
-} // namespace cgi
-
-#include "boost/cgi/detail/pop_options.hpp"
-
-#endif // CGI_REQUEST_SERVICE_HPP_INCLUDED
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_service_fwd.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/request_service_fwd.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,28 +0,0 @@
-// -- request_service_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_REQUEST_SERVICE_FWD_HPP_INCLUDED
-#define CGI_REQUEST_SERVICE_FWD_HPP_INCLUDED
-
-
-namespace cgi {
-
- /// The generic service class for basic_request<>s
- /**
- * Note: If the protocol is an asynchronous protocol, which means it requires
- * access to a boost::asio::io_service instance, then this class becomes a
- * model of the Service concept (**LINK**) and must only use the constructor
- * which takes a ProtocolService (**LINK**). If the protocol isn't async then
- * the class can be used without a ProtocolService.
- */
- template<typename Protocol>
- class request_service;
-
-} // namespace cgi
-
-#endif // CGI_REQUEST_SERVICE_FWD_HPP_INCLUDED
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/response.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/response.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,447 +0,0 @@
-// -- response.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_RESPONSE_HPP_INCLUDED__
-#define CGI_RESPONSE_HPP_INCLUDED__
-
-#include "boost/cgi/detail/push_options.hpp"
-
-#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"
-#include "boost/cgi/header.hpp"
-#include "boost/cgi/write.hpp"
-#include "boost/cgi/basic_request_fwd.hpp"
-#include "boost/cgi/http/status_code.hpp"
-#include "boost/cgi/streambuf.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...
- * BOOST_CGI_ADD_DEFAULT_HEADER should not persiste beyond this file.
- *
- * It basically works like (default first):
- *
- * Debug mode:
- * - Append a "Content-type: text/plain" header;
- * - If BOOST_CGI_DEFAULT_CONTENT_TYPE is defined, set that as the
- * content-type;
- * - If BOOST_CGI_NO_DEFAULT_CONTENT_TYPE is defined, do nothing.
- *
- * Release mode:
- * - Do nothing.
- */
-#if !defined(NDEBUG) && !defined(BOOST_CGI_NO_DEFAULT_CONTENT_TYPE)
-//{
-# if !defined(BOOST_CGI_DEFAULT_CONTENT_TYPE)
-# define BOOST_CGI_DEFAULT_CONTENT_TYPE "Content-type: text/plain"
-# endif // !defined(BOOST_CGI_DEFAULT_CONTENT_TYPE)
-//}
-# define BOOST_CGI_ADD_DEFAULT_HEADER \
- if (headers_.empty()) \
- headers_.push_back(BOOST_CGI_DEFAULT_CONTENT_TYPE"\r\n");
-#else
-# define BOOST_CGI_ADD_DEFAULT_HEADER
-#endif // !defined(NDEBUG) && !defined(BOOST_CGI_NO_DEFAULT_CONTENT_TYPE)
-
-
-namespace cgi {
- namespace common {
-
- /// The response class: a helper for responding to requests.
- class response
- {
- public:
- typedef std::ostream ostream_type;
-
- response(http::status_code sc = http::ok)
- : buffer_(new ::cgi::streambuf())
- , ostream_(buffer_.get())
- , http_status_(sc)
- , headers_terminated_(false)
- {
- }
-
- /// Construct with a particular buffer
- /**
- * Takes the buffer and uses it internally, does nothing with it on
- * destruction.
- */
- response(::cgi::streambuf* buf, http::status_code sc = http::ok)
- : /*request_(NULL)
- , */ostream_(buf)
- , http_status_(sc)
- {
- }
-
- ~response()
- {
- }
-
- /// Clear the response buffer.
- void clear()
- {
- ostream_.clear();
- headers_.clear();
- headers_terminated_ = false;
- //buffer_->consume(
- }
-
- /// Return the response to the 'just constructed' state.
- void reset()
- {
- clear();
- headers_terminated_ = false;
- }
-
- // provide this too?
- std::size_t write(const char* str, std::size_t len)
- {
- ostream_.write(str, len);
- return len;
- }
-
- std::size_t write(const std::string& str)
- {
- return write(str.c_str(), str.size());
- }
-
- template<typename ConstBufferSequence>
- std::size_t write(const ConstBufferSequence& buf)
- {
- return ostream_.write(buf.begin(), buf.end());
- //return buf.size();
- }
-
- /// Synchronously flush the data to the supplied SyncWriteStream
- /**
- * This call uses throwing semantics. ie. an exception will be thrown on
- * any failure.
- * If there is no error, the buffer is cleared.
- */
- template<typename SyncWriteStream>
- void flush(SyncWriteStream& sws)
- {
- boost::system::error_code ec;
- flush(sws, ec);
- detail::throw_error(ec);
- }
-
- /// Synchronously flush the data via the supplied request
- /**
- * This call uses error_code semantics. ie. ec is set if an error occurs.
- * If there is no error, the buffer is cleared.
- */
- template<typename SyncWriteStream>
- boost::system::error_code
- flush(SyncWriteStream& sws, boost::system::error_code& ec)
- {
- if (!headers_terminated_)
- {
- std::vector<boost::asio::const_buffer> headers;
- prepare_headers(headers);//, ec);
- common::write(sws, headers, boost::asio::transfer_all(), ec);
- if (ec)
- return ec;
- }
-
- std::size_t bytes_written
- = common::write(sws, buffer_->data(), boost::asio::transfer_all(), ec);
- if (!ec)
- buffer_->consume(bytes_written);
-
- return ec;
- }
-
- /// Synchronously send the data via the supplied request.
- /**
- * This call uses throwing semantics. ie. an exception will be thrown on
- * any failure.
- * Note: The data in the stream isn't cleared after this call.
- */
- template<typename SyncWriteStream>
- void send(SyncWriteStream& sws)
- {
- boost::system::error_code ec;
- send(sws, ec);
- detail::throw_error(ec);
- }
-
- /// Synchronously send the data via the supplied request.
- /**
- * This call will not throw, but will set `ec` such that `ec == true` if
- * an error occurs. Details of the error are held in the `error_code`
- * object.
- */
- template<typename SyncWriteStream>
- boost::system::error_code
- send(SyncWriteStream& sws, boost::system::error_code& ec)
- {
- if (!headers_terminated_)
- {
- /* 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)
- common::write(sws, headers, boost::asio::transfer_all(), ec);
- }
-
- common::write(sws, buffer_->data(), boost::asio::transfer_all(), ec);
-
- 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
- * it could/should be. The data in the stream isn't cleared after
- * this call.
- */
- template<typename AsyncWriteStream, typename Handler>
- void async_send(AsyncWriteStream& aws, Handler handler)
- {
- aws.io_service().post(
- boost::bind(&response::do_async_send, aws, handler)
- );
- }
-
- template<typename AsyncWriteStream, typename Handler>
- void do_async_send(AsyncWriteStream& aws, Handler handler)
- {
-
-
- //req.set_status(http_status_);
- /*
- if (!headers_terminated_)
- {
- ostream_<< "Content-type: text/plain\r\n\r\n";
- headers_terminated_ = true;
- }
- */
- common::async_write(aws, rdbuf()->data(), handler);
- }
-
- /// Get the buffer associated with the stream
- common::streambuf*
- rdbuf()
- {
- return static_cast<common::streambuf*>(ostream_.rdbuf());
- }
-
- /// Set the status code associated with the response.
- response& set_status(const http::status_code& num)
- {
- http_status_ = num;
- return *this;
- }
-
- /// Get the status code associated with the response.
- http::status_code& status()
- {
- return http_status_;
- }
-
- /// Allow more headers to be added (WARNING: avoid using this).
- void unterminate_headers()
- {
- headers_terminated_ = false;
- }
-
- /// Get the length of the body of the response
- std::size_t content_length()
- {
- return rdbuf()->size();
- }
-
- /// Add a header after appending the CRLF sequence.
- response& set_header(const std::string& value)
- {
- BOOST_ASSERT(!headers_terminated_);
- headers_.push_back(value + "\r\n");
- return *this;
- }
-
- /// Format and add a header given name and value, appending CRLF.
- response& set_header(const std::string& name, const std::string& value)
- {
- BOOST_ASSERT(!headers_terminated_);
- headers_.push_back(name + ": " + value + "\r\n");
- return *this;
- }
-
- void clear_headers()
- {
- BOOST_ASSERT(!headers_terminated_);
- headers_.clear();
- }
-
- void reset_headers()
- {
- headers_.clear();
- headers_terminated_ = false;
- }
-
- bool headers_terminated() const
- {
- return headers_terminated_;
- }
- protected:
- // Vector of all the headers, each followed by a CRLF
- std::vector<std::string> headers_;
-
- // The buffer is a shared_ptr, so you can keep it cached elsewhere.
- boost::shared_ptr<common::streambuf> buffer_;
-
- ostream_type ostream_;
-
- http::status_code http_status_;
-
- // True if no more headers can be appended.
- bool headers_terminated_;
-
- 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.
- template<typename ConstBufferSequence>
- //boost::system::error_code
- void
- prepare_headers(ConstBufferSequence& headers)//, boost::system::error_code& ec)
- {
- BOOST_CGI_ADD_DEFAULT_HEADER
-
- // Terminate the headers.
- if (!headers_terminated_)
- headers_.push_back("\r\n");
-
- //{ Construct a ConstBufferSequence out of the headers we have.
- //std::vector<boost::asio::const_buffer> headers;
- typedef std::vector<std::string>::iterator iter;
- for (iter i(headers_.begin()), e(headers_.end()); i != e; ++i)
- {
- headers.push_back(common::buffer(*i));
- }
- //}
-
- headers_terminated_ = true;
- //return ec;
- }
- };
-
- /// Generic ostream template
- template<typename T>
- response& operator<<(response& resp, const T& t)
- {
- resp.ostream_<< t;
- return resp;
- }
-
- /// You can stream a cgi::header into a response.
- /**
- * This is just a more convenient way of doing:
- *
- * ``
- * resp.set_header(header_content)
- * ``
- *
- * [tip
- * If you stream a default-constructed header to a response, it
- * 'terminates' the headers. ie. You can do this if you want to ensure
- * no further headers are added to the response. It has no other side-
- * effects; for instance, it won't write any data to the client.
- * ]
- * /
- template<typename T>
- response& operator<<(response& resp, const ::cgi::basic_header<std::basic_string<T> >& hdr)
- {
- if (hdr.content.empty()) {
- resp.headers_terminated_ = true;
- return resp;
- }else{
- // We shouldn't allow headers to be sent after they're explicitly ended.
- BOOST_ASSERT(!resp.headers_terminated_);
- resp.set_header(hdr.content);
- return resp;
- }
- }*/
-
- template<>
- response& operator<<(response& resp, const ::cgi::common::header& hdr)
- {
- if (hdr.content.empty()) {
- resp.headers_terminated_ = true;
- return resp;
- }else{
- // We shouldn't allow headers to be sent after they're explicitly ended.
- BOOST_ASSERT(!resp.headers_terminated_);
- resp.set_header(hdr.content);
- return resp;
- }
- }
-
- /// You can stream a cgi::cookie into a response.
- /**
- * This is just a shorthand way of setting a header that will set a
- * client-side cookie.
- *
- * You cannot stream a cookie to a response after the headers have been
- * terminated. In this case, an alternative could be to use the HTML tag:
- * <meta http-equiv="Set-cookie" ...> (see http://tinyurl.com/3bxftv or
- * http://tinyurl.com/33znkj), but this is outside the scope of this
- * library.
- */
- template<typename T>
- response& operator<<(response& resp, basic_cookie<T> ck)
- {
- BOOST_ASSERT(!resp.headers_terminated());
- resp.set_header("Set-cookie", ck.to_string());
- return resp;
- }
-
- template<typename T>
- response& operator<<(response& resp, http::status_code status)
- {
- BOOST_ASSERT(!resp.headers_terminated());
- return resp.set_status(status);
- }
-
- } // namespace common
-} // namespace cgi
-
-#undef BOOST_CGI_ADD_DEFAULT_HEADER
-
-#include "boost/cgi/detail/pop_options.hpp"
-
-#endif // CGI_RESPONSE_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/return.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/return.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,54 +0,0 @@
-// -- return.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_RETURN_HPP_INCLUDED__
-#define CGI_RETURN_HPP_INCLUDED__
-
-#include "boost/cgi/response.hpp"
-#include "boost/cgi/basic_request.hpp"
-
-namespace cgi {
- namespace common {
-
- template<typename Response, typename Request>
- boost::system::error_code
- return_helper(Response& resp, Request& req, int program_status)
- {
- boost::system::error_code ec;
- resp.send(req.client(), ec);
- if (ec) return ec;
-
- req.close(resp.status(), program_status);
-
- return ec;
- }
-
- } // namespace common
-} // namespace cgi
-
-/// If an error occurs during the sending or closing then `status` will be
-// incremented by the value of this macro.
-#ifndef BOOST_CGI_RETURN_ERROR_INCREMENT
-# define BOOST_CGI_RETURN_ERROR_INCREMENT 100
-#endif
-
-#define BOOST_CGI_RETURN(resp, req, status) \
- if ( ::cgi::common::return_helper(resp, req, status)) \
- /** error **/ \
- return status + BOOST_CGI_RETURN_ERROR_INCREMENT; \
- return status;
-
-namespace cgi {
- namespace common {
-
-#define return_(resp, req, status) BOOST_CGI_RETURN(resp, req, status)
-
- } // namespace common
-} // namespace cgi
-
-#endif // CGI_RETURN_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/role_type.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/role_type.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,22 +0,0 @@
-#ifndef CGI_ROLE_TYPE_HPP_INCLUDED__
-#define CGI_ROLE_TYPE_HPP_INCLUDED__
-
-namespace cgi {
- namespace role {
-
- struct responder {};
- struct authorizer {};
- struct filter {};
-
- } // namespace role
-
- enum role_type
- { none
- , responder
- , authorizer
- , filter
- };
-
-} // namespace cgi
-
-#endif // CGI_ROLE_TYPE_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/status_type.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/status_type.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,26 +0,0 @@
-// -- status_type.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_STATUS_TYPE_HPP_INCLUDED__
-#define CGI_STATUS_TYPE_HPP_INCLUDED__
-
-namespace cgi {
-
- enum status_type
- { null
- , unloaded
- , activated
- , loaded
- , ok = loaded
- , aborted
- , closed
- };
-
-} // namespace cgi
-
-#endif // CGI_STATUS_TYPE_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/streambuf.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/streambuf.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,25 +0,0 @@
-// -- streambuf.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_STREAMBUF_HPP_INCLUDED__
-#define CGI_STREAMBUF_HPP_INCLUDED__
-
-#include <boost/asio/streambuf.hpp>
-
-namespace cgi {
- namespace common {
-
- using boost::asio::streambuf;
-
- } // namespace common
-
- using common::streambuf;
-
-} // namespace cgi
-
-#endif // CGI_STREAMBUF_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/tags.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/tags.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,50 +0,0 @@
-// -- tags.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_TAGS_HPP_INCLUDED__
-#define CGI_TAGS_HPP_INCLUDED__
-
-#if _MSC_VER > 1020
-#pragma once
-#endif
-
-namespace cgi {
-
- /// SCGI (note, this must be removed)
- struct scgi_{};
- /// FastCGI
- struct fcgi_{};
-
- namespace tags {
-
- // the null tag type
- struct null {};
-
- // protocol types
- struct cgi {};
- struct async_cgi {}; // call it acgi?
- struct acgi {};
- struct fcgi {};
- struct scgi {};
-
- // IoServiceProvider PoolingPolicy types
- struct single_service {};
- struct service_pool {};
- struct round_robin {};
-
- // Connection types
- struct stdio {};
- struct async_stdio {};
- struct tcp_socket {};
- // A shareable tcp_socket (ie. one that can be locked)
- struct shareable_tcp_socket {};
-
- } // namespace tags
-} // namespace cgi
-
-#endif // CGI_TAGS_HPP_INCLUDED__
Deleted: sandbox/SOC/2007/cgi/branches/release/boost/cgi/write.hpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/boost/cgi/write.hpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
+++ (empty file)
@@ -1,27 +0,0 @@
-// -- write.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_WRITE_HPP_INCLUDED
-#define CGI_WRITE_HPP_INCLUDED
-
-#include <boost/asio/write.hpp>
-
-namespace cgi {
- namespace common {
-
- using boost::asio::write;
- using boost::asio::async_write;
-
- } // namespace common
-
- //using common::write;
- //using common::async_write;
-
-} // namespace cgi
-
-#endif // CGI_WRITE_HPP_INCLUDED
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/build/Jamfile.v2
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/build/Jamfile.v2 (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/build/Jamfile.v2 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -3,13 +3,60 @@
# user-supplied variables (ie. using modules.peek, I think)
project boost/cgi
- : usage-requirements
+ : build-dir
+ $(top)/bin.v2
+ : requirements
<include>$(top)
<include>$(boost-root)
<library>/boost/thread/
<library>/boost/system/
+ <library>/boost/regex/
<define>_CRT_SECURE_NO_WARNINGS
<define>_SCL_SECURE_NO_WARNINGS
+ : usage-requirements
+ <include>$(top)
+ <include>$(boost-root)
+ <library>/boost/thread/
+ <library>/boost/system/
+ <library>/boost/regex/
+ <linkflags>-pthread
;
+import modules ;
+
+# make BB recognise .ipp files as .cpp files.
+import type ;
+type.register IPP : ipp : CPP ;
+
+path-constant impl : $(top)/boost/cgi/impl ;
+
+SOURCES =
+ $(impl)/form_parser.ipp
+ $(impl)/response.ipp
+ ;
+
+
+if [ MATCH "^(--build-cgi)" : [ modules.peek : ARGV ] ]
+{ # compile library
+ ECHO "Building CGI library" ;
+
+ lib boost_cgi
+ :
+ $(SOURCES)
+ :
+ <define>BOOST_CGI_BUILD_LIBRARY
+ ;
+}
+else
+{
+ alias boost_cgi ;
+}
+
+install install
+ :
+ boost_cgi
+ :
+ <location>/usr/local/lib
+ ;
+
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/doc/src/cgi.qbk
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/doc/src/cgi.qbk (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/doc/src/cgi.qbk 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -111,10 +111,14 @@
[/include:ug user_guide.qbk]
-[xinclude ../cgi_dox.xml]
+[/xinclude ../cgi_dox.xml]
+
+[include:reference reference.qbk]
[include:future future_development.qbk]
[include:server_support user_guide/server_support.qbk]
+[include troubleshooting.qbk]
+
[include acknowledgements.qbk]
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/doc/src/reference.qbk
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/doc/src/reference.qbk (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/doc/src/reference.qbk 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -7,8 +7,58 @@
[section:ref Reference]
+[xinclude ../cgi_dox.xml]
+
+[h2 Quick Reference]
+
Reference coming...
-[/include request_objects.qbk]
+Requests
+
+ * Request Data
+ * environment
+ * operator[""] (operator[] on the environment map)
+ * operator[env] (request meta-data)
+ * operator[get] (GET data)
+ * operator[post] (POST data)
+ * operator[cookies] (cookie data)
+ * member functions
+ * script_name()
+ * request_method()
+ * content_length()
+ * content_encoding()
+ * etc...
+ * constructors
+ * load()
+ * async_load()
+ * close()
+ * clear()
+ * id()
+ * client()
+
+Acceptor
+
+ * constructors
+ * accept()
+ * async_accept()
+ * cancel()
+
+
+Service
+
+ * run()
+ * stop()
+ * reset()
+ * get_io_service()
+
+Responses
+
+ * operator<<
+ * send()
+ * clear()
+ * data()
+ * content_length()
+
+
+[endsect] [/ ref]
-[endsect]
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/Jamfile.v2
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/Jamfile.v2 (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/Jamfile.v2 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -6,6 +6,7 @@
project boost/cgi/example
: requirements
+ <library>/boost/cgi/
<library>/boost/system/
<library>/boost/thread/
;
@@ -17,6 +18,8 @@
# Build all of the fcgi examples
build-project fcgi ;
+alias all_examples : cgi acgi fcgi ;
+
install cgi-install
: # sources
cgi//install
@@ -38,6 +41,8 @@
<location>$(fcgi-bin)
;
+alias install : cgi//install acgi//install fcgi//install ;
+
explicit cgi-install ;
explicit acgi-install ;
explicit fcgi-install ;
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/amortization/main.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/amortization/main.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/amortization/main.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -38,10 +38,10 @@
template<typename Request>
void fill_amortization_dictionary(google::TemplateDictionary& dict, Request& req)
{
- std::string tmp( req.POST("LoanAmt") );
+ std::string tmp( req[post]["LoanAmt"] );
dict.SetValue("LoanAmt", tmp.empty() ? "$250,000" : tmp);
- tmp = req.POST("YearlyIntRate");
+ tmp = req[post]["YearlyIntRate"];
dict.SetValue("YearlyIntRate", tmp.empty() ? "6.000" : tmp);
boost::array<std::string, 8> year_opts
@@ -52,13 +52,13 @@
dict.SetValueAndShowSection("TermYrs", year, "SELECT_TERM_YEARS");
}
- if (req.POST("Amortize").empty())
+ if (req[post]["Amortize"].empty())
dict.ShowSection("NotAmortize");
else
{
- double P = boost::lexical_cast<double>(string_from_currency(req.POST("LoanAmt")));
- double i = boost::lexical_cast<double>(req.POST("YearlyIntRate")) / 1200;
- double n = boost::lexical_cast<double>(req.POST("TermYrs")) * 12;
+ double P = boost::lexical_cast<double>(string_from_currency(req[post]["LoanAmt"]));
+ double i = boost::lexical_cast<double>(req[post]["YearlyIntRate"]) / 1200;
+ double n = boost::lexical_cast<double>(req[post]["TermYrs"]) * 12;
double monthly_payments = (P*i) / (1 - std::pow((1+i), -n));
google::TemplateDictionary* sub_dict = dict.AddSectionDictionary("RegPmtSummary");
@@ -103,7 +103,7 @@
google::Template* tmpl
= google::Template::GetTemplate("example.tpl", google::STRIP_WHITESPACE);
- std::string arg(req.GET("arg"));
+ std::string arg(req[get]["arg"]);
if (arg.empty())
arg = "4"; // Make this the default
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/cookie_game/main.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/cookie_game/main.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/cookie_game/main.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -1,5 +1,4 @@
#include <boost/cgi/acgi.hpp>
-#include <boost/cgi/response.hpp>
#define SCRIPT_NAME "acgi_cookie_game"
@@ -49,17 +48,17 @@
response resp;
- if (req.GET("reset") == "true")
+ if (req[get]["reset"] == "true")
{
- resp<< cookie("name")
- << location(req.script_name())
- << content_type("text/plain");
+ resp<< cookie("name").to_string()
+ << location (req.script_name()) // redirect them.
+ << content_type ("text/plain");
resp.send(req.client());
return 0;
}
// First, see if they have a cookie set
- std::string name = req[cookie_data]["name"];
+ std::string name = req[cookies]["name"];
if (!name.empty())
{
resp<< header("Content-type", "text/html")
@@ -74,7 +73,7 @@
if (!name.empty())
{
resp<< header("Content-type", "text/html")
- << cookie("name", name)
+ << cookie("name", name).to_string()
<< "Hello there, " << "<a href=''>" << name << "</a>";
resp.send(req.client());
return 0;
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/doc.qbk
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/doc.qbk (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/doc.qbk 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -1,6 +1,10 @@
[section aCGI Examples]
+Things in the `acgi` namespace are 'Asio-enabled' versions of those in the `cgi` namespace. The aCGI (*a* for asynchronous) parts of the library are especially useful if you are writing long-running CGI applications that could benefit from using asynchronous I/O or asynchronous event dispatching.
+
+If not, there may be a small speed/size gain to be had from the plain CGI components.
+
[include hello_world/doc.qbk]
[include echo/doc.qbk]
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/echo/Jamfile.v2
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/echo/Jamfile.v2 (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/echo/Jamfile.v2 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,8 +9,8 @@
exe acgi_echo
:
main.cpp
- /boost/regex/
- /boost/thread/
+ :
+ <library>/boost/cgi/
;
# Our install rule (builds binaries and copies them to <location>)
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/echo/main.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/echo/main.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/echo/main.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -15,8 +15,10 @@
// variables QUERY_STRING and HTTP_COOKIE respectively.
//
-#include <boost/cgi/acgi.hpp>
#include <fstream>
+#include <cstdio>
+///////////////////////////////////////////////////////////
+#include "boost/cgi/acgi.hpp"
using namespace std;
using namespace boost::acgi;
@@ -27,13 +29,25 @@
void show_map_contents(OStreamT& os, MapT& m, const std::string& title)
{
os<< "<h3>" << title << "</h3>";
- if (m.empty()) os<< "NONE<br />";
- for (typename MapT::const_iterator i = m.begin(); i != m.end(); ++i)
- {
- os<< "<b>" << i->first << "</b> = <i>" << i->second << "</i><br />";
- }
+ if (m.empty())
+ os<< "NONE<br />";
+ else
+ for (typename MapT::const_iterator i = m.begin(); i != m.end(); ++i)
+ {
+ os<< "<b>" << i->first << "</b> = <i>" << i->second << "</i><br />";
+ }
}
+std::size_t process_id()
+{
+#if defined(BOOST_WINDOWS)
+ return _getpid();
+#else
+ return getpid();
+#endif
+}
+
+
int main()
{
try{
@@ -52,20 +66,21 @@
if (ec)
{
response resp;
- resp
- << content_type("text/html")
- << "Error " << ec.value() << ": " << ec.message() << "<p />"
- "--Original message follows--"
- "<p />";
+ resp<< content_type("text/html")
+ << "Error " << ec.value() << ": " << ec.message() << "<p />"
+ "--Original message follows--"
+ "<p />";
resp.send(req.client());
}
response resp;
resp<< content_type("text/html")
+ << "Request ID = " << req.id() << "<br />"
+ << "Process ID = " << process_id() << "<br />"
<< "<form method=POST enctype='multipart/form-data'>"
- "<input type=text name=name value='" << req.POST("name") << "' />"
+ "<input type=text name=name value='" << req[post]["name"] << "' />"
"<br />"
- "<input type=text name=hello value='" << req.POST("hello") << "' />"
+ "<input type=text name=hello value='" << req[post]["hello"] << "' />"
"<br />"
"<input type=file name=user_file />"
"<input type=hidden name=cmd value=multipart_test />"
@@ -73,10 +88,10 @@
"<input type=submit value=submit />"
"</form><p />";
- show_map_contents(resp, req[get_data], "GET Variables");
- show_map_contents(resp, req[post_data], "POST Variables");
- show_map_contents(resp, req[cookie_data], "Cookie Variables");
- show_map_contents(resp, req[env_data], "Environment Variables");
+ show_map_contents(resp, req[env], "Environment Variables");
+ show_map_contents(resp, req[get], "GET Variables");
+ show_map_contents(resp, req[post], "POST Variables");
+ show_map_contents(resp, req[cookies], "Cookie Variables");
return_(resp, req, 0); // All ok.
@@ -101,12 +116,12 @@
// are reached.
}catch(std::exception* e){
- std::cerr
+ std::cout
<< content_type("text/plain").content
<< "Exception: " << e->what();
return 3;
}catch(...){
- std::cerr<< content_type("text/plain").content
+ std::cout<< content_type("text/plain").content
<< "Unknown error.";
return 4;
}
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/hello_world/main.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/hello_world/main.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/hello_world/main.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -13,7 +13,6 @@
//
#include <boost/cgi/acgi.hpp>
-#include <boost/cgi/return.hpp>
using namespace std;
using namespace boost::acgi;
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/login/CheckCookie.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/login/CheckCookie.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/login/CheckCookie.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -12,10 +12,10 @@
response resp;
- if (!req.cookie("uuid").empty())
+ if (!req[cookie_data]["uuid"].empty())
{ // The cookie has been set correctly!
boost::system::error_code ec;
- std::string fwd(req.form("fwd", ec));
+ std::string fwd (req[form_data]["fwd"]);
resp<< location(fwd);
// resp<< location(req.form("fwd"));
}else
@@ -31,7 +31,7 @@
"<p>You have cookies disabled. They are required for logging in.</p>"
"<a href='http://www.google.com/search?q=enabling cookies'>Google it</a>"
" if you're stuck, or return to "
- "<a href='" << req.env("referrer") << "'>where you came from</a>"
+ "<a href='" << req[env_data]["referrer"] << "'>where you came from</a>"
"</center>"
"</body>"
"</html>";
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/login/Login.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/login/Login.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/login/Login.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -13,8 +13,8 @@
"You provided the following data:"
"<p>"
"<h3>Form data:</h3>";
- for (boost::acgi::map::iterator i = req.form().begin();
- i != req.form().end();
+ for (boost::acgi::map::iterator i = req[form_data].begin();
+ i != req[form_data].end();
++i)
{
resp<< "<b>" << i->first << "</b> = <i>" << i->second << "</i>";
@@ -54,12 +54,13 @@
<< content_type("text/html")
<< "<html>"
"<head><title>Redirecting...</title>"
- "<meta http-equiv='refresh' content='5;url="<< req.POST("fwd") <<"' />"
+ "<meta http-equiv='refresh' content='5;url="
+ << req[post_data]["fwd"] <<"' />"
"</head>"
"<body>"
"<center>"
"You are already logged in. You should be redirected "
- "<a href='"<< req.POST("fwd") <<"'>here</a>"
+ "<a href='"<< req[post_data]["fwd"] <<"'>here</a>"
" in five seconds."
"</center>";
show_passed_variables(req, resp);
@@ -85,7 +86,8 @@
"<span class='red'>Your user name must only use letters, numbers or "
"the underscore character."
"</span>"
- "<input type='text' name='name' value='"<< req.POST("name") <<"' />"
+ "<input type='text' name='name' value='"
+ << req[post_data]["name"] <<"' />"
"<input type='button' name='cmd' value='login' />"
"</form>"
"</center>";
@@ -133,18 +135,18 @@
// If there's already a session id set, warn them and then redirect
// them to where they would be going anyway.
- if (!req.cookie("uuid").empty()) {
+ if (!req[cookie_data]["uuid"].empty()) {
return show_already_logged_in_page(req, resp);
}
// If they haven't asked explicitly to log in, show the default page.
- string cmd(req.POST("cmd"));
+ string cmd (req[post_data]["cmd"]);
if (cmd.empty() || cmd != "login") {
return show_default_page(req, resp);
}
// If they're name is invalid, inform them.
- string name(req.POST("name"));
+ string name (req[post_data]["name"]);
if (!verify_name(name)) {
return show_name_error_page(req, resp);
}
@@ -153,7 +155,7 @@
// Here we give them a 'universally unique id' and forward them to a
// cookie checking page.
resp<< cookie("uuid", make_uuid())
- << location("CheckCookie?fwd=" + req.POST("fwd"));
+ << location("CheckCookie?fwd=" + req[post_data]["fwd"]);
resp.send(req.client());
return req.close(http::ok);
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/login/Logout.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/login/Logout.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/acgi/login/Logout.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -14,7 +14,7 @@
resp<< cookie("uuid");
boost::system::error_code ec;
- std::string fwd(req.form("fwd", ec));
+ std::string fwd (req[form_data]["fwd"]);
resp<< location(fwd);
resp.send(req.client());
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/cgi/echo/Jamfile.v2
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/cgi/echo/Jamfile.v2 (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/cgi/echo/Jamfile.v2 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -7,9 +7,10 @@
project boost/cgi/example/cgi/echo ;
exe cgi_echo
- : main.cpp
- /boost/thread/
- /boost/regex/
+ :
+ main.cpp
+ :
+ <library>/boost/cgi/
;
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/cgi/echo/main.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/cgi/echo/main.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/cgi/echo/main.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -19,27 +19,30 @@
using namespace boost::cgi;
+//
// This function writes the title and map contents to the ostream in an
// HTML-encoded format (to make them easier on the eye).
+//
template<typename OStreamT, typename MapT>
void show_map_contents(OStreamT& os, MapT& m, const std::string& title)
{
os<< "<h3>" << title << "</h3>";
- if (m.empty()) os<< "NONE<br />";
- for (typename MapT::iterator i = m.begin(); i != m.end(); ++i)
- {
- os<< "<b>" << i->first << "</b> = <i>" << i->second << "</i><br />";
- }
+
+ if (m.empty())
+ os<< "NONE<br />";
+ else
+ for (typename MapT::const_iterator i = m.begin(); i != m.end(); ++i)
+ os<< "<b>" << i->first << "</b> = <i>"
+ << i->second << "</i><br />";
}
int main()
{
- request req;
-
- req.load(true); // The 'true' means parse STDIN data too.
-
+ request req; // A basic CGI request auto-parses everything (including POST data).
response resp;
+ resp<< "Request id = " << req.id() << "<p/>";
+
show_map_contents(resp, req[env_data], "Environment Variables");
show_map_contents(resp, req[get_data], "GET Variables");
show_map_contents(resp, req[post_data], "POST Variables");
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/echo/main.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/echo/main.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/echo/main.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -16,10 +16,12 @@
//
#include <fstream>
+///////////////////////////////////////////////////////////
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/program_options/environment_iterator.hpp>
-
-#include <boost/cgi/fcgi.hpp>
+///////////////////////////////////////////////////////////
+#include "boost/cgi/fcgi.hpp"
+#include "boost/cgi/common/header.hpp"
using namespace std;
using namespace boost::fcgi;
@@ -27,10 +29,12 @@
// This is a file to put internal logging info into
#define LOG_FILE "/var/www/log/fcgi_echo.txt"
-// This function writes the title and map contents to the ostream in an
-// HTML-encoded format (to make them easier on the eye).
+//
+// Write the title and map contents to the ostream in an HTML-encoded
+// format (to make them easier on the eye).
+//
template<typename Map, typename OStream>
-void format_map(Map& m, OStream& os, const std::string& title)
+void format_map(OStream& os, Map& m, const std::string& title)
{
os<< "<h2>" << title << "</h2>";
if (m.empty()) os<< "NONE<br />";
@@ -41,46 +45,75 @@
}
}
-/// This function accepts and handles a single request.
-template<typename Service, typename Acceptor, typename LogStream>
-int handle_request(Service& s, Acceptor& a, LogStream& of)
+std::size_t process_id()
{
- // First we construct a `request` object.
- request req(s); // This is in a protocol-specific state at the moment.
+#if defined(BOOST_WINDOWS)
+ return _getpid();
+#else
+ return getpid();
+#endif
+}
- of<< "Constructed request" << endl;
+/// This function accepts and handles a single request.
+template<typename Request, typename LogStream>
+int handle_request(Request& req, LogStream& of)
+{
boost::system::error_code ec;
- // The program blocks here until a request arrives.
- a.accept(req, ec);
-
of<< "Called accept" << endl;
// Result should be "Success".
of<< "Accept had result: " << ec.message() << endl;
+ //
// Load in the request data so we can access it easily.
+ //
req.load(ec, true); // The 'true' means read and parse STDIN (ie. POST) data.
+ //
// Construct a `response` object (makes writing/sending responses easier).
+ //
response resp;
+ //
// Responses in CGI programs require at least a 'Content-type' header. The
// library provides helpers for several common headers:
+ //
resp<< content_type("text/html")
// You can also stream text to a response object.
- << "Hello there, universe!<p />";
+ << "Hello there, universe!<p />"
+ << "Request id = " << req.id() << "<p />"
+ << "Process id = " << process_id() << "<p />"
+ << "<form method=POST enctype='multipart/form-data'>"
+ "<input type=text name=name value='" << req[post]["name"] << "' />"
+ "<br />"
+ "<input type=text name=hello value='" << req[post]["hello"] << "' />"
+ "<br />"
+ "<input type=file name=user_file />"
+ "<input type=hidden name=cmd value=multipart_test />"
+ "<br />"
+ "<input type=submit value=submit />"
+ "</form><p />";
+ //
// Use the function defined above to show some of the request data.
- format_map(req.env(), resp, "Environment Variables");
- format_map(req.GET(), resp, "GET Variables");
- format_map(req.cookie(), resp, "Cookie Variables");
+ //
+ format_map(resp, req[env], "Environment Variables");
+ format_map(resp, req[get], "GET Variables");
+ format_map(resp, req[post], "POST Variables");
+ format_map(resp, req[cookies], "Cookie Variables");
+ //
// Response headers can be added at any time before send/flushing it:
- resp<< "<content-length == " << content_length(resp.content_length())
- << content_length(resp.content_length());
+ //
+ resp<< "<content-length == "
+ << content_length(resp)
+ << content_length(resp) << ">";
+ //
+ //
// This funky macro finishes up:
return_(resp, req, 0);
+ //
// It is equivalent to the below, where the third argument is represented by
// `program_status`:
//
@@ -89,6 +122,7 @@
// return program_status;
//
// Note: in this case `program_status == 0`.
+ //
}
int main()
@@ -110,15 +144,27 @@
// Make an `acceptor` for accepting requests through.
acceptor a(s);
+ //
// After the initial setup, we can enter a loop to handle one request at a
// time until there's an error of some sort.
+ //
int ret(0);
for (;;)
{
- ret = handle_request(s, a, of);
- of<< "handle_request() returned: " << ret << endl;
- if (ret)
- break;
+ request req(s);
+ //
+ // Now we enter another loop that reuses the request's connection (and
+ // memory - makes things more efficient). You should always do this for
+ // now; this requirement will be removed in future.
+ //
+ for (;;)
+ {
+ a.accept(req);
+ ret = handle_request(req, of);
+ of<< "handle_request() returned: " << ret << endl;
+ if (ret)
+ break;
+ }
}
return ret;
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server1/main.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server1/main.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server1/main.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -20,23 +20,16 @@
// This is very similar to the fcgi_echo example.
//
-#include <fstream>
-#include <boost/bind.hpp>
-#include <boost/date_time/posix_time/posix_time.hpp>
-#include <boost/program_options/environment_iterator.hpp>
-
-#include <boost/cgi/fcgi.hpp>
+#include "boost/cgi/fcgi.hpp"
+#include "./server.hpp"
using namespace std;
using namespace boost::fcgi;
-// This is a file to put internal logging info into
-#define LOG_FILE "/var/www/log/fcgi_server1.txt"
-
// This function writes the title and map contents to the ostream in an
// HTML-encoded format (to make them easier on the eye).
-template<typename Map, typename OStream>
-void format_map(Map& m, OStream& os, const std::string& title)
+template<typename OStream, typename Map>
+void format_map(OStream& os, Map& m, const std::string& title)
{
os<< "<h2>" << title << "</h2>";
if (m.empty()) os<< "NONE<br />";
@@ -47,150 +40,62 @@
}
}
-/// The handle_request member function is used to handle requests.
-/**
- * A struct is used here just so a single log file can be shared between
- * requests. Note that access to the log file isn't synchronised (this doesn't
- * matter with this example).
- */
-struct request_handler
-{
- request_handler(const std::string& file_name)
- : log_(file_name.c_str())
- {
- if (!log_)
- {
- std::cerr<< "[fcgi] Couldn't open file: \"" LOG_FILE "\"." << endl;
- throw std::runtime_error("Couldn't open log file");
- }
-
- log_<< boost::posix_time::second_clock::local_time() << endl;
- }
-
- int handle_request(fcgi::request& req, boost::system::error_code& ec)
- {
- std::ofstream log_(LOG_FILE, std::ios::app);
- //log_<< "Handling request" << endl
- // << "QUERY_STRING := " << req.query_string() << std::endl;
-
- // Construct a `response` object (makes writing/sending responses easier).
- response resp;
-
- // Responses in CGI programs require at least a 'Content-type' header. The
- // library provides helpers for several common headers:
- resp<< content_type("text/html")
- // You can also stream text to a response object.
- << "Hello there, universe!<p />";
-
- // Use the function defined above to show some of the request data.
- format_map(req.env(), resp, "Environment Variables");
- format_map(req.GET(), resp, "GET Variables");
- format_map(req.cookie(), resp, "Cookie Variables");
-
- // Response headers can be added at any time before send/flushing it:
- resp<< "<content-length == " << content_length(resp.content_length())
- << content_length(resp.content_length());
-
- //log_<< "Handled request, handling another." << std::endl;
-
- // This funky macro finishes up:
- return_(resp, req, 0);
- // It is equivalent to the below, where the third argument is represented by
- // `program_status`:
- //
- // resp.send(req.client());
- // req.close(resp.status(), program_status);
- // return program_status;
- //
- // Note: in this case `program_status == 0`.
- }
-
-private:
- std::ofstream log_;
-};
-
-
-/// The server is used to abstract away protocol-specific setup of requests.
-/**
- * This server only works with FastCGI, but as you can see in the
- * request_handler::handle_request() function above, the request in there could
- * just as easily be a cgi::request.
- *
- * Later examples will demonstrate making protocol-independent servers.
- * (**FIXME**)
- */
-class server
+/// The handle_request function handles a single request.
+int handle_request(request& req, boost::system::error_code& ec)
{
-public:
- typedef fcgi::request request_type;
- typedef boost::function<
- int ( request_type&
- , boost::system::error_code&)
- > function_type;
-
- server(const function_type& handler)
- : handler_(handler)
- , service_()
- , acceptor_(service_)
- {}
+ // Construct a `response` object (makes writing/sending responses easier).
+ response resp;
- int run()
- {
- // Create a new request (on the heap - uses boost::shared_ptr<>).
- request_type::pointer new_request = request_type::create(service_);
- // Add the request to the set of existing requests.
- requests_.insert(new_request);
-
- int ret(0);
- for (;;)
- {
- boost::system::error_code ec;
-
- acceptor_.accept(*new_request, ec);
-
- if (ec)
- {
- std::cerr<< "Error accepting: " << ec.message() << std::endl;
- return 5;
- }
-
- // Load in the request data so we can access it easily.
- new_request->load(ec, true); // The 'true' means read and parse POST data.
-
- ret = handler_(*new_request, ec);
-
- if (ret)
- break;
- }
- return ret;
- }
-
-private:
- function_type handler_;
- fcgi::service service_;
- fcgi::acceptor acceptor_;
- std::set<request_type::pointer> requests_;
-};
+ // Responses in CGI programs require at least a 'Content-type' header. The
+ // library provides helpers for several common headers:
+ resp<< content_type("text/html")
+ // You can also stream text to a response object.
+ << "Hello there, universe!<p />";
+
+ // Use the function defined above to show some of the request data.
+ format_map(resp, req[env_data], "Environment Variables");
+ format_map(resp, req[get_data], "GET Variables");
+ format_map(resp, req[cookie_data], "Cookie Variables");
+ // Response headers can be added at any time before send/flushing it:
+ resp<< "<h3>Response Length</h3>" << resp.content_length()
+ // response::content_length() returns the length of the *body*
+ // of the response (ie. not including the headers).
+ << content_length(resp);
+
+ // This funky macro finishes up:
+ return_(resp, req, 0);
+ // It is equivalent to the below, where the third argument is represented by
+ // `program_status`:
+ //
+ // resp.send(req.client());
+ // req.close(resp.status(), program_status);
+ // return program_status;
+ //
+ // Note: in this case `program_status == 0`.
+}
+///////////////////////////////////////////////////////////
int main()
+///////////////////////////////////////////////////////////
try
{
- request_handler rh(LOG_FILE);
-
- server s(boost::bind(&request_handler::handle_request
- , &rh, _1, _2)
- );
+ server4 s(&handle_request);
return s.run();
-
-}catch(boost::system::system_error& se){
- cerr<< "[fcgi] System error: " << se.what() << endl;
+
+}
+catch(boost::system::system_error& se){
+ cerr<< "[fcgi] System error (" << se.code() << "): "
+ << se.what() << endl;
return 1313;
-}catch(exception& e){
+}
+catch(exception& e){
cerr<< "[fcgi] Exception: " << e.what() << endl;
return 666;
-}catch(...){
- cerr<< "[fcgi] Uncaught exception!" << endl;
+}
+catch(...){
+ cerr<< "[fcgi] Unknown exception!" << endl;
return 667;
}
//]
+
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server2/main.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server2/main.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server2/main.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -21,17 +21,16 @@
// Unlike in the server1 example, the server class in this example uses
// asynchronous functions, to increase throughput.
//
-//
-// **FIXME**
-// This is slower than the server1 example, which is stupid.
#include <fstream>
+///////////////////////////////////////////////////////////
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/program_options/environment_iterator.hpp>
-
-#include <boost/cgi/fcgi.hpp>
+///////////////////////////////////////////////////////////
+#include "boost/cgi/fcgi.hpp"
using namespace std;
+using namespace boost;
using namespace boost::fcgi;
@@ -55,34 +54,34 @@
* corresponding to the error.
*/
int handle_request(fcgi::request& req, boost::system::error_code& ec)
- {
- // Construct a `response` object (makes writing/sending responses easier).
- response resp;
+{
+ // Construct a `response` object (makes writing/sending responses easier).
+ response resp;
- // Responses in CGI programs require at least a 'Content-type' header. The
- // library provides helpers for several common headers:
- resp<< content_type("text/html")
- // You can also stream text to a response object.
- << "Hello there, universe!<p />";
-
- // Use the function defined above to show some of the request data.
- format_map(resp, req[env_data], "Environment Variables");
- format_map(resp, req[get_data], "GET Variables");
- format_map(resp, req[cookie_data], "Cookie Variables");
-
- //log_<< "Handled request, handling another." << std::endl;
-
- // This funky macro finishes up:
- return_(resp, req, 0);
- // It is equivalent to the below, where the third argument is represented by
- // `program_status`:
- //
- // resp.send(req.client());
- // req.close(resp.status(), program_status);
- // return program_status;
- //
- // Note: in this case `program_status == 0`.
- }
+ // Responses in CGI programs require at least a 'Content-type' header. The
+ // library provides helpers for several common headers:
+ resp<< content_type("text/html")
+ // You can also stream text to a response object.
+ << "Hello there, universe!<p />";
+
+ // Use the function defined above to show some of the request data.
+ format_map(resp, req[env_data], "Environment Variables");
+ format_map(resp, req[get_data], "GET Variables");
+ format_map(resp, req[cookie_data], "Cookie Variables");
+
+ //log_<< "Handled request, handling another." << std::endl;
+
+ // This funky macro finishes up:
+ return_(resp, req, 0);
+ // It is equivalent to the below, where the third argument is represented by
+ // `program_status`:
+ //
+ // resp.send(req.client());
+ // req.close(resp.status(), program_status);
+ // return program_status;
+ //
+ // Note: in this case `program_status == 0`.
+}
/// The server is used to abstract away protocol-specific setup of requests.
@@ -192,8 +191,8 @@
}catch(boost::system::system_error& se){
cerr<< "[fcgi] System error: " << se.what() << endl;
return 1313;
-}catch(exception& e){
- cerr<< "[fcgi] Exception: " << e.what() << endl;
+}catch(std::exception* e){
+ cerr<< "[fcgi] Exception: " << e->what() << endl;
return 666;
}catch(...){
cerr<< "[fcgi] Uncaught exception!" << endl;
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server3/main.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server3/main.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server3/main.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -21,13 +21,15 @@
//
#include <fstream>
+///////////////////////////////////////////////////////////
#include <boost/thread.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/program_options/environment_iterator.hpp>
-
-#include <boost/cgi/fcgi.hpp>
+///////////////////////////////////////////////////////////
+#include "boost/cgi/fcgi.hpp"
using namespace std;
+using namespace boost;
using namespace boost::fcgi;
/// Handle one request and return.
@@ -139,8 +141,8 @@
}catch(boost::system::system_error& se){
cerr<< "[fcgi] System error: " << se.what() << endl;
return 1313;
-}catch(exception& e){
- cerr<< "[fcgi] Exception: " << e.what() << endl;
+}catch(std::exception* e){
+ cerr<< "[fcgi] Exception: " << e->what() << endl;
return 666;
}catch(...){
cerr<< "[fcgi] Uncaught exception!" << endl;
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server4/main.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server4/main.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/example/fcgi/server4/main.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -29,6 +29,7 @@
#include <boost/cgi/fcgi.hpp>
using namespace std;
+using namespace boost;
using namespace boost::fcgi;
/// Handle one request and return.
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/Jamfile.v2
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/Jamfile.v2 (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/Jamfile.v2 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -15,3 +15,8 @@
build-project compile ;
build-project run ;
build-project compile_fail ;
+
+if [ MATCH "^(--build-examples)" : [ modules.peek : ARGV ] ]
+{
+ build-project ../example//all_examples ;
+}
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/compile/is_async_test.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/compile/is_async_test.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/compile/is_async_test.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -1,10 +1,10 @@
#include <boost/static_assert.hpp>
-#include "boost/cgi/is_async.hpp"
+#include "boost/cgi/common/is_async.hpp"
int main()
{
- using namespace cgi;
+ using namespace cgi::common;
BOOST_STATIC_ASSERT(is_async<tags::cgi>::value == false);
BOOST_STATIC_ASSERT(is_async<tags::async_cgi>::value == true);
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/compile/response.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/compile/response.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/compile/response.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -1,4 +1,4 @@
-#include <boost/cgi/response.hpp>
+#include <boost/cgi/common/response.hpp>
int main(int, char**)
{
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/Jamfile.v2
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/Jamfile.v2 (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/Jamfile.v2 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,6 +9,7 @@
<library>/boost/test//boost_unit_test_framework/
<library>/boost/system/
<library>/boost/thread/
+ <library>/boost/regex/
;
#local rule run-test( name )
@@ -24,11 +25,16 @@
[ run cookie.cpp ]
[ run response.cpp ]
+ [ run cgi_simple_request.cpp ]
+ [ run acgi_simple_request.cpp ]
+ [ run name_test.cpp ]
+ [ run map_test.cpp ]
;
test-suite wget_test
:
- [ run wget.cpp : "--log_level=message" ]
+ #[ run wget.cpp : "--log_level=message" ]
+ [ run hello_world.cpp /boost/filesystem/ ]
;
explicit wget_test ;
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/cookie.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/cookie.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/cookie.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -9,7 +9,7 @@
#include <boost/test/unit_test.hpp>
#include <sstream>
-#include "boost/cgi/cookie.hpp"
+#include "boost/cgi/common/cookie.hpp"
BOOST_AUTO_TEST_CASE( cookie_constructor_delete )
@@ -18,6 +18,7 @@
// delete the cookie. ie. set its value to NULL and give it a date
// in the past
using namespace cgi;
+ using cgi::common::cookie;
using namespace std;
string ex("Fri, 05-Jun-1989 15:30:00 GMT");
@@ -38,6 +39,7 @@
{
// Check the full version of the constructor works (simple test)
using namespace cgi;
+ using cgi::common::cookie;
using namespace std;
string ex("Wed, 03-Oct-2007 16:26:06 GMT");
@@ -62,6 +64,7 @@
// delete the cookie. ie. set its value to NULL and give it a date
// in the past
using namespace cgi;
+ using cgi::common::cookie;
using namespace std;
string cookie_content(
Modified: sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/response.cpp
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/response.cpp (original)
+++ sandbox/SOC/2007/cgi/branches/release/libs/cgi/test/run/response.cpp 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -1,8 +1,19 @@
-// Test the cgi::response class works as advertised
+// -- response.hpp --
+//
+// Copyright (c) Darren Garvey 2007-2008.
+// 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)
+//
+////////////////////////////////////////////////////////////////
+//
+// Test the cgi::response class works as advertised.
+//
+
#define BOOST_TEST_MODULE response_test
#include <boost/test/unit_test.hpp>
-#include "boost/cgi/response.hpp"
+#include "boost/cgi/common/response.hpp"
using namespace std;
using namespace boost;
Modified: sandbox/SOC/2007/cgi/branches/release/project-root.jam
==============================================================================
--- sandbox/SOC/2007/cgi/branches/release/project-root.jam (original)
+++ sandbox/SOC/2007/cgi/branches/release/project-root.jam 2008-06-02 17:54:00 EDT (Mon, 02 Jun 2008)
@@ -1,11 +1,56 @@
import os ;
import modules ;
-path-constant BOOST_BUILD_PATH : [ os.environ BOOST_BUILD_PATH ] ;
+local rule get-boost-root ( )
+{
+ local boost-root = [ MATCH "^--boost-root=(.*)" : [ modules.peek : ARGV ] ] ;
+ if $(boost-root)
+ {
+ return $(boost-root) ;
+ }
+ else
+ {
+ boost-root = [ os.environ BOOST_ROOT ] ;
+ if $(boost-root)
+ {
+ return $(boost-root) ;
+ }
+ else
+ {
+ ERROR "Can't find your Boost source. Either set the environment " ;
+ ERROR "variable BOOST_ROOT or pass --boost-root=/path/to/source on the " ;
+ ERROR "command line." ;
+ }
+ }
+}
+
+# Get the boost root
+path-constant boost-root : [ get-boost-root ] ;
+
+local rule get-bbv2-path ( boost-root * )
+{
+ local bbv2-path = [ os.environ BOOST_BUILD_PATH ] ;
+ if $(bbv2-path)
+ {
+ return $(bbv2-path) ;
+ }
+ else
+ if $(boost-root)
+ {
+ return "$(boost-root)/tools/build/v2" ;
+ }
+ else
+ {
+ ERROR "Can't find Boost Build. Please set either the environment variable " ;
+ ERROR "BOOST_ROOT (to your boost sources) or BOOST_BUILD_PATH (to boost build's " ;
+ ERROR "sources - usually located in BOOST_ROOT/tools/build/v2." ;
+ }
+}
+
+path-constant BOOST_BUILD_PATH : [ get-bbv2-path ] ;
path-constant top : . ;
path-constant include-dir : /usr/local/include ;
-path-constant boost-root : [ os.environ BOOST_ROOT ] ;
# A relative path to boost (for documentation stuff)
path-constant boost-root-relative : $(top)/../../../../boost/trunk/ ;
@@ -40,7 +85,7 @@
}
else
{
- return "$(top)/$(protocol:L)-bin" ;
+ return "$(top)/libs/cgi/example/$(protocol:L)-bin" ;
}
}
}
@@ -90,13 +135,4 @@
use-project /boost/ : $(boost-root) ;
use-project /boost/cgi/ : $(top)/libs/cgi/build ;
-
-project cgi
- : build-dir
- $(top)/bin.v2
- : requirements
- <include>$(boost-root)
- <include>$(top)
- <define>_CRT_SECURE_NO_WARNINGS
- <define>_SCL_SECURE_NO_WARNINGS
- ;
+project anon : build-dir bin.v2 ;
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