Hello,

It was good to meet everyone at the summit in Sunnyvale.

I raised this question with a few people at the summit.  I'm writing a
content-scanning plug-in that must block requests and return a 403 response
depending on the URL or content of the request.  The people I spoke to
directed me towards the TSHttpTxnIntercept() API function.  This allows a
plug-in to take over responsibility for servicing a request i.e. the
plug-in can return its own response, so at first I was very hopeful, it
seemed to be just what I needed.  I've hit a problem however.

The TSHttpTxnIntercept() function, according to the documentation, can only
be called from the TS_HTTP_READ_REQUEST_HDR_HOOK.  That's fine for GET
requests where the decision to allow or block the request is based purely
on the URL, but it gives me a problem for POST requests where the decision
can be based on the content of the POST message.  At the point this hook is
called the POST content is not available so my plug-in has no choice but to
intercept the transaction just in case it needs to be blocked.  This means
the plug-in has to service all POST requests itself which is clearly
unsatisfactory.  (Having intercepted a transaction there doesn't seem to be
a way to cancel the intercept later.)

Is there a better way for a plug-in to intercept a POST request and return
its own response?

This raises the question of whether it is even possible for a plug-in to
buffer-up the POST data and prevent it being forward to the origin server
until the plug-in has received the complete message from the client and
scanned it.

The documentation for transformation plug-ins (specifically for Sample
Buffered Null Transform Plugin) describes how a plug-in can buffer-up
response data and process it before allowing it to flow to the client but
it doesn't mention request data.

Is it possible for a plug-in to buffer up POST data and prevent it flowing
to the server until the plug-in has received the entire message from the
client?

Many thanks for your help,
Rob Maidment

Reply via email to