9.6 KiB
libSceHttp technical debt
Silent stubs
- libSceHttp - no request reaches the network, so
sceHttpSetResponseHeaderMaxSizehas no response header to limit,sceHttpSetRecvBlockSize((int id, u32 blockSize)as in shadPS4) no response body to read in blocks andsceHttpRedirectCacheFlushno redirect to forget;sceHttpsUnloadCertreturns success likesceHttpsLoadCert, which keeps no certificate;sceHttpSetRedirectCallbackandsceHttpSetCookieRecvCallbackaccept callbacks that are never called,sceHttpsSetSslVersionhas no TLS connection to configure andsceHttpsGetSslErrorreports error 0 with detail 0;sceHttpSetAuthInfoCallbackaccepts a callback that is never called, as no server asks for authentication;sceHttpsGetCaListandsceHttpsFreeCaListreport an empty CA list (certsnull,certsNum0) and return 0, as no CA store is kept, and a null list returnsERROR_INVALID_VALUE; unlike shadPS4 they do not check thathttp_ctx_idis a live context nor that the library is initialised, andsceHttpsFreeCaListalso nullscerts, which shadPS4 leaves untouched. The signatures and the{ void* certs; int certsNum; }layout follow shadPS4 (PS4), not confirmed on a PS5 title
Unknown function info
- sceHttpUriBuild (libSceHttp) retains
//for a non-opaque URI independently of the selected fields, following shadPS4. Black Myth: Wukong builds itsSchemeheader with option 1 and expectshttp://orhttps://. Other partial field combinations follow the PS4 reference and remain unverified on PS5 hardware. - sceHttpSetCookieEnabled - the two-argument signature and 0/1 enable values follow VitaSDK and shadPS4; PPSA01521 passes 0 to disable cookies. Disabling succeeds because the offline HTTP backend has no cookie engine; enabling throws. Invalid enable values use the same error as
sceHttpSetInflateGZIPEnabled. Like the existing offline HTTP setters, the handle is not validated; requests still fail with the network error. Console behavior is unverified - sceHttpParseResponseHeader (libSceHttp) - signature follows SharpProspero; parsing and error codes follow shadPS4's reverse-engineered PS4 library, not confirmed on a PS5 title or hardware. Folded values retain their line breaks and whitespace; an empty first line starts the value scan after its line feed. A consumed byte count above
INT_MAXthrows instead of wrapping. - sceHttpParseStatusLine (libSceHttp) - behaviour and error codes follow the shadPS4 reimplementation of the PS4 library, not confirmed on a PS5 title; unlike it, no byte past
lineLenis read - sceHttpUriMerge (libSceHttp) - signature follows SharpProspero; validation, size formula, absolute/relative split and path join follow the disassembly-like body in shadPS4, not confirmed on a PS5 title or hardware. The base URL goes through our
sceHttpUriParse, which removes dot segments from the base path, while the relative part is appended unswept; base query and fragment are dropped. The relative reference is only classified by its scheme and a leading//, and only references with//are validated; as in shadPS4,//host/xis returned unchanged instead of taking the base scheme, a reference with a scheme but no//(mailto:x) is joined onto the base directory, and?qand#fare appended to the base directory instead of the base path. - sceHttpUriUnescape (libSceHttp) - signature follows SharpProspero; percent decoding, invalid sequences and error codes follow shadPS4, not confirmed on a PS5 title or hardware. Size includes the final NUL; malformed escapes and
+remain unchanged, and decoding runs once. - sceHttpUriSweepPath (libSceHttp) - behaviour follows the shadPS4 reimplementation of the PS4 library and its tests (including the PS4 SDK example), not confirmed on a PS5 title or hardware. It is not RFC 3986 5.2.4: a path that doesn't start with
/is copied unchanged and a trailing.or..without a slash is kept. Unlike shadPS4, nothing at or pastsrcSize - 1is read, andsrcSize == 1writes only the terminator - sceHttpSetResponseHeaderMaxSize, sceHttpRedirectCacheFlush, sceHttpsUnloadCert (libSceHttp) - signatures follow shadPS4 (PS4); no PS5 reference has them
- sceHttpSetRequestStatusCallback - the three-argument ABI follows shadPS4. Registrations and user data are retained and removed on request deletion; the offline backend never dispatches callbacks. Invalid ids return
0x80431100, an uncited assumption, not a verified console error. Handle hierarchy, inheritance and deleted-handle validation remain incomplete; callback statuses and dispatch timing are unknown. - sceHttpSetRedirectCallback, sceHttpSetCookieRecvCallback, sceHttpsSetSslVersion, sceHttpsGetSslError (libSceHttp) - signatures follow shadPS4 (PS4), which only logs and returns 0; a null
errNumordetailinsceHttpsGetSslErroris assumed to returnSCE_HTTP_ERROR_INVALID_VALUElikesceHttpGetLastErrno - sceHttpSetAuthInfoCallback (libSceHttp) - signature and callback type follow shadPS4 (PS4); no PS5 reference has them. The
idis not checked, as in the other libSceHttp setters - sceHttpWaitRequest (libSceHttp) - the timeout is assumed to be in microseconds and a negative timeout to wait without limit; the invalid-value error for a null handle or event array or a non-positive event count is assumed, not measured. No request is ever pending, so a wait returns 0 events when its timeout passes
- sceHttpUriCopy (libSceHttp) - read from the disassembly of libSceHttp.sprx on firmware 13.60, not measured on a console and not compared with other emulators. The arguments are (out, src, pool, prepare, require),
preparebeforerequire, the reverse ofsceHttpUriParse. A null source returnsERROR_INVALID_URL; without an output or a pool, a nullrequirereturnsERROR_INVALID_VALUE, otherwise the size is only reported. Only the scheme, hostname, path, username and password are copied, in that order, each with its terminator (a missing one becomes an empty string and takes one byte), and the port; the query, the fragment and the opaque flag stay 0. A pool that is too small clears the output and the pool and returnsERROR_OUT_OF_MEMORY(0x80431022, the console's out-of-size error)
Functional
-
sceHttpUriEscape escapes every byte except the ASCII unreserved set in RFC 3986 section 2.3, independently of the host locale. Console behaviour for non-ASCII input remains unmeasured.
-
sceHttpAbortWaitRequest, sceHttpWaitRequest (libSceHttp) - the abort takes only the epoll handle, as in Orbital and SharpProspero; behaviour and error codes follow shadPS4 (PS4), not confirmed on a PS5 title or hardware. An abort stays set: every later wait on the handle, a poll included, returns
SCE_HTTP_ERROR_ABORTED(0x80431080) until the handle is destroyed. A wait woken bysceHttpDestroyEpoll, or by thesceHttpTermthat ends the last context, returns 0 events. The epoll calls returnBEFORE_INIT(0x80431001) while nosceHttpInitcontext is alive andINVALID_ID(0x80431100) for an unknown context or handle, andsceHttpTermreturns the same errors instead of succeeding for any id. Handles are pointers, so a stale handle whose address a newer epoll reuses is taken as that epoll