Skip to content

Commit

Permalink
enable_cache{true} for single cache
Browse files Browse the repository at this point in the history
  • Loading branch information
xmh0511 committed Jul 31, 2018
2 parents 050f699 + 238cc58 commit 146f520
Show file tree
Hide file tree
Showing 10 changed files with 155 additions and 240 deletions.
14 changes: 14 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ endif ()
#option(ENABLE_GZIP "Set to switch to build use gzip" OFF)
SET(ENABLE_GZIP OFF)
SET(ENABLE_SSL OFF)
SET(ENABLE_CLIENT_SSL OFF)
if (ENABLE_SSL)
add_definitions(-DCINATRA_ENABLE_SSL)
message(STATUS "Use SSL")
Expand All @@ -20,10 +21,18 @@ if(ENABLE_GZIP)
add_definitions(-DCINATRA_ENABLE_GZIP)
endif()

if(ENABLE_CLIENT_SSL)
add_definitions(-DCINATRA_ENABLE_CLIENT_SSL)
endif()

find_package(Boost 1.60 REQUIRED COMPONENTS system)
if (ENABLE_SSL)
find_package(OpenSSL REQUIRED)
endif()
if (ENABLE_CLIENT_SSL)
find_package(OpenSSL REQUIRED)
endif()

if (ENABLE_GZIP)
find_package(ZLIB REQUIRED)
endif()
Expand Down Expand Up @@ -64,6 +73,11 @@ target_link_libraries(cinatra ${Boost_LIBRARIES} uuid -lstdc++fs)
if (ENABLE_SSL)
target_link_libraries(cinatra ${OPENSSL_LIBRARIES} pthread -ldl)
endif()

if (ENABLE_CLIENT_SSL)
target_link_libraries(cinatra ${OPENSSL_LIBRARIES} pthread -ldl)
endif()

if (ENABLE_GZIP)
target_link_libraries(cinatra ${ZLIB_LIBRARIES})
endif()
Expand Down
203 changes: 33 additions & 170 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,56 +146,16 @@ cinatra目前支持了multipart和octet-stream格式的上传。
http_server server(std::thread::hardware_concurrency());
server.listen("0.0.0.0", "8080");

std::atomic_int n = 0;
//http upload(multipart)
server.set_http_handler<GET, POST>("/upload_multipart", [&n](const request& req, response& res) {
assert(req.get_http_type() == http_type::multipart);
auto state = req.get_state();
switch (state)
{
case cinatra::data_proc_state::data_begin:
{
auto file_name_s = req.get_multipart_file_name();
auto extension = get_extension(file_name_s);
std::string file_name = std::to_string(n++) + std::string(extension.data(), extension.length());
auto file = std::make_shared<std::ofstream>(file_name, std::ios::binary);
if (!file->is_open()) {
res.set_continue(false);
return;
}
req.get_conn()->set_tag(file);
server.set_http_handler<GET, POST>("/upload_multipart", [](request& req, response& res) {
assert(req.get_content_type() == content_type::multipart);
auto& files = req.get_upload_files();
for (auto& file : files) {
std::cout << file.get_file_path() << " " << file.get_file_size() << std::endl;
}
break;
case cinatra::data_proc_state::data_continue:
{
if (!res.need_continue()) {
return;
}

auto file = std::any_cast<std::shared_ptr<std::ofstream>>(req.get_conn()->get_tag());
auto part_data = req.get_part_data();
file->write(part_data.data(), part_data.length());
}
break;
case cinatra::data_proc_state::data_end:
{
std::cout << "one file finished" << std::endl;
}
break;
case cinatra::data_proc_state::data_all_end:
{
//all the upstream end
std::cout << "all files finished" << std::endl;
res.set_status_and_content(status_type::ok);
}
break;
case cinatra::data_proc_state::data_error:
{
//network error
}
break;
}
res.set_status_and_content(status_type::ok, "multipart finished");
});

server.run();
Expand All @@ -214,46 +174,15 @@ cinatra目前支持了multipart和octet-stream格式的上传。
http_server server(std::thread::hardware_concurrency());
server.listen("0.0.0.0", "8080");

std::atomic_int n = 0;
//http upload(octet-stream)
server.set_http_handler<GET, POST>("/upload_octet_stream", [&n](const request& req, response& res) {
assert(req.get_http_type() == http_type::octet_stream);
auto state = req.get_state();
switch (state)
{
case cinatra::data_proc_state::data_begin:
{
std::string file_name = std::to_string(n++);;
auto file = std::make_shared<std::ofstream>(file_name, std::ios::binary);
if (!file->is_open()) {
res.set_continue(false);
return;
}
req.get_conn()->set_tag(file);
server.set_http_handler<GET, POST>("/upload_octet_stream", [](request& req, response& res) {
assert(req.get_content_type() == content_type::octet_stream);
auto& files = req.get_upload_files();
for (auto& file : files) {
std::cout << file.get_file_path() << " " << file.get_file_size() << std::endl;
}
break;
case cinatra::data_proc_state::data_continue:
{
if (!res.need_continue()) {
return;
}

auto file = std::any_cast<std::shared_ptr<std::ofstream>>(req.get_conn()->get_tag());
auto part_data = req.get_part_data();
file->write(part_data.data(), part_data.length());
}
break;
case cinatra::data_proc_state::data_end:
{
std::cout << "one file finished" << std::endl;
}
break;
case cinatra::data_proc_state::data_error:
{
//network error
}
break;
}
res.set_status_and_content(status_type::ok, "octet-stream finished");
});

server.run();
Expand All @@ -262,68 +191,9 @@ cinatra目前支持了multipart和octet-stream格式的上传。

## 示例5:文件下载

#include "http_server.hpp"
using namespace cinatra;

int main() {
http_server server(std::thread::hardware_concurrency());
server.listen("0.0.0.0", "8080");

//http download(chunked)
server.set_http_handler<GET, POST>("/download_chunked", [](const request& req, response& res) {
auto state = req.get_state();
switch (state)
{
case cinatra::data_proc_state::data_begin:
{
std::string filename = "2.jpg";
auto in = std::make_shared<std::ifstream>(filename, std::ios::binary);
if (!in->is_open()) {
req.get_conn()->on_close();
return;
}

auto conn = req.get_conn();
conn->set_tag(in);
auto extension = get_extension(filename.data());
auto mime = get_mime_type(extension);
conn->write_chunked_header(mime);
}
break;
case cinatra::data_proc_state::data_continue:
{
auto conn = req.get_conn();
auto in = std::any_cast<std::shared_ptr<std::ifstream>>(conn->get_tag());
std::string str;
const size_t len = 2*1024;
str.resize(len);

in->read(&str[0], len);
size_t read_len = in->gcount();
if (read_len != len) {
str.resize(read_len);
}
bool eof = (read_len==0|| read_len != len);
conn->write_chunked_data(std::move(str), eof);
}
break;
case cinatra::data_proc_state::data_end:
{
std::cout << "chunked send finish" << std::endl;
}
break;
case cinatra::data_proc_state::data_error:
{
//network error
}
break;
}
});

server.run();
return 0;
}
//chunked download
//http://127.0.0.1:8080/assets/show.jpg
//cinatra will send you the file, if the file is big file(more than 5M) the file will be downloaded by chunked. support continues download

## 示例6:websocket

Expand All @@ -335,35 +205,28 @@ cinatra目前支持了multipart和octet-stream格式的上传。
server.listen("0.0.0.0", "8080");

//web socket
server.set_http_handler<GET, POST>("/ws", [](const request& req, response& res) {
assert(req.get_http_type() == http_type::websocket);
auto state = req.get_state();
switch (state)
{
case cinatra::data_proc_state::data_begin:
{
server.set_http_handler<GET, POST>("/ws", [](request& req, response& res) {
assert(req.get_content_type() == content_type::websocket);

req.on(ws_open, [](request& req){
std::cout << "websocket start" << std::endl;
}
break;
case cinatra::data_proc_state::data_continue:
{
});

req.on(ws_message, [](request& req) {
auto part_data = req.get_part_data();
//echo
req.get_conn()->send_ws_msg(std::string(part_data.data(), part_data.length()));
std::string str = std::string(part_data.data(), part_data.length());
req.get_conn()->send_ws_string(std::move(str));
std::cout << part_data.data() << std::endl;
}
break;
case cinatra::data_proc_state::data_close:
{
});

req.on(ws_close, [](request& req) {
std::cout << "websocket close" << std::endl;
}
break;
case cinatra::data_proc_state::data_error:
{
std::cout << "network error" << std::endl;
}
break;
}
});

req.on(ws_error, [](request& req) {
std::cout << "websocket error" << std::endl;
});
});

server.run();
Expand Down
Loading

0 comments on commit 146f520

Please sign in to comment.