The source code for this example is in otype.c in the nsapi/examples/ or plugins/nsapi/examples subdirectory within the server root directory.
#include "nsapi.h" #include <string.h> /* strncpy */ #include "base/util.h" #ifdef __cplusplus extern "C" #endif NSAPI_PUBLIC int html2shtml(pblock *pb, Session *sn, Request *rq) { /* No parameters */ /* Work variables */ pb_param *path = pblock_find("path", rq->vars); struct stat finfo; char *npath; int baselen; /* If the type has already been set, don’t do anything */ if(pblock_findval("content-type", rq->srvhdrs)) return REQ_NOACTION; /* If path does not end in .html, let normal object types do * their job */ baselen = strlen(path->value) - 5; if(strcasecmp(&path->value[baselen], ".html") != 0) return REQ_NOACTION; /* 1 = Room to convert html to shtml */ npath = (char *) MALLOC((baselen + 5) + 1 + 1); strncpy(npath, path->value, baselen); strcpy(&npath[baselen], ".shtml"); /* If it’s not there, don’t do anything */ if(stat(npath, &finfo) == -1) { FREE(npath); return REQ_NOACTION; } /* Got it, do the switch */ FREE(path->value); path->value = npath; /* The server caches the stat() of the current path. Update it. */ (void) request_stat_path(NULL, rq); pblock_nvinsert("content-type", "magnus-internal/parsed-html", rq->srvhdrs); return REQ_PROCEED; }