net: implement the libSceHttp callback, gzip, chunked, cert and error ABIs

This commit is contained in:
nmzik
2026-10-20 03:57:23 +02:00
parent f186b35706
commit 12ca1599cf
3 changed files with 163 additions and 0 deletions
+9
View File
@@ -739,6 +739,15 @@ LIB_DEFINE(InitNet_1_Http) {
LIB_FUNC("yigr4V0-HTM", Http::HttpSetRecvTimeOut);
LIB_FUNC("T-mGo9f3Pu4", Http::HttpSetAutoRedirect);
LIB_FUNC("qFg2SuyTJJY", Http::HttpSetAuthEnabled);
LIB_FUNC("h9wmFZX4i-4", Http::HttpSetRedirectCallback);
LIB_FUNC("Kh6bS2HQKbo", Http::HttpSetCookieRecvCallback);
LIB_FUNC("vO4B-42ef-k", Http::HttpSetRequestStatusCallback);
LIB_FUNC("i9mhafzkEi8", Http::HttpSetInflateGZIPEnabled);
LIB_FUNC("PDxS48xGQLs", Http::HttpSetChunkedTransferEnabled);
LIB_FUNC("DK+GoXCNT04", Http::HttpsLoadCert);
LIB_FUNC("zXqcE0fizz0", Http::HttpsUnloadCert);
LIB_FUNC("JBN6N-EY+3M", Http::HttpsGetSslError);
LIB_FUNC("0onIrKx9NIE", Http::HttpGetLastErrno);
LIB_FUNC("IWalAn-guFs", LibHttp::HttpUriParse);
LIB_FUNC("YuOW3dDAKYc", LibHttp::HttpUriEscape);
LIB_FUNC("5LZA+KPISVA", LibHttp::HttpUriBuild);
+144
View File
@@ -136,6 +136,7 @@ public:
bool HttpValidTemplate(Id tmpl_id);
bool HttpValidConnection(Id conn_id);
bool HttpValidRequest(Id req_id);
bool HttpValidBase(Id id);
Id HttpCreateConnection(Id tmpl_id, const char* server_name, const char* scheme, uint16_t port,
bool enable_keep_alive);
Id HttpCreateConnectionWithURL(Id tmpl_id, const char* url, bool enable_keep_alive);
@@ -410,6 +411,12 @@ bool Network::HttpValidRequest(Id req_id) {
m_requests[req_id.GetId()].used);
}
bool Network::HttpValidBase(Id id) {
Common::LockGuard lock(m_mutex);
return FindHttpBase(id, true) != nullptr;
}
Network::HttpBase* Network::FindHttpBase(Id id, bool include_request) {
const auto index = id.GetId();
@@ -3013,6 +3020,143 @@ int KYTY_SYSV_ABI HttpSetAuthEnabled(int id, int enable) {
return OK;
}
static int HttpCheckBase(int id) {
EXIT_IF(g_net == nullptr);
return g_net->HttpValidBase(Network::Id(id)) ? OK : HTTP_ERROR_INVALID_ID;
}
int KYTY_SYSV_ABI HttpSetRedirectCallback(int id, void* /*cbfunc*/, void* /*user_arg*/) {
PRINT_NAME();
LOGF("\t id = %d\n", id);
return HttpCheckBase(id);
}
int KYTY_SYSV_ABI HttpSetCookieRecvCallback(int id, void* /*cbfunc*/, void* /*user_arg*/) {
PRINT_NAME();
LOGF("\t id = %d\n", id);
return HttpCheckBase(id);
}
int KYTY_SYSV_ABI HttpSetRequestStatusCallback(int id, void* /*cbfunc*/, void* /*user_arg*/) {
PRINT_NAME();
LOGF("\t id = %d\n", id);
return HttpCheckBase(id);
}
int KYTY_SYSV_ABI HttpSetInflateGZIPEnabled(int id, int is_enable) {
PRINT_NAME();
LOGF("\t id = %d\n"
"\t is_enable = %d\n",
id, is_enable);
return HttpCheckBase(id);
}
int KYTY_SYSV_ABI HttpSetChunkedTransferEnabled(int id, int is_enabled) {
PRINT_NAME();
LOGF("\t id = %d\n"
"\t is_enabled = %d\n",
id, is_enabled);
EXIT_IF(g_net == nullptr);
if (is_enabled != 0 && is_enabled != 1) {
return HTTP_ERROR_INVALID_VALUE;
}
if (!g_net->HttpValidRequest(Network::Id(id))) {
return HTTP_ERROR_INVALID_ID;
}
return OK;
}
int KYTY_SYSV_ABI HttpsLoadCert(int http_ctx_id, int ca_cert_num, const void** /*ca_list*/,
const void* /*cert*/, const void* /*priv_key*/) {
PRINT_NAME();
LOGF("\t http_ctx_id = %d\n"
"\t ca_cert_num = %d\n",
http_ctx_id, ca_cert_num);
EXIT_IF(g_net == nullptr);
if (!g_net->HttpValid(Network::Id(http_ctx_id))) {
return HTTP_ERROR_INVALID_ID;
}
return OK;
}
int KYTY_SYSV_ABI HttpsUnloadCert(int http_ctx_id) {
PRINT_NAME();
LOGF("\t http_ctx_id = %d\n", http_ctx_id);
EXIT_IF(g_net == nullptr);
if (!g_net->HttpValid(Network::Id(http_ctx_id))) {
return HTTP_ERROR_INVALID_ID;
}
return OK;
}
int KYTY_SYSV_ABI HttpsGetSslError(int request_id, int32_t* err_num, uint32_t* detail) {
PRINT_NAME();
LOGF("\t request_id = %d\n"
"\t err_num = 0x%016" PRIx64 "\n"
"\t detail = 0x%016" PRIx64 "\n",
request_id, reinterpret_cast<uint64_t>(err_num), reinterpret_cast<uint64_t>(detail));
if (err_num == nullptr || detail == nullptr) {
return HTTP_ERROR_INVALID_VALUE;
}
*err_num = 0;
*detail = 0;
EXIT_IF(g_net == nullptr);
if (!g_net->HttpValidRequest(Network::Id(request_id))) {
return HTTP_ERROR_INVALID_ID;
}
return OK;
}
int KYTY_SYSV_ABI HttpGetLastErrno(int request_id, int* err_num) {
PRINT_NAME();
LOGF("\t request_id = %d\n"
"\t err_num = 0x%016" PRIx64 "\n",
request_id, reinterpret_cast<uint64_t>(err_num));
if (err_num == nullptr) {
return HTTP_ERROR_INVALID_VALUE;
}
*err_num = 0;
EXIT_IF(g_net == nullptr);
if (!g_net->HttpValidRequest(Network::Id(request_id))) {
return HTTP_ERROR_INVALID_ID;
}
return OK;
}
int KYTY_SYSV_ABI HttpAddRequestHeader(int id, const char* name, const char* value, uint32_t mode) {
PRINT_NAME();
+10
View File
@@ -136,6 +136,16 @@ int KYTY_SYSV_ABI HttpSetSendTimeOut(int id, uint32_t usec);
int KYTY_SYSV_ABI HttpSetRecvTimeOut(int id, uint32_t usec);
int KYTY_SYSV_ABI HttpSetAutoRedirect(int id, int enable);
int KYTY_SYSV_ABI HttpSetAuthEnabled(int id, int enable);
int KYTY_SYSV_ABI HttpSetRedirectCallback(int id, void* cbfunc, void* user_arg);
int KYTY_SYSV_ABI HttpSetCookieRecvCallback(int id, void* cbfunc, void* user_arg);
int KYTY_SYSV_ABI HttpSetRequestStatusCallback(int id, void* cbfunc, void* user_arg);
int KYTY_SYSV_ABI HttpSetInflateGZIPEnabled(int id, int is_enable);
int KYTY_SYSV_ABI HttpSetChunkedTransferEnabled(int id, int is_enabled);
int KYTY_SYSV_ABI HttpsLoadCert(int http_ctx_id, int ca_cert_num, const void** ca_list,
const void* cert, const void* priv_key);
int KYTY_SYSV_ABI HttpsUnloadCert(int http_ctx_id);
int KYTY_SYSV_ABI HttpsGetSslError(int request_id, int32_t* err_num, uint32_t* detail);
int KYTY_SYSV_ABI HttpGetLastErrno(int request_id, int* err_num);
} // namespace Http