CppCMS 1.2 URL Dispatching
CppCMS 1.1 introduced improved url dispatching methods url_dispatcher::map
. Following improvements provided over current url_dispatcher::assign
- It is possible to specify HTTP Request Method to map the function to - to support RESTful services in more friendly way
- It is possible to use non
std::string
parameters with automatic conversion and validation using std::istream
- It validates encoding of every matched expression that passed as a parameter
- It allows to pass
booster::regex
object with non-default flags as URL filter.
For example:
class my_app : public cppcms::application{
public:
// ordinary API
// name - is validated for correct encoding
// id converted from string
void page(int id,std::string const &name);
// RESTful API
void new_todo()
void get_todo(int id);
void update_todo(int id);
...
my_app(...)
{
dispatcher().map("/page/(\\d+)(/(.*))?",
&my_app::page,this,1,3);
dispatcher().map("GET","/todo/(\\d+)",
&my_app::get_todo,this,1);
dispatcher().map("PUT","/todo/(\\d+)",
&my_app::update_todo,this,1);
dispatcher().map("POST","/todo",
&my_app::new_todo,this);
}
};
It is also possible to pass booster::regex object so additional options can be specified:
For example for a function:
void article(std::string const &first_char,std::string const &full_name);
We can specify complex regular expression:
using booster::regex;
dispatcher().map(
booster::regex("/page/((.).*)",regex::icase | regex::utf8),
&my_app::article,this,2,1);
So it would match both "/Page/русский" and "/page/русский" and also select a first UTF-8 character "р" properly.
<h1>include <iostream></h1>
<h1>include <string></h1>
<h1>include <cstring></h1>
include <sys/socket.h>
include <netinet/in.h>
include <unistd.h>
int main() {
int server_fd, client_fd;
struct sockaddr_in address;
int addrlen = sizeof(address);
// HTML content to be served
std::string html =
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n\r\n"
"<!DOCTYPE html>"
"<html>"
"<head><title>My C++ Web</title></head>"
"<body><h1>Welcome to a Simple Web Page!</h1><p>This is served from C++.</p></body>"
"</html>";
// Create socket
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// Bind
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// Listen
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
std::cout << "Server is running on http://localhost:8080" << std::endl;
while (true) {
// Accept client
client_fd = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
if (client_fd < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
char buffer[3000] = {0};
read(client_fd, buffer, 3000); // Read client request
std::cout << "Request:\n" << buffer << std::endl;
// Send response
send(client_fd, html.c_str(), html.size(), 0);
close(client_fd); // Close connection
}
return 0;
}
<h1>include <iostream></h1>
<h1>include <string></h1>
<h1>include <cstring></h1>
include <sys/socket.h>
include <netinet/in.h>
include <unistd.h>
int main() {
int server_fd, client_fd;
struct sockaddr_in address;
int addrlen = sizeof(address);
// HTML content to be served
std::string html =
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/html\r\n\r\n"
"<!DOCTYPE html>"
"<html>"
"<head><title>My C++ Web</title></head>"
"<body><h1>Welcome to a Simple Web Page!</h1><p>This is served from C++.</p></body>"
"</html>";
// Create socket
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// Bind
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(8080);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// Listen
if (listen(server_fd, 3) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
std::cout << "Server is running on http://localhost:8080" << std::endl;
while (true) {
// Accept client
client_fd = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
if (client_fd < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
char buffer[3000] = {0};
read(client_fd, buffer, 3000); // Read client request
std::cout << "Request:\n" << buffer << std::endl;
// Send response
send(client_fd, html.c_str(), html.size(), 0);
close(client_fd); // Close connection
}
return 0;
}
Navigation
Main Page
Valid CSS
| Valid XHTML 1.0