mirror of
https://github.com/SChernykh/p2pool.git
synced 2025-01-09 04:09:29 +00:00
Stratum: detect HTTP and send a response
This commit is contained in:
parent
8aad4a16b3
commit
ad49afb34b
3 changed files with 33 additions and 3 deletions
|
@ -1167,11 +1167,20 @@ bool StratumServer::StratumClient::on_read(char* data, uint32_t size)
|
||||||
char* line_start = m_stratumReadBuf;
|
char* line_start = m_stratumReadBuf;
|
||||||
for (char *e = line_start + m_stratumReadBufBytes, *c = e - size; c < e; ++c) {
|
for (char *e = line_start + m_stratumReadBufBytes, *c = e - size; c < e; ++c) {
|
||||||
if (*c == '\n') {
|
if (*c == '\n') {
|
||||||
|
// Check if the line starts with "GET " (an HTTP request)
|
||||||
|
if ((c - line_start >= 4) && (*reinterpret_cast<uint32_t*>(line_start) == 0x20544547U)) {
|
||||||
|
LOGINFO(5, "client " << log::Gray() << static_cast<const char*>(m_addrString) << log::NoColor() << " sent an HTTP request");
|
||||||
|
send_http_response();
|
||||||
|
close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
*c = '\0';
|
*c = '\0';
|
||||||
if (!process_request(line_start, static_cast<uint32_t>(c - line_start))) {
|
if (!process_request(line_start, static_cast<uint32_t>(c - line_start))) {
|
||||||
ban(DEFAULT_BAN_TIME);
|
ban(DEFAULT_BAN_TIME);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
line_start = c + 1;
|
line_start = c + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1365,6 +1374,25 @@ bool StratumServer::StratumClient::process_submit(rapidjson::Document& doc, uint
|
||||||
return static_cast<StratumServer*>(m_owner)->on_submit(this, id, job_id.GetString(), nonce.GetString(), result.GetString());
|
return static_cast<StratumServer*>(m_owner)->on_submit(this, id, job_id.GetString(), nonce.GetString(), result.GetString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool StratumServer::StratumClient::send_http_response()
|
||||||
|
{
|
||||||
|
return m_owner->send(this, [](uint8_t *buf, size_t buf_size) -> size_t {
|
||||||
|
static constexpr uint8_t data[] =
|
||||||
|
"HTTP/1.1 200 OK\r\n"
|
||||||
|
"Content-Length: 21\r\n"
|
||||||
|
"Content-Type: text/html\r\n"
|
||||||
|
"Connection: Closed\r\n\r\n"
|
||||||
|
"P2Pool Stratum online";
|
||||||
|
|
||||||
|
if (buf_size < sizeof(data)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(buf, data, sizeof(data));
|
||||||
|
return sizeof(data);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
void StratumServer::api_update_local_stats(uint64_t timestamp)
|
void StratumServer::api_update_local_stats(uint64_t timestamp)
|
||||||
{
|
{
|
||||||
if (!m_pool->api() || !m_pool->params().m_localStats || m_pool->stopped()) {
|
if (!m_pool->api() || !m_pool->params().m_localStats || m_pool->stopped()) {
|
||||||
|
|
|
@ -52,6 +52,8 @@ public:
|
||||||
[[nodiscard]] bool process_login(rapidjson::Document& doc, uint32_t id);
|
[[nodiscard]] bool process_login(rapidjson::Document& doc, uint32_t id);
|
||||||
[[nodiscard]] bool process_submit(rapidjson::Document& doc, uint32_t id);
|
[[nodiscard]] bool process_submit(rapidjson::Document& doc, uint32_t id);
|
||||||
|
|
||||||
|
bool send_http_response();
|
||||||
|
|
||||||
alignas(8) char m_rawReadBuf[STRATUM_BUF_SIZE];
|
alignas(8) char m_rawReadBuf[STRATUM_BUF_SIZE];
|
||||||
|
|
||||||
alignas(8) char m_stratumReadBuf[STRATUM_BUF_SIZE];
|
alignas(8) char m_stratumReadBuf[STRATUM_BUF_SIZE];
|
||||||
|
|
|
@ -228,9 +228,6 @@ bool ServerTls::on_read_internal(char* data, uint32_t size, ReadCallback::Base&&
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int bytes_read = 0;
|
|
||||||
char buf[1024];
|
|
||||||
|
|
||||||
if (!SSL_is_init_finished(ssl)) {
|
if (!SSL_is_init_finished(ssl)) {
|
||||||
const int result = SSL_do_handshake(ssl);
|
const int result = SSL_do_handshake(ssl);
|
||||||
|
|
||||||
|
@ -274,6 +271,9 @@ bool ServerTls::on_read_internal(char* data, uint32_t size, ReadCallback::Base&&
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int bytes_read;
|
||||||
|
char buf[1024];
|
||||||
|
|
||||||
while ((bytes_read = SSL_read(ssl, buf, sizeof(buf))) > 0) {
|
while ((bytes_read = SSL_read(ssl, buf, sizeof(buf))) > 0) {
|
||||||
if (!read_callback(buf, static_cast<uint32_t>(bytes_read))) {
|
if (!read_callback(buf, static_cast<uint32_t>(bytes_read))) {
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in a new issue