Skip to content

Commit 72bec53

Browse files
committed
FIX | critical bugs
1 parent 749bd9e commit 72bec53

File tree

5 files changed

+132
-40
lines changed

5 files changed

+132
-40
lines changed

README.md

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -314,22 +314,36 @@ public:
314314

315315
co_return co_await promise ([&] (promise::resolve_t resolve, promise::reject_t) -> void {
316316
try {
317-
this->stub_->async()->SayHello(&context, &request, &reply, [&, resolve = std::move(resolve)] (grpc::Status status) {
318-
if (status.ok()) {
319-
resolve(reply.message());
320-
return;
317+
this->stub_->async()->SayHello(&context, &request, &reply, [&reply, ctx = manapi::async::current(), resolve = std::move(resolve)] (grpc::Status status) {
318+
if (manapi::async::context_exists()) {
319+
if (status.ok()) {
320+
resolve(reply.message());
321+
return;
322+
}
323+
324+
auto msg = status.error_message();
325+
manapi_log_debug("grpc client failed due to %s", msg.data());
326+
resolve(manapi::error::status_internal("grpc client: something gets wrong"));
321327
}
322-
323-
auto msg = status.error_message();
324-
manapi_log_debug("grpc client failed due to %s", msg.data());
325-
resolve(manapi::error::status_internal("grpc client: something gets wrong"));
326-
});
327-
}
328-
catch (std::exception const &e) {
329-
manapi_log_error(e.what());
330-
resolve(manapi::error::status_internal("sayhello failed"));
331-
}
332-
});
328+
else {
329+
ctx->event_loop()->custom_callback([resolve = std::move(resolve), &reply, status = std::move(status)] (manapi::event_loop *ev) -> void {
330+
if (status.ok()) {
331+
resolve(reply.message());
332+
return;
333+
}
334+
335+
auto msg = status.error_message();
336+
manapi_log_debug("grpc client failed due to %s", msg.data());
337+
resolve(manapi::error::status_internal("grpc client: something gets wrong"));
338+
}).unwrap();
339+
}
340+
});
341+
}
342+
catch (std::exception const &e) {
343+
manapi_log_error(e.what());
344+
resolve(manapi::error::status_internal("sayhello failed"));
345+
}
346+
});
333347
}
334348

335349
private:

include/ManapiAsync.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ namespace manapi {
3636
}
3737

3838
const std::shared_ptr<cthread> &current () MANAPIHTTP_NOEXCEPT;
39+
40+
bool context_exists () MANAPIHTTP_NOEXCEPT;
3941
}
4042

4143
class promise_base_future {

main.cpp

Lines changed: 65 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,29 @@ class GreeterClient {
8686

8787
co_return co_await promise ([&] (promise::resolve_t resolve, promise::reject_t) -> void {
8888
try {
89-
this->stub_->async()->SayHello(&context, &request, &reply, [&, resolve = std::move(resolve)] (grpc::Status status) {
90-
if (status.ok()) {
91-
resolve(reply.message());
92-
return;
89+
this->stub_->async()->SayHello(&context, &request, &reply, [ctx = manapi::async::current(), &reply, resolve = std::move(resolve)] (grpc::Status status) {
90+
if (manapi::async::context_exists()) {
91+
if (status.ok()) {
92+
resolve(reply.message());
93+
return;
94+
}
95+
96+
auto msg = status.error_message();
97+
manapi_log_debug("grpc client failed due to %s", msg.data());
98+
resolve(manapi::error::status_internal("grpc client: something gets wrong"));
99+
}
100+
else {
101+
ctx->eventloop()->custom_callback([resolve = std::move(resolve), status = std::move(status), &reply] (manapi::event_loop *ev) -> void {
102+
if (status.ok()) {
103+
resolve(reply.message());
104+
return;
105+
}
106+
107+
auto msg = status.error_message();
108+
manapi_log_debug("grpc client failed due to %s", msg.data());
109+
resolve(manapi::error::status_internal("grpc client: something gets wrong"));
110+
}).unwrap();
93111
}
94-
95-
auto msg = status.error_message();
96-
manapi_log_debug("grpc client failed due to %s", msg.data());
97-
resolve(manapi::error::status_internal("grpc client: something gets wrong"));
98112
});
99113
}
100114
catch (std::exception const &e) {
@@ -110,12 +124,6 @@ class GreeterClient {
110124

111125

112126
int main () {
113-
try {
114-
manapi::init_tools::log_trace_init((manapi::debug::trace_level)std::stoi(manapi::process::get_env("MANAPIHTTP_LOGTRACE").unwrap()));
115-
}
116-
catch (...) {
117-
manapi::init_tools::log_trace_init(manapi::debug::LOG_TRACE_LOW);
118-
}
119127
int threads = 4;
120128
try { threads = std::stoi(manapi::process::get_env("MANAPIHTTP_THREADS").unwrap()); }
121129
catch (...) { }
@@ -170,11 +178,51 @@ int main () {
170178
co_return;
171179
}
172180
auto greeter = std::make_shared<GreeterClient>(grpc::CreateChannel("localhost:8080", creds.unwrap()));
173-
manapi::async::current()->timerpool()->append_interval_async(10, [greeter] (const manapi::timer &t) -> manapi::future<> {
174-
std::string user = "Xiadnoring Client";
181+
manapi::async::current()->timerpool()->append_interval_async(100, [greeter] (const manapi::timer &t) -> manapi::future<> {
182+
std::string user = "Xiadnoring Client #1";
183+
auto res = co_await greeter->SayHello(user);
184+
if (res.ok())
185+
std::cout << "Xiadnoring Client#1 =" << res.unwrap() << "\n";
186+
else
187+
res.err().log();
188+
});
189+
manapi::async::current()->timerpool()->append_interval_async(100, [greeter] (const manapi::timer &t) -> manapi::future<> {
190+
std::string user = "Xiadnoring Client #2";
191+
auto res = co_await greeter->SayHello(user);
192+
if (res.ok())
193+
std::cout << "Xiadnoring Client #2=" << res.unwrap() << "\n";
194+
else
195+
res.err().log();
196+
});
197+
manapi::async::current()->timerpool()->append_interval_async(100, [greeter] (const manapi::timer &t) -> manapi::future<> {
198+
std::string user = "Xiadnoring Client #3";
199+
auto res = co_await greeter->SayHello(user);
200+
if (res.ok())
201+
std::cout << "Xiadnoring Client #3=" << res.unwrap() << "\n";
202+
else
203+
res.err().log();
204+
});
205+
manapi::async::current()->timerpool()->append_interval_async(100, [greeter] (const manapi::timer &t) -> manapi::future<> {
206+
std::string user = "Xiadnoring Client #4";
207+
auto res = co_await greeter->SayHello(user);
208+
if (res.ok())
209+
std::cout << "Xiadnoring Client #4=" << res.unwrap() << "\n";
210+
else
211+
res.err().log();
212+
});
213+
manapi::async::current()->timerpool()->append_interval_async(100, [greeter] (const manapi::timer &t) -> manapi::future<> {
214+
std::string user = "Xiadnoring Client #5";
215+
auto res = co_await greeter->SayHello(user);
216+
if (res.ok())
217+
std::cout << "Xiadnoring Client #5=" << res.unwrap() << "\n";
218+
else
219+
res.err().log();
220+
});
221+
manapi::async::current()->timerpool()->append_interval_async(100, [greeter] (const manapi::timer &t) -> manapi::future<> {
222+
std::string user = "Xiadnoring Client #6";
175223
auto res = co_await greeter->SayHello(user);
176224
if (res.ok())
177-
std::cout << res.unwrap() << "\n";
225+
std::cout << "Xiadnoring Client #6=" << res.unwrap() << "\n";
178226
else
179227
res.err().log();
180228
});

src/crypto/ManapiCryptoUtils.cpp

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -151,22 +151,46 @@ manapi::error::status_or<std::string> manapi::crypto::strdec2strhex(std::string_
151151
}
152152
}
153153

154+
static int chrhex2chrdec (char &a) {
155+
if (isdigit(a)) {
156+
a -= '0';
157+
}
158+
else if (a >= 'A' && a <= 'F') {
159+
a -= 'A'-10;
160+
}
161+
else if (a >= 'a' && a <= 'f') {
162+
a -= 'a'-10;
163+
}
164+
else {
165+
return 1;
166+
}
167+
return 0;
168+
}
154169

155170
manapi::error::status_or<std::string> manapi::crypto::strhex2strdec(std::string_view hex) {
156171
try {
157-
auto len = hex.length();
158-
std::string newString;
159-
for(size_t i=0; i< len; i+=2)
160-
{
161-
std::string_view byte = hex.substr(i,2);
162-
char chr = (char) (int)strtol(static_cast<const char*>(byte.data()), nullptr, 16);
163-
newString.push_back(chr);
164-
}
172+
auto len = hex.length();
173+
if (len % 2 != 0) {
174+
goto err;
175+
}
176+
std::string newString;
177+
newString.reserve(len / 2);
178+
for (std::size_t i = 0; i < hex.length(); i+=2) {
179+
char a = hex[i];
180+
char b = hex[i + 1];
181+
182+
if (chrhex2chrdec(a) || chrhex2chrdec(b))
183+
goto err;
184+
185+
newString.push_back(static_cast<char>((static_cast<uint8_t>(a) << 4) | static_cast<uint8_t>(b)));
186+
}
165187
return std::move(newString);
166188
}
167189
catch (std::bad_alloc const &) {
168190
return error::status_resource_exhausted();
169191
}
192+
err:
193+
return error::status_invalid_argument("hex string invalid");
170194
}
171195

172196
// int manapi::crypto::binpow(int a, int n) {

src/std/ManapiAsyncContext.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,10 @@ const manapi::async::shared_cthread &manapi::async::current() MANAPIHTTP_NOEXCEP
251251
return async::internal::current_cthread_;
252252
}
253253

254+
bool manapi::async::context_exists() MANAPIHTTP_NOEXCEPT {
255+
return async::internal::current_cthread_ != nullptr;
256+
}
257+
254258

255259
const std::shared_ptr<manapi::async::cthread> & manapi::async::internal::current_() MANAPIHTTP_NOEXCEPT {
256260
return async::internal::current_cthread_;

0 commit comments

Comments
 (0)