aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/PSVita/Network/SonyHttp_Vita.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/PSVita/Network/SonyHttp_Vita.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.Client/PSVita/Network/SonyHttp_Vita.cpp')
-rw-r--r--Minecraft.Client/PSVita/Network/SonyHttp_Vita.cpp271
1 files changed, 271 insertions, 0 deletions
diff --git a/Minecraft.Client/PSVita/Network/SonyHttp_Vita.cpp b/Minecraft.Client/PSVita/Network/SonyHttp_Vita.cpp
new file mode 100644
index 00000000..9110edf5
--- /dev/null
+++ b/Minecraft.Client/PSVita/Network/SonyHttp_Vita.cpp
@@ -0,0 +1,271 @@
+#include "stdafx.h"
+#include "SonyHttp_Vita.h"
+
+static const int sc_SSLHeapSize = (304 * 1024U);
+static const int sc_HTTPHeapSize = (80 * 1024);
+static const int sc_NetHeapSize = (16 * 1024);
+
+#define TEST_USER_AGENT "SimpleSample/1.00"
+
+
+// int SonyHttp_Vita::libnetMemId = 0;
+int SonyHttp_Vita::libsslCtxId = 0;
+int SonyHttp_Vita::libhttpCtxId = 0;
+bool SonyHttp_Vita:: bInitialised = false;
+
+
+
+
+
+bool SonyHttp_Vita::init()
+{
+// int ret = sceNetPoolCreate("simple", sc_NetHeapSize, 0);
+// assert(ret >= 0);
+// libnetMemId = ret;
+
+// int ret = sceSslInit(sc_SSLHeapSize);
+// assert(ret >= 0 || ret == SCE_SSL_ERROR_ALREADY_INITED);
+// libsslCtxId = ret;
+//
+// ret = sceHttpInit(sc_HTTPHeapSize);
+// assert(ret >= 0 || ret == SCE_HTTP_ERROR_ALREADY_INITED);
+// libhttpCtxId = ret;
+
+ bInitialised = true;
+ return true;
+}
+
+void SonyHttp_Vita::shutdown()
+{
+ PSVITA_STUBBED;
+// int ret = sceHttpTerm(libhttpCtxId);
+// assert(ret == SCE_OK);
+//
+// ret = sceSslTerm(libsslCtxId);
+// assert(ret == SCE_OK);
+//
+// /* libnet */
+// ret = sceNetPoolDestroy(libnetMemId);
+// assert(ret == SCE_OK);
+
+}
+void SonyHttp_Vita::printSslError(SceInt32 sslErr, SceUInt32 sslErrDetail)
+{
+ switch (sslErr)
+ {
+ case (SCE_HTTPS_ERROR_CERT): /* Verify error */
+ /* Internal error at verifying certificate*/
+ if (sslErrDetail & SCE_HTTPS_ERROR_SSL_INTERNAL){
+ app.DebugPrintf("ssl verify error: unexpcted error\n");
+ }
+ /* Error of server certificate or CA certificate */
+ if (sslErrDetail & SCE_HTTPS_ERROR_SSL_INVALID_CERT){
+ app.DebugPrintf("ssl verify error: invalid server cert or CA cert\n");
+ }
+ /* Server hostname and server certificate are mismatched*/
+ if (sslErrDetail & SCE_HTTPS_ERROR_SSL_CN_CHECK){
+ app.DebugPrintf("ssl verify error: invalid server hostname\n");
+ }
+ /* Server certificate or CA certificate is expired.*/
+ if (sslErrDetail & SCE_HTTPS_ERROR_SSL_NOT_AFTER_CHECK){
+ app.DebugPrintf("ssl verify error: server cert or CA cert had expired\n");
+ }
+ /* Server certificate or CA certificate is before validated.*/
+ if (sslErrDetail & SCE_HTTPS_ERROR_SSL_NOT_BEFORE_CHECK){
+ app.DebugPrintf("ssl verify error: server cert or CA cert isn't validated yet.\n");
+ }
+ /* Unknown CA error */
+ if (sslErrDetail & SCE_HTTPS_ERROR_SSL_UNKNOWN_CA){
+ app.DebugPrintf("ssl verify error: unknown CA\n");
+ }
+ break;
+ case (SCE_HTTPS_ERROR_HANDSHAKE): /* fail to ssl-handshake */
+ app.DebugPrintf("ssl error: handshake error\n");
+ break;
+ case (SCE_HTTPS_ERROR_IO): /* Error of Socket IO */
+ app.DebugPrintf("ssl error: io error\n");
+ break;
+ case (SCE_HTTP_ERROR_OUT_OF_MEMORY): /* Out of memory*/
+ app.DebugPrintf("ssl error: out of memory\n");
+ break;
+ case (SCE_HTTPS_ERROR_INTERNAL): /* Unexpected Internal Error*/
+ app.DebugPrintf("ssl error: unexpcted error\n");
+ break;
+ default:
+ break;
+ }
+ return;
+}
+
+
+void SonyHttp_Vita::printSslCertInfo(SceSslCert *sslCert)
+{
+ SceInt32 ret;
+ const SceUChar8 *sboData;
+ SceSize sboLen, counter;
+
+ ret = sceSslGetSerialNumber(sslCert, &sboData, &sboLen);
+ if (ret < 0){
+ app.DebugPrintf ("sceSslGetSerialNumber() returns 0x%x\n", ret);
+ } else {
+ app.DebugPrintf("Serial number=");
+ for (counter = 0; counter < sboLen; counter++){
+ app.DebugPrintf("%02X", sboData[counter]);
+ }
+ app.DebugPrintf("\n");
+ }
+}
+
+
+bool SonyHttp_Vita::getDataFromURL( const char* szURL, void** ppOutData, int* pDataSize)
+{
+ if(!bInitialised)
+ return false;
+ return http_get(szURL, ppOutData, pDataSize);
+}
+
+
+int SonyHttp_Vita::sslCallback(SceUInt32 verifyErr, SceSslCert * const sslCert[], SceInt32 certNum, void *userArg)
+{
+ SceInt32 i;
+ (void)userArg;
+
+ app.DebugPrintf("Ssl callback:\n");
+ app.DebugPrintf("\tbase tmpl[%x]\n", (SceInt32)userArg);
+
+ if (verifyErr != 0){
+ printSslError((SceInt32)SCE_HTTPS_ERROR_CERT, verifyErr);
+ }
+ for (i = 0; i < certNum; i++){
+ printSslCertInfo(sslCert[i]);
+ }
+ if (verifyErr == 0){
+ return SCE_OK;
+ } else {
+ return -1;
+ }
+}
+
+bool SonyHttp_Vita::http_get_close(bool bOK, SceInt32 tmplId, SceInt32 connId, SceInt32 reqId)
+{
+ SceInt32 ret;
+ if (reqId > 0)
+ {
+ ret = sceHttpDeleteRequest(reqId);
+ assert(ret >= 0);
+ }
+ if (connId > 0)
+ {
+ ret = sceHttpDeleteConnection(connId);
+ assert(ret >= 0);
+ }
+ if (tmplId > 0)
+ {
+ ret = sceHttpDeleteTemplate(tmplId);
+ assert(ret >= 0);
+ }
+ assert(bOK);
+ return bOK;
+}
+
+bool SonyHttp_Vita::http_get(const char *targetUrl, void** ppOutData, int* pDataSize)
+{
+ SceInt32 ret, tmplId=0, connId=0, reqId=0, statusCode;
+ SceULong64 contentLength=0;
+ SceBool finFlag=SCE_FALSE;
+ SceUChar8* recvBuf;
+
+ ret = sceHttpCreateTemplate(TEST_USER_AGENT, SCE_HTTP_VERSION_1_1, SCE_TRUE);
+ if (ret < 0)
+ {
+ app.DebugPrintf("sceHttpCreateTemplate() error: 0x%08X\n", ret);
+ return http_get_close(false, tmplId, connId, reqId);
+ }
+ tmplId = ret;
+
+ /* Perform http_get without server verification */
+ ret = sceHttpsDisableOption(SCE_HTTPS_FLAG_SERVER_VERIFY);
+ if (ret < 0)
+ {
+ app.DebugPrintf("sceHttpsDisableOption() error: 0x%08X\n", ret);
+ return http_get_close(false, tmplId, connId, reqId);
+ }
+
+ /* Register SSL callback */
+ ret = sceHttpsSetSslCallback(tmplId, sslCallback, (void*)&tmplId);
+ if (ret < 0)
+ {
+ app.DebugPrintf("sceHttpsSetSslCallback() error: 0x%08X\n", ret);
+ return http_get_close(false, tmplId, connId, reqId);
+ }
+
+ ret = sceHttpCreateConnectionWithURL(tmplId, targetUrl, SCE_TRUE);
+ if (ret < 0)
+ {
+ app.DebugPrintf("sceHttpCreateConnectionWithURL() error: 0x%08X\n", ret);
+ return http_get_close(false, tmplId, connId, reqId);
+ }
+ connId = ret;
+
+ ret = sceHttpCreateRequestWithURL(connId, SCE_HTTP_METHOD_GET, targetUrl, 0);
+ if (ret < 0)
+ {
+ app.DebugPrintf("sceHttpCreateRequestWithURL() error: 0x%08X\n", ret);
+ return http_get_close(false, tmplId, connId, reqId);
+ }
+ reqId = ret;
+
+ ret = sceHttpSendRequest(reqId, NULL, 0);
+ if (ret < 0)
+ {
+ app.DebugPrintf("sceHttpSendRequest() error: 0x%08X\n", ret);
+ return http_get_close(false, tmplId, connId, reqId);
+ }
+
+ ret = sceHttpGetStatusCode(reqId, &statusCode);
+ if (ret < 0)
+ {
+ app.DebugPrintf("sceHttpGetStatusCode() error: 0x%08X\n", ret);
+ return http_get_close(false, tmplId, connId, reqId);
+ }
+ app.DebugPrintf("response code = %d\n", statusCode);
+
+ if(statusCode == 200)
+ {
+ ret = sceHttpGetResponseContentLength(reqId, &contentLength);
+ if(ret < 0)
+ {
+ app.DebugPrintf("sceHttpGetContentLength() error: 0x%08X\n", ret);
+ return http_get_close(false, tmplId, connId, reqId);
+ }
+ else
+ {
+ app.DebugPrintf("Content-Length = %lu\n", contentLength);
+ }
+ recvBuf = new SceUChar8[contentLength+1];
+ int bufferLeft = contentLength+1;
+ SceUChar8* pCurrBuffPos = recvBuf;
+ int totalBytesRead = 0;
+ while(finFlag != SCE_TRUE)
+ {
+ ret = sceHttpReadData(reqId, pCurrBuffPos, bufferLeft);
+ if (ret < 0)
+ {
+ app.DebugPrintf("\n sceHttpReadData() failed 0x%08X\n", ret);
+ return http_get_close(false, tmplId, connId, reqId);
+ }
+ else if (ret == 0)
+ {
+ finFlag = SCE_TRUE;
+ }
+ app.DebugPrintf("\n sceHttpReadData() read %d bytes\n", ret);
+ pCurrBuffPos += ret;
+ totalBytesRead += ret;
+ bufferLeft -= ret;
+ }
+ }
+
+ *ppOutData = recvBuf;
+ *pDataSize = contentLength;
+ return http_get_close(true, tmplId, connId, reqId);
+}