The following example is located in the ntrans.c file in the plugins/nsapi/examples subdirectory of the server root directory.
#include "nsapi.h" #include <string.h> /* strchr */ #include "frame/log.h" /* log_error */ #ifdef __cplusplus extern "C" #endif NSAPI_PUBLIC int explicit_pathinfo(pblock *pb, Session *sn, Request *rq) { /* Parameter: The character to split the path by */ char *sep = pblock_findval("separator", pb); /* Server variables */ char *ppath = pblock_findval("ppath", rq->vars); /* Temp var */ char *t; /* Verify correct usage */ if(!sep) { log_error(LOG_MISCONFIG, "explicit-pathinfo", sn, rq, "missing parameter (need root)"); /* When we abort, the default status code is 500 Server Error */ return REQ_ABORTED; } /* Check for separator. If not there, don’t do anything */ t = strchr(ppath, sep[0]); if(!t) return REQ_NOACTION; /* Truncate path at the separator */ *t++ = ’\\0’; /* Assign path information */ pblock_nvinsert("path-info", t, rq->vars); /* Normally NameTrans functions return REQ_PROCEED when they change the path. However, we want name translation to continue after we’re done. */ return REQ_NOACTION; } #include "base/util.h" /* is_mozilla */ #include "frame/protocol.h" /* protocol_status */ #include "base/shexp.h" /* shexp_cmp */ #ifdef __cplusplus extern "C" #endif NSAPI_PUBLIC int https_redirect(pblock *pb, Session *sn, Request *rq) { /* Server Variable */ char *ppath = pblock_findval("ppath", rq->vars); /* Parameters */ char *from = pblock_findval("from", pb); char *url = pblock_findval("url", pb); char *alt = pblock_findval("alt", pb); /* Work vars */ char *ua; /* Check usage */ if((!from) || (!url)) { log_error(LOG_MISCONFIG, "https-redirect", sn, rq, "missing parameter (need from, url)"); return REQ_ABORTED; } /* Use wildcard match to see if this path is one we should redirect */ if(shexp_cmp(ppath, from) != 0) return REQ_NOACTION; /* no match */ /* Sigh. The only way to check for SSL capability is to check UA */ if(request_header("user-agent", &ua, sn, rq) == REQ_ABORTED) return REQ_ABORTED; /* The is_mozilla function checks for Mozilla version 0.96 or greater */ if(util_is_mozilla(ua, "0", "96")) { /* Set the return code to 302 Redirect */ protocol_status(sn, rq, PROTOCOL_REDIRECT, NULL); /* The error handling functions use this to set the Location: */ pblock_nvinsert("url", url, rq->vars); return REQ_ABORTED; } /* No match. Old client. */ /* If there is an alternate document specified, use it. */ if(alt) { pb_param *pp = pblock_find("ppath", rq->vars); /* Trash the old value */ FREE(pp->value); /* We must dup it because the library will later free this pblock */ pp->value = STRDUP(alt); return REQ_PROCEED; } /* Else do nothing */ return REQ_NOACTION; }