aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--td/mtproto/RawConnection.cpp13
-rw-r--r--tdnet/td/net/DarwinHttp.h7
-rw-r--r--tdnet/td/net/DarwinHttp.mm13
3 files changed, 21 insertions, 12 deletions
diff --git a/td/mtproto/RawConnection.cpp b/td/mtproto/RawConnection.cpp
index f67ec791f..2615bb9b6 100644
--- a/td/mtproto/RawConnection.cpp
+++ b/td/mtproto/RawConnection.cpp
@@ -284,7 +284,7 @@ class RawConnectionHttp final : public RawConnection {
RawConnectionHttp(IPAddress ip_address, unique_ptr<StatsCallback> stats_callback)
: ip_address_(std::move(ip_address)), stats_callback_(std::move(stats_callback)) {
LOG(DEBUG) << "Create raw connection " << this;
- answers_ = std::make_shared<MpscPollableQueue<Result<BufferSlice>>>();
+ answers_ = std::make_shared<MpscPollableQueue<Result<std::pair<int32, BufferSlice>>>>();
answers_->init();
}
@@ -370,7 +370,7 @@ class RawConnectionHttp final : public RawConnection {
unique_ptr<StatsCallback> stats_callback_;
ConnectionManager::ConnectionToken connection_token_;
- std::shared_ptr<MpscPollableQueue<Result<BufferSlice>>> answers_;
+ std::shared_ptr<MpscPollableQueue<Result<std::pair<int32, BufferSlice>>>> answers_;
std::vector<BufferSlice> to_send_;
void on_read(size_t size, Callback &callback) {
@@ -397,7 +397,9 @@ class RawConnectionHttp final : public RawConnection {
break;
}
for (int i = 0; i < packets_n; i++) {
- TRY_RESULT(packet, answers_->reader_get_unsafe());
+ TRY_RESULT(answer, answers_->reader_get_unsafe());
+ auto error_code = answer.first;
+ auto packet = std::move(answer.second);
on_read(packet.size(), callback);
CHECK(mode_ == Receive);
mode_ = Send;
@@ -405,11 +407,10 @@ class RawConnectionHttp final : public RawConnection {
PacketInfo packet_info;
packet_info.version = 2;
- TRY_RESULT(read_result, Transport::read(packet.as_mutable_slice(), 0, auth_key, &packet_info));
+ TRY_RESULT(read_result, Transport::read(packet.as_mutable_slice(), error_code, auth_key, &packet_info));
switch (read_result.type()) {
- case Transport::ReadResult::Quickack: {
+ case Transport::ReadResult::Quickack:
break;
- }
case Transport::ReadResult::Error: {
TRY_STATUS(on_read_mtproto_error(read_result.error()));
break;
diff --git a/tdnet/td/net/DarwinHttp.h b/tdnet/td/net/DarwinHttp.h
index 1f71e1316..7e13a8437 100644
--- a/tdnet/td/net/DarwinHttp.h
+++ b/tdnet/td/net/DarwinHttp.h
@@ -7,15 +7,18 @@
#pragma once
#include "td/utils/buffer.h"
+#include "td/utils/common.h"
#include "td/utils/Promise.h"
#include "td/utils/Slice.h"
+#include <utility>
+
namespace td {
class DarwinHttp {
public:
- static void get(CSlice url, Promise<BufferSlice> promise);
- static void post(CSlice url, Slice data, Promise<BufferSlice> promise);
+ static void get(CSlice url, Promise<std::pair<int32, BufferSlice>> promise);
+ static void post(CSlice url, Slice data, Promise<std::pair<int32, BufferSlice>> promise);
};
} // namespace td
diff --git a/tdnet/td/net/DarwinHttp.mm b/tdnet/td/net/DarwinHttp.mm
index 03e9cf69d..d570112c4 100644
--- a/tdnet/td/net/DarwinHttp.mm
+++ b/tdnet/td/net/DarwinHttp.mm
@@ -52,7 +52,7 @@ auto http_post(CSlice url, Slice data) {
return request;
}
-void http_send(NSURLRequest *request, Promise<BufferSlice> promise) {
+void http_send(NSURLRequest *request, Promise<std::pair<int32, BufferSlice>> promise) {
__block auto callback = std::move(promise);
NSURLSessionDataTask *dataTask =
[getSession()
@@ -60,7 +60,12 @@ void http_send(NSURLRequest *request, Promise<BufferSlice> promise) {
completionHandler:
^(NSData *data, NSURLResponse *response, NSError *error) {
if (error == nil) {
- callback.set_value(BufferSlice(Slice((const char *)([data bytes]), [data length])));
+ int32 statusCode = 0;
+ if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
+ NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
+ statusCode = static_cast<int32>(httpResponse.statusCode);
+ }
+ callback.set_value(std::make_pair(statusCode, BufferSlice(Slice((const char *)([data bytes]), [data length]))));
} else {
callback.set_error(static_cast<int32>([error code]), "HTTP request failed");
}
@@ -69,11 +74,11 @@ void http_send(NSURLRequest *request, Promise<BufferSlice> promise) {
}
} // namespace
-void DarwinHttp::get(CSlice url, Promise<BufferSlice> promise) {
+void DarwinHttp::get(CSlice url, Promise<std::pair<int32, BufferSlice>> promise) {
return http_send(http_get(url), std::move(promise));
}
-void DarwinHttp::post(CSlice url, Slice data, Promise<BufferSlice> promise) {
+void DarwinHttp::post(CSlice url, Slice data, Promise<std::pair<int32, BufferSlice>> promise) {
return http_send(http_post(url, data), std::move(promise));
}