/* * bridge_cookie.prg - FiveNode * * Copyright (c) 2026 Charles KWON ( Charles KWON Ohjun, charleskwonohjun@gmail.com ) * All rights reserved. */ // bridge_cookie.prg // Cookie functions (6) - mod_harbourv2 100% compatible FUNCTION fn_GetCookies( cKey ) LOCAL hCookies := _parse_cookies() IF cKey == NIL RETURN hCookies ENDIF IF hb_HHasKey( hCookies, cKey ) RETURN hCookies[ cKey ] ENDIF RETURN "" FUNCTION AP_COOKIE_READ( cName ) RETURN fn_GetCookies( cName ) FUNCTION fn_SetCookie( cName, cValue, nSecs, cPath, cDomain, lHttps, lOnlyHttp ) LOCAL cCookie, aCookies hb_default( @cPath, "/" ) hb_default( @lHttps, .F. ) hb_default( @lOnlyHttp, .F. ) cCookie := cName + "=" + cValue IF nSecs != NIL cCookie += "; Max-Age=" + hb_ntos( nSecs ) ENDIF cCookie += "; Path=" + cPath IF cDomain != NIL cCookie += "; Domain=" + cDomain ENDIF IF lHttps cCookie += "; Secure" ENDIF IF lOnlyHttp cCookie += "; HttpOnly" ENDIF aCookies := ctx_get( "cookies_out", {} ) AAdd( aCookies, cCookie ) ctx_set( "cookies_out", aCookies ) RETURN NIL FUNCTION AP_COOKIE_WRITE( cName, cValue, nExpire ) RETURN fn_SetCookie( cName, cValue, nExpire ) FUNCTION AP_COOKIE_REMOVE( cName ) RETURN fn_SetCookie( cName, "", 0 ) FUNCTION AP_COOKIE_CHECK_STRING( cString ) IF Empty( cString ) RETURN .F. ENDIF IF ";" $ cString .OR. Chr(13) $ cString .OR. Chr(10) $ cString RETURN .F. ENDIF RETURN .T. // ── Cookie parsing helper ── STATIC FUNCTION _parse_cookies() LOCAL hHeaders, cRaw, aParts, cPart, aPair LOCAL hCookies := { => } hHeaders := AP_HEADERSIN() IF hb_HHasKey( hHeaders, "Cookie" ) cRaw := hHeaders[ "Cookie" ] aParts := hb_ATokens( cRaw, ";" ) FOR EACH cPart IN aParts cPart := AllTrim( cPart ) aPair := hb_ATokens( cPart, "=" ) IF Len( aPair ) >= 2 hCookies[ AllTrim( aPair[1] ) ] := AllTrim( aPair[2] ) ENDIF NEXT ENDIF RETURN hCookies // -- mod_harbour compatibility wrappers -- FUNCTION MH_GetCookies( cKey ) RETURN fn_GetCookies( cKey ) FUNCTION MH_SetCookie( cName, cValue, nSecs, cPath, cDomain, lHttps, lOnlyHttp ) RETURN fn_SetCookie( cName, cValue, nSecs, cPath, cDomain, lHttps, lOnlyHttp )