#include "helpers.h" #include "callback.h" ///////////////////////////////////////////////////////////////////////////// static std::vector g_afr; ///////////////////////////////////////////////////////////////////////////// int InitializeStaticFiles(const char *pszRootDir, struct _u_instance *pInst, json_error_t &rJerr) { int nRet = 0; char szFilename[PATH_MAX + 32]; sprintf(szFilename, "%s/staticfiles.json", pszRootDir); if(FileExist(szFilename)) { CJson_t jtRoot(json_load_file(szFilename, JSON_REJECT_DUPLICATES, &rJerr)); // new reference! if(jtRoot.IsValid()) { const char *pszVal; bool bVal; if(!jtRoot.IsArray()) { ETRACE("staticfiles.json contains no array!\n"); return -1; } for(size_t i = 0; i < json_array_size(jtRoot); i++) { FILEREQUEST fr; CJson_t jtArr(json_array_get(jtRoot, i), false); // borrowed reference! if(jtArr.IsValid()) { if(!jtArr.IsObject()) { ETRACE("staticfiles.json: element %zu is no object!\n", i); return -1; } json_t *pjtMethod = json_object_get(jtArr, "method"); pszVal = json_string_value(pjtMethod); fr.strMethod = pszVal; json_t *pjtUrl = json_object_get(jtArr, "URL"); pszVal = json_string_value(pjtUrl); fr.strURL = pszVal; json_t *pjtFilename = json_object_get(jtArr, "fileName"); pszVal = json_string_value(pjtFilename); sprintf(szFilename, "%s/%s", pszRootDir, pszVal); fr.strFilename = szFilename; json_t *pjtContentType = json_object_get(jtArr, "contentType"); pszVal = json_string_value(pjtContentType); fr.strContentType = pszVal; json_t *pjtIsString = json_object_get(jtArr, "isString"); bVal = json_boolean_value(pjtIsString); fr.bString = bVal; fr.pfnCallback = &FileBodyResponseCallback; g_afr.push_back(fr); } else { ETRACE("Error!\n"); return -1; } } } else { if(rJerr.column == -1 || rJerr.line == -1) { TRACE("staticfiles.json: no static files configured.\n"); return 0; } else { ETRACE("%s: line %d, column %d: %s.\n", szFilename, rJerr.line, rJerr.column, rJerr.text); return -1; } } } else { // TRACE("No static files found.\n"); return 0; } // Endpoint list declaration for(auto it = g_afr.begin(); it != g_afr.end(); it++) { FILEREQUEST &rfr = *it; if(ulfius_add_endpoint_by_val(pInst, rfr.strMethod.c_str(), rfr.strURL.c_str(), NULL, 0, rfr.pfnCallback, &rfr) != U_OK) { ETRACE("Error adding endpoint for URL '%s'!\n", rfr.strURL.c_str()); return -1; } else { nRet++; } } return nRet; }