Skip to content

Commit

Permalink
Move class HttpDate to tdutils.
Browse files Browse the repository at this point in the history
  • Loading branch information
levlam committed May 20, 2024
1 parent 699707a commit 53c3e79
Show file tree
Hide file tree
Showing 7 changed files with 131 additions and 97 deletions.
2 changes: 1 addition & 1 deletion td/telegram/Birthdate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
//
#include "td/telegram/Birthdate.h"

#include "td/telegram/ConfigManager.h"
#include "td/utils/HttpDate.h"

namespace td {

Expand Down
79 changes: 1 addition & 78 deletions td/telegram/ConfigManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,10 @@
#include "td/utils/emoji.h"
#include "td/utils/FlatHashMap.h"
#include "td/utils/format.h"
#include "td/utils/HttpDate.h"
#include "td/utils/JsonBuilder.h"
#include "td/utils/logging.h"
#include "td/utils/misc.h"
#include "td/utils/Parser.h"
#include "td/utils/port/Clocks.h"
#include "td/utils/Random.h"
#include "td/utils/SliceBuilder.h"
Expand All @@ -77,83 +77,6 @@ namespace td {

int VERBOSITY_NAME(config_recoverer) = VERBOSITY_NAME(INFO);

Result<int32> HttpDate::to_unix_time(int32 year, int32 month, int32 day, int32 hour, int32 minute, int32 second) {
if (year < 1970 || year > 2037) {
return Status::Error("Invalid year");
}
if (month < 1 || month > 12) {
return Status::Error("Invalid month");
}
if (day < 1 || day > days_in_month(year, month)) {
return Status::Error("Invalid day");
}
if (hour < 0 || hour >= 24) {
return Status::Error("Invalid hour");
}
if (minute < 0 || minute >= 60) {
return Status::Error("Invalid minute");
}
if (second < 0 || second > 60) {
return Status::Error("Invalid second");
}

int32 res = 0;
for (int32 y = 1970; y < year; y++) {
res += (is_leap(y) + 365) * seconds_in_day();
}
for (int32 m = 1; m < month; m++) {
res += days_in_month(year, m) * seconds_in_day();
}
res += (day - 1) * seconds_in_day();
res += hour * 60 * 60;
res += minute * 60;
res += second;
return res;
}

Result<int32> HttpDate::parse_http_date(string slice) {
Parser p(slice);
p.read_till(','); // ignore week day
p.skip(',');
p.skip_whitespaces();
p.skip_nofail('0');
TRY_RESULT(day, to_integer_safe<int32>(p.read_word()));
auto month_name = p.read_word();
to_lower_inplace(month_name);
TRY_RESULT(year, to_integer_safe<int32>(p.read_word()));
p.skip_whitespaces();
p.skip_nofail('0');
TRY_RESULT(hour, to_integer_safe<int32>(p.read_till(':')));
p.skip(':');
p.skip_nofail('0');
TRY_RESULT(minute, to_integer_safe<int32>(p.read_till(':')));
p.skip(':');
p.skip_nofail('0');
TRY_RESULT(second, to_integer_safe<int32>(p.read_word()));
auto gmt = p.read_word();
TRY_STATUS(std::move(p.status()));
if (gmt != "GMT") {
return Status::Error("Timezone must be GMT");
}

static Slice month_names[12] = {"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"};

int month = 0;

for (int m = 1; m <= 12; m++) {
if (month_names[m - 1] == month_name) {
month = m;
break;
}
}

if (month == 0) {
return Status::Error("Unknown month name");
}

return HttpDate::to_unix_time(year, month, day, hour, minute, second);
}

Result<SimpleConfig> decode_config(Slice input) {
static auto rsa = mtproto::RSA::from_pem_public_key(
"-----BEGIN RSA PUBLIC KEY-----\n"
Expand Down
18 changes: 0 additions & 18 deletions td/telegram/ConfigManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,24 +56,6 @@ ActorOwn<> get_simple_config_firebase_realtime(Promise<SimpleConfigResult> promi
ActorOwn<> get_simple_config_firebase_firestore(Promise<SimpleConfigResult> promise, bool prefer_ipv6,
Slice domain_name, bool is_test, int32 scheduler_id);

class HttpDate {
static bool is_leap(int32 year) {
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}
static int32 seconds_in_day() {
return 24 * 60 * 60;
}

public:
static int32 days_in_month(int32 year, int32 month) {
static int cnt[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
return cnt[month - 1] + (month == 2 && is_leap(year));
}

static Result<int32> to_unix_time(int32 year, int32 month, int32 day, int32 hour, int32 minute, int32 second);
static Result<int32> parse_http_date(std::string slice);
};

class ConfigRecoverer;
class ConfigManager final : public NetQueryCallback {
public:
Expand Down
2 changes: 2 additions & 0 deletions tdutils/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ set(TDUTILS_SOURCE
td/utils/Gzip.cpp
td/utils/GzipByteFlow.cpp
td/utils/Hints.cpp
td/utils/HttpDate.cpp
td/utils/HttpUrl.cpp
td/utils/JsonBuilder.cpp
td/utils/logging.cpp
Expand Down Expand Up @@ -231,6 +232,7 @@ set(TDUTILS_SOURCE
td/utils/HazardPointers.h
td/utils/Heap.h
td/utils/Hints.h
td/utils/HttpDate.h
td/utils/HttpUrl.h
td/utils/int_types.h
td/utils/invoke.h
Expand Down
92 changes: 92 additions & 0 deletions tdutils/td/utils/HttpDate.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
//
// Copyright Aliaksei Levin ([email protected]), Arseny Smirnov ([email protected]) 2014-2024
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#include "td/utils/HttpDate.h"

#include "td/utils/misc.h"
#include "td/utils/Parser.h"
#include "td/utils/Slice.h"

namespace td {

Result<int32> HttpDate::to_unix_time(int32 year, int32 month, int32 day, int32 hour, int32 minute, int32 second) {
if (year < 1970 || year > 2037) {
return Status::Error("Invalid year");
}
if (month < 1 || month > 12) {
return Status::Error("Invalid month");
}
if (day < 1 || day > days_in_month(year, month)) {
return Status::Error("Invalid day");
}
if (hour < 0 || hour >= 24) {
return Status::Error("Invalid hour");
}
if (minute < 0 || minute >= 60) {
return Status::Error("Invalid minute");
}
if (second < 0 || second > 60) {
return Status::Error("Invalid second");
}

int32 res = 0;
for (int32 y = 1970; y < year; y++) {
res += (is_leap(y) + 365) * seconds_in_day();
}
for (int32 m = 1; m < month; m++) {
res += days_in_month(year, m) * seconds_in_day();
}
res += (day - 1) * seconds_in_day();
res += hour * 60 * 60;
res += minute * 60;
res += second;
return res;
}

Result<int32> HttpDate::parse_http_date(string slice) {
Parser p(slice);
p.read_till(','); // ignore week day
p.skip(',');
p.skip_whitespaces();
p.skip_nofail('0');
TRY_RESULT(day, to_integer_safe<int32>(p.read_word()));
auto month_name = p.read_word();
to_lower_inplace(month_name);
TRY_RESULT(year, to_integer_safe<int32>(p.read_word()));
p.skip_whitespaces();
p.skip_nofail('0');
TRY_RESULT(hour, to_integer_safe<int32>(p.read_till(':')));
p.skip(':');
p.skip_nofail('0');
TRY_RESULT(minute, to_integer_safe<int32>(p.read_till(':')));
p.skip(':');
p.skip_nofail('0');
TRY_RESULT(second, to_integer_safe<int32>(p.read_word()));
auto gmt = p.read_word();
TRY_STATUS(std::move(p.status()));
if (gmt != "GMT") {
return Status::Error("Timezone must be GMT");
}

static Slice month_names[12] = {"jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"};

int month = 0;

for (int m = 1; m <= 12; m++) {
if (month_names[m - 1] == month_name) {
month = m;
break;
}
}

if (month == 0) {
return Status::Error("Unknown month name");
}

return to_unix_time(year, month, day, hour, minute, second);
}

} // namespace td
34 changes: 34 additions & 0 deletions tdutils/td/utils/HttpDate.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//
// Copyright Aliaksei Levin ([email protected]), Arseny Smirnov ([email protected]) 2014-2024
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
#pragma once

#include "td/utils/common.h"
#include "td/utils/Status.h"

namespace td {

class HttpDate {
static bool is_leap(int32 year) {
return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
}

static int32 seconds_in_day() {
return 24 * 60 * 60;
}

public:
static int32 days_in_month(int32 year, int32 month) {
static int cnt[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
return cnt[month - 1] + (month == 2 && is_leap(year));
}

static Result<int32> to_unix_time(int32 year, int32 month, int32 day, int32 hour, int32 minute, int32 second);

static Result<int32> parse_http_date(string slice);
};

} // namespace td
1 change: 1 addition & 0 deletions test/mtproto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "td/utils/BufferedFd.h"
#include "td/utils/common.h"
#include "td/utils/crypto.h"
#include "td/utils/HttpDate.h"
#include "td/utils/logging.h"
#include "td/utils/port/Clocks.h"
#include "td/utils/port/IPAddress.h"
Expand Down

0 comments on commit 53c3e79

Please sign in to comment.