Skip to content

Commit 2324304

Browse files
Merge pull request #14 from CppComet/alfa
3.21
2 parents 9079ca7 + 0d7d4ef commit 2324304

8 files changed

+103
-56
lines changed

CHANGELOG.md

+7
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,13 @@ FEATURES:
55
IMPROVEMENTS:
66
BUG FIXES:
77

8+
## v3.21
9+
10+
IMPROVEMENTS:
11+
12+
* Added caching in memory for sending static files
13+
* Added cache-control headers for get requests
14+
815
## v3.2
916

1017
BUG FIXES:

readme.MD

+31-38
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,56 @@
11
![CppComet](https://comet-server.com/img/CppComet.png)
22

3-
Comet technology – allows sending arbitrary messages to client through server initiative
4-
5-
## How it works
6-
7-
* Browser opens page of your site.
8-
* After loading this page JavaScript Api establishes a persistent connection to CppComet using websockets.
9-
* While page is open, your server can send text message to client. It appeals via [CometQL API](http://comet-server.org/doku.php/en:comet:cometql) to CppComet and transfer message for browser.
10-
* CppComet uses open connection with browser for delivers message in to JavaScript api in browser.
11-
* [JavaScript API](http://comet-server.org/doku.php/en:comet:javascript_api) delivers this message to your callback.
3+
Comet server is written in C++, for storing data using MySQL.
124

135
# Features
146

7+
Comet technology – allows sending arbitrary messages to client through server initiative
8+
159
* Api for more then 9 languages. [CometQL API](http://comet-server.org/doku.php/en:comet:cometql) allows you connect to server by mysql protocol.
1610
* Good documentation in [Russian](http://comet-server.org/doku.php/ru) and [English](http://comet-server.org/doku.php/en) languages
17-
* Allow sending a private message to users
18-
* Supports users authenticating on the server
19-
* Allows you to send public messages to users via channels
11+
* [Supports users authenticating on the server](https://comet-server.com/wiki/doku.php/en:comet:authentication#users_authorization_on_the_cometserver)
12+
* [Allow sending a private message to users](https://comet-server.com/wiki/doku.php/en:comet:cometql#table_users_messages)
13+
* [Allows you to send public messages to users via channels](https://comet-server.com/wiki/doku.php/en:comet:cometql#table_pipes_messages)
14+
* [Allows subscription from JavaScript to changing other user’s status](https://comet-server.com/wiki/doku.php/en:comet:javascript_api#subscribe_to_receive_messages_from_channel)
15+
* [Allows subscription to updates of online users list in real-time](https://comet-server.com/wiki/doku.php/en:comet:javascript_api#list_of_online_users_channels_track)
16+
* [Sending messages to channel from JS](https://comet-server.com/wiki/doku.php/en:comet:javascript_api#sending_messages_to_channel_from_js_pipes_web)
17+
* [Allows get information when users were online](https://comet-server.com/wiki/doku.php/en:comet:cometql#table_users_time)
18+
19+
# How it fast
20+
21+
[Report about load testing](https://comet-server.com/wiki/doku.php/en:comet:load-testing-result#report_about_testing_of_64000_connections_online) of 64,000 connections online
22+
23+
# How it works
24+
25+
* Introduction to comet technology [EN](https://comet-server.com/wiki/doku.php/en:comet:introduction-to-comet#introduction) and [RU](https://comet-server.com/wiki/doku.php/comet:introduction-to-comet#introduction)
26+
27+
# Documentation and examples
28+
29+
Documentation in [Russian](http://comet-server.org/doku.php/ru) and [English](http://comet-server.org/doku.php/en) languages
2030

31+
* How to build and run [EN](http://comet-server.org/doku.php/en:comet:building-from-source) or [RU](http://comet-server.org/doku.php/comet:building-from-source)
32+
* CometQL API documentation [EN](http://comet-server.org/doku.php/en:comet:cometql) or [RU](http://comet-server.org/doku.php/comet:cometql) (To connect to the comet server api from any server-side language is used CometQL)
33+
* JavaScript API documentation [EN](http://comet-server.org/doku.php/en:comet:javascript_api) or [RU](http://comet-server.org/doku.php/comet:javascript_api) (To connect to the server from JavaScript API use file from [api/CometServerApi.js](https://github.com/CppComet/comet-server/tree/master/api) )
34+
2135
# Demo
2236

2337
* https://github.com/CppComet/php-chat-example
24-
* https://github.com/CppComet/comet-server/tree/master/demo/simple-chat
38+
* https://jsfiddle.net/Levhav/o35kvmn2/21/
39+
* https://cppcomet.github.io/comet-server/demo/simple-chat/simple-chat.html
2540
* https://github.com/CppComet/auth-example
2641

2742
## Demo access to server API
2843

44+
For testing CppComet without install on vps you can use [free cloud service with same api](https://comet-server.com/).
45+
In the all examples I will use demonstration access from [comet-server.com](http://comet-server.com) for those who could not or were too lazy to deploy the server on their vps.
46+
2947
For demo access use credentials:
3048
```
3149
Login: 15
3250
Password:lPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8
3351
Host: app.comet-server.ru
3452
```
3553

36-
CppComet has cloud saas alternative that can be used for testing and demo access.
37-
In the following examples I will use demonstration access from [comet-server.com](http://comet-server.com) for those who could not or were too lazy to deploy the server on their vps.
38-
3954
Example of connecting to [cometQL api](http://comet-server.org/doku.php/en:comet:cometql) from console using mysql-client:
4055
```
4156
mysql -h app.comet-server.ru -u15 -plPXBFPqNg3f661JcegBY0N0dPXqUBdHXqj2cHf04PZgLHxT6z55e20ozojvMRvB8 -DCometQL_v1 --skip-ssl
@@ -58,28 +73,6 @@ For send message to demo chat use this query:
5873
INSERT INTO pipes_messages (name, event, message)VALUES("web_MainPageChat", "", '{ "text":"My text","name":"My name"}' );
5974
```
6075

61-
# Documentation and examples
62-
63-
Comet server is written in C++, for storing data using MySQL.
64-
65-
[Documentation and examples](http://comet-server.org/)
66-
67-
### Building from source and launch
68-
69-
How to build and run [EN](http://comet-server.org/doku.php/en:comet:building-from-source) or [RU](http://comet-server.org/doku.php/comet:building-from-source)
70-
71-
### CometQL API:
72-
73-
CometQL API documentation [EN](http://comet-server.org/doku.php/en:comet:cometql) or [RU](http://comet-server.org/doku.php/comet:cometql)
74-
75-
- To connect to the comet server api from any server-side language is used CometQL [EN](http://comet-server.org/doku.php/en:comet:cometql) or [RU](http://comet-server.org/doku.php/comet:cometql)
76-
77-
### JavaScript API:
78-
79-
JavaScript API documentation [EN](http://comet-server.org/doku.php/en:comet:javascript_api) or [RU](http://comet-server.org/doku.php/comet:javascript_api)
80-
81-
- To connect to the server from JavaScript API use file from api/CometServerApi.js
82-
8376
License
8477
----
8578

src/Client_connection.cpp

+38-12
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
char* getGETdata(const char* c,int& user_id);
3131

32+
std::map<std::string, const char*> Client_connection::ram_file_cache;
3233
int Client_connection::request_mutex_init = 0;
3334
int Client_connection::max_subscription_event = 50;
3435

@@ -1476,7 +1477,7 @@ int Client_connection::web_pipe_msg_v2(thread_data* local_buf, char* event_data,
14761477
int Client_connection::options(int client, int len, thread_data* local_buf)
14771478
{
14781479
char resp[]="HTTP/1.1 200 OK\r\nContent-Type:text/html; charset=UTF-8\r\nServer:CppComet Server\r\nComet-Server:CppComet Server\r\nAccess-Control-Allow-Origin: *\
1479-
\r\nAccess-Control-Allow-Methods:POST, GET\r\nAllow: POST, GET\r\nAccess-Control-Allow-Headers: origin, content-type, accept\r\nConnection: close\r\n\r\n+OK\r\n";
1480+
\r\nAccess-Control-Allow-Methods:POST, GET\r\nAllow: POST, GET\r\nAccess-Control-Allow-Headers: origin, content-type, accept\r\nCache-Control: max-age=3600\r\nConnection: close\r\n\r\n+OK\r\n";
14801481
if(web_write( resp ) < 0)
14811482
{
14821483
TagLoger::log(Log_ClientServer, 0, " >Client Failed to send data %d\n",fd);
@@ -1494,7 +1495,7 @@ int Client_connection::options(int client, int len, thread_data* local_buf)
14941495
int Client_connection::get_request(int client, int len, thread_data* local_buf)
14951496
{
14961497
char resp[]="HTTP/1.1 200 OK\r\nContent-Type:text/html; charset=UTF-8\r\nServer:CppComet Server\r\nComet-Server:CppComet Server\r\nAccess-Control-Allow-Origin: *\
1497-
\r\nAccess-Control-Allow-Methods:POST, GET\r\nAllow: POST, GET\r\nAccess-Control-Allow-Headers: origin, content-type, accept\r\nConnection: close\r\n\r\n";
1498+
\r\nAccess-Control-Allow-Methods:POST, GET\r\nAllow: POST, GET\r\nAccess-Control-Allow-Headers: origin, content-type, accept\r\nCache-Control: max-age=3600\r\nConnection: close\r\n\r\n";
14981499
if(web_write( resp ) < 0 || web_write( logoPage ) < 0)
14991500
{
15001501
TagLoger::log(Log_ClientServer, 0, " >Client Failed to send data %d\n",fd);
@@ -1505,14 +1506,24 @@ int Client_connection::get_request(int client, int len, thread_data* local_buf)
15051506
int Client_connection::http404_answer(int client, int len, thread_data* local_buf)
15061507
{
15071508
char resp[]="HTTP/1.1 404 Not Found\r\nContent-Type:text/html; charset=UTF-8\r\nServer:CppComet Server\r\nComet-Server:CppComet Server\r\nAccess-Control-Allow-Origin: *\
1508-
\r\nAccess-Control-Allow-Methods:POST, GET\r\nAllow: POST, GET\r\nAccess-Control-Allow-Headers: origin, content-type, accept\r\nConnection: close\r\n\r\n";
1509+
\r\nAccess-Control-Allow-Methods:POST, GET\r\nAllow: POST, GET\r\nAccess-Control-Allow-Headers: origin, content-type, accept\r\nCache-Control: max-age=3600\r\nConnection: close\r\n\r\n";
15091510
if(web_write( resp ) < 0 || web_write( logoPage ) < 0)
15101511
{
15111512
TagLoger::log(Log_ClientServer, 0, " >Client Failed to send data %d\n",fd);
15121513
}
15131514
return -1;
15141515
}
15151516

1517+
int Client_connection::http403_answer(int client, int len, thread_data* local_buf)
1518+
{
1519+
char resp[]="HTTP/1.1 403 Forbidden\r\nContent-Type:text/html; charset=UTF-8\r\nServer:CppComet Server\r\nComet-Server:CppComet Server\r\nAccess-Control-Allow-Origin: *\
1520+
\r\nAccess-Control-Allow-Methods:POST, GET\r\nAllow: POST, GET\r\nAccess-Control-Allow-Headers: origin, content-type, accept\r\nCache-Control: max-age=3600\r\nConnection: close\r\n\r\n";
1521+
if(web_write( resp ) < 0 || web_write( logoPage ) < 0)
1522+
{
1523+
TagLoger::log(Log_ClientServer, 0, " >Client Failed to send data %d\n",fd);
1524+
}
1525+
return -1;
1526+
}
15161527
/**
15171528
* Отвечает на запрос get с урлом /info
15181529
* Ответ всегда выглядит {"status":"ok"}
@@ -1550,7 +1561,7 @@ int Client_connection::get_info_request(int client, int len, thread_data* local_
15501561
int Client_connection::get_favicon_request(int client, int len, thread_data* local_buf)
15511562
{
15521563
char resp[]="HTTP/1.1 301 OK\r\nContent-Type:text/html; charset=UTF-8\r\nServer:CppComet Server\r\nComet-Server:CppComet Server\r\nAccess-Control-Allow-Origin: *\
1553-
\r\nAccess-Control-Allow-Methods:POST, GET\r\nAllow: POST, GET\r\nAccess-Control-Allow-Headers: origin, content-type, accept\r\nConnection: close\r\nLocation: http://comet-server.ru/favicon.ico\r\n\r\n";
1564+
\r\nAccess-Control-Allow-Methods:POST, GET\r\nAllow: POST, GET\r\nAccess-Control-Allow-Headers: origin, content-type, accept\r\nCache-Control: max-age=3600\r\nConnection: close\r\nLocation: http://comet-server.com/favicon.ico\r\n\r\n";
15541565

15551566
if(web_write( resp ) < 0)
15561567
{
@@ -1562,6 +1573,9 @@ int Client_connection::get_favicon_request(int client, int len, thread_data* loc
15621573

15631574
int Client_connection::get_custom_request(int client, int len, thread_data* local_buf)
15641575
{
1576+
char resp[]="HTTP/1.1 200 OK\r\nContent-Type:text/html; charset=UTF-8\r\nServer:CppComet Server\r\nComet-Server:CppComet Server\r\nAccess-Control-Allow-Origin: *\
1577+
\r\nAccess-Control-Allow-Methods: GET\r\nAllow: GET\r\nAccess-Control-Allow-Headers: origin, content-type, accept\r\nCache-Control: max-age=3600\r\nConnection: close\r\n\r\n";
1578+
15651579
char *p = local_buf->buf.getData();
15661580
int urlStart = strlen("GET ");
15671581
p = p + urlStart;
@@ -1572,28 +1586,38 @@ int Client_connection::get_custom_request(int client, int len, thread_data* loca
15721586
// 404
15731587
return http404_answer(client, len, local_buf);
15741588
}
1575-
1576-
15771589

15781590
p[urlEnd - 1] = 0;
15791591
char *uri = p;
15801592
std::string name(appConf::instance()->get_string("main", "base_dir"));
15811593
if(!name.size())
15821594
{
15831595
// 404
1584-
return http404_answer(client, len, local_buf);
1596+
return http403_answer(client, len, local_buf);
15851597
}
15861598

15871599
name.append(uri);
15881600

15891601
TagLoger::log(Log_ClientServer, 0, " >Client GET [%s]\n", name.data());
1590-
if(name.find("..", 0) != std::string::npos)
1602+
if(name.find("..") != std::string::npos)
15911603
{
15921604
// Проверка на две точки в урле.
15931605
TagLoger::log(Log_ClientServer, 0, " >Client GET error403 [.. in url] [%s]\n", name.data());
1594-
return http404_answer(client, len, local_buf);
1606+
return http403_answer(client, len, local_buf);
1607+
}
1608+
1609+
auto it = ram_file_cache.find(name);
1610+
if(it != ram_file_cache.end())
1611+
{
1612+
TagLoger::debug(Log_ClientServer, 0, " >send name=%s from ram cache\n", name.data());
1613+
web_write(resp);
1614+
web_write(it->second);
1615+
return -1;
15951616
}
15961617

1618+
/**
1619+
* @todo дополнить белым списком запрашиваемых файлов чтоб исключить нагрузку от левых запросов.
1620+
*/
15971621
int fp = open(name.data(), O_RDONLY);
15981622
if(fp < 0)
15991623
{
@@ -1603,10 +1627,10 @@ int Client_connection::get_custom_request(int client, int len, thread_data* loca
16031627
return http404_answer(client, len, local_buf);
16041628
}
16051629

1606-
char resp[]="HTTP/1.1 200 OK\r\nContent-Type:text/html; charset=UTF-8\r\nServer:CppComet Server\r\nComet-Server:CppComet Server\r\nAccess-Control-Allow-Origin: *\
1607-
\r\nAccess-Control-Allow-Methods: GET\r\nAllow: GET\r\nAccess-Control-Allow-Headers: origin, content-type, accept\r\nConnection: close\r\n\r\n";
16081630
web_write(resp);
16091631

1632+
std::string response;
1633+
16101634
int size = 0;
16111635
while(size = read(fp, local_buf->answer_buf.getData(), local_buf->answer_buf.getSize()))
16121636
{
@@ -1615,10 +1639,12 @@ int Client_connection::get_custom_request(int client, int len, thread_data* loca
16151639
break;
16161640
}
16171641

1642+
response.append(local_buf->answer_buf.getData());
16181643
web_write( local_buf->answer_buf.getData(), size);
1619-
TagLoger::debug(Log_ClientServer, 0, " >send size=%d [%s]\n", size, local_buf->answer_buf.getData());
1644+
TagLoger::debug(Log_ClientServer, 0, " >send name=%s from disk [size=%d]\n", name.data(), size);
16201645
}
16211646

1647+
ram_file_cache.insert(std::pair<std::string,const char*>(name, response.data()));
16221648
return -1;
16231649
}
16241650

src/Client_connection.h

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class Client_connection;
5757
*/
5858
class Client_connection:public connection
5959
{
60+
static std::map<std::string, const char*> ram_file_cache;
6061
friend class tcpServer<Client_connection>;
6162

6263
/**
@@ -123,6 +124,7 @@ class Client_connection:public connection
123124
int get_info_request(int client, int len, thread_data* local_buf);
124125
int get_favicon_request(int client, int len, thread_data* local_buf);
125126
int http404_answer(int client, int len, thread_data* local_buf);
127+
int http403_answer(int client, int len, thread_data* local_buf);
126128
int get_custom_request(int client, int len, thread_data* local_buf);
127129

128130
int web_socket_request_message(int client, int len, thread_data* local_buf);

src/MySql_connection.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1310,7 +1310,7 @@ int MySql_connection::sql_select_systemvarible(thread_data* local_buf, unsigned
13101310
answer += HeadAnswer(1, local_buf->sql.columns, PacketNomber, answer);
13111311
//printf("systemVaribleName %s\n", local_buf->qInfo.tokStart(local_buf->qInfo.arg_select.systemVaribleName));
13121312
MySqlResulValue values;
1313-
values = "StarComet (comet-server.ru, [email protected])";
1313+
values = MYSQL_SYSTEMVARIBLE;
13141314

13151315
answer += RowPackage(1, &values, ++PacketNomber, answer);
13161316

src/appConf.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ bool appConf::init(int argc, char *argv[])
179179
{
180180
if(strcmp(argv[i],"--help") == 0)
181181
{
182-
printf("Help:\n \thttp://comet-server.com\n \tsupport@comet-server.ru\n");
182+
printf("Help:\n \thttp://comet-server.com\n \tsupport@comet-server.com\n");
183183
isHelp = true;
184184
return false;
185185
}

src/main.cpp

+21-2
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,26 @@ void command_line_fork()
283283

284284
} while ( 1 );
285285
}
286+
287+
/**
288+
* Отправка данных статистики через curl
289+
* @param data данные
290+
* @return
291+
*/
292+
bool send_statistics(std::string data)
293+
{
294+
char cli[600];
295+
std::string cmd;
296+
cmd.append("curl -d \"").append(data).append("\" --connect-timeout 1 --max-time 1 -H \"Content-Type: text/plain\" -X POST http://statistics.comet-server.ru/api/statistics");
297+
if(exec(cmd.data(), cli, 600))
298+
{
299+
return true;
300+
}
301+
302+
return false;
303+
}
304+
305+
286306

287307
/**
288308
* valgrind --tool=memcheck --track-origins=yes --leak-check=yes ./cpp_comet
@@ -334,8 +354,7 @@ int main(int argc, char *argv[])
334354
//signal(SIGTRAP, posix_death_signal); // сигнал, посылаемый для информирования отладчика о возникновении интересующего события.
335355
//signal(SIGURG, posix_death_signal); // сигнал, посылаемый процессу при появлении на сокете доступных для чтения срочных (англ. urgent) данных.
336356
//signal(SIGVTALRM, posix_death_signal); // сигнал, посылаемый процессу по истечении времени заданном в «виртуальном» таймере.
337-
338-
357+
339358
// Чтение конфига и ключей запуска
340359
if(!appConf::instance()->init(argc, argv))
341360
{

src/main.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@
9393
<body> \
9494
<table id='center'>\
9595
<tr style='vertical-align: top;'>\
96-
<td> <img src='https://comet-server.org/Logo.png'></td>\
9796
<td style=' padding-left: 10px;'> \
9897
<div style='font-size: 30px; font-weight: bold;'>CppComet</div>\
9998
For more information, see <a href='http://comet-server.com' target='_blank'>comet-server.com</a> and [email protected]\
@@ -103,7 +102,8 @@
103102
</body>\
104103
</html>"
105104

106-
#define MYSQL_SERVERNAME "CppComet 3.2"
105+
#define MYSQL_SERVERNAME "CppComet 3.21"
106+
#define MYSQL_SYSTEMVARIBLE "CppComet 3.21 (comet-server.com, [email protected])"
107107

108108
#define maxValue( a, b ) ( (a) > (b) ? (a) : (b) )
109109
#define minValue( a, b ) ( (a) < (b) ? (a) : (b) )

0 commit comments

Comments
 (0)