in src/generic/webout.c [191:413]
int Web_Response(ClientData clientData, Tcl_Interp * interp,
int objc, Tcl_Obj * CONST objv[])
{
ResponseObj *responseObj = NULL;
OutData *outData = NULL;
/*
char *channelName = NULL;
Tcl_Obj *result = NULL;
Tcl_Channel channel = NULL;
int mode = 0;
int lastIndex = objc -1;
int idx = -1;
int iCurArg = -1;
*/
int res;
static char *params[] = { "-sendheader",
"-select",
"-bytessent",
"-httpresponse",
"-reset",
"-resetall",
NULL
};
enum params
{ SENDHEADER, SELECT, BYTESSENT, HTTPRESPONSE, RESET, RESETALL };
/* --------------------------------------------------------------------------
* sanity
* ----------------------------------------------------------------------- */
WebAssertData(interp, clientData, "web::response", TCL_ERROR)
outData = (OutData *) clientData;
WebAssertData(interp, outData->responseObjHash, "web::response",
TCL_ERROR);
/* get the current response object */
responseObj = outData->defaultResponseObj;
if (responseObj == NULL) {
Tcl_SetResult(interp, "no current response object", TCL_STATIC);
return TCL_ERROR;
}
/* handle first paramList things */
/* note: the keys might not be strictly case sensitive */
res = paramGet((ParamList *) responseObj->headers, interp, objc, objv, 1);
if (res == TCL_CONTINUE) {
if (objc == 1) {
/* ----------------------------------------------------------------------
* return name of default channel
* ------------------------------------------------------------------- */
Tcl_ResetResult(interp); /* empty string */
if (responseObj->name != NULL) {
Tcl_SetObjResult(interp, responseObj->name);
return TCL_OK;
}
Tcl_SetResult(interp, "current response has no name", TCL_STATIC);
return TCL_ERROR;
}
else {
int opt;
if (paramGetIndexFromObj
(interp, objv[1], params, "subcommand", 0, &opt) == TCL_ERROR)
return TCL_ERROR;
switch ((enum params) opt) {
case RESETALL:
WebAssertObjc(objc != 2, 2, NULL);
return resetOutData(interp, outData);
case RESET:{
Tcl_Obj *tmp;
char *tname;
WebAssertObjc(objc != 2, 2, NULL);
/* --------------------------------------------------------------------
* just reset this one
* ----------------------------------------------------------------- */
removeFromHashTable(outData->responseObjHash,
Tcl_GetString(responseObj->name));
tmp = Tcl_DuplicateObj(responseObj->name);
Tcl_IncrRefCount(tmp);
tname = Tcl_GetString(tmp);
if (responseObj == outData->defaultResponseObj)
outData->defaultResponseObj = NULL;
destroyResponseObj((ClientData) responseObj, interp);
/* if we reset the default response object, we have to recreate it
* with our special createDefaultResponseObj function ...
*/
if (isDefaultResponseObj(interp, tname)) {
responseObj = createDefaultResponseObj(interp);
/* add it to Hash Table */
if (appendToHashTable(outData->responseObjHash,
Tcl_GetString(responseObj->name),
(ClientData) responseObj) != TCL_OK) {
Tcl_SetResult(interp,
"could not reset default response object",
TCL_STATIC);
return TCL_ERROR;
}
} else
responseObj = getResponseObj(interp, outData, tname);
Tcl_DecrRefCount(tmp);
if (responseObj == NULL) {
Tcl_SetResult(interp,
"could not reset response object",
TCL_STATIC);
return TCL_ERROR;
}
if (outData->defaultResponseObj == NULL)
outData->defaultResponseObj = responseObj;
return TCL_OK;
break;
}
case SENDHEADER:{
int res;
WebAssertObjc(objc > 3, 2, NULL);
res = responseObj->sendHeader;
if (objc == 3)
/* set new value */
if (Tcl_GetBooleanFromObj(interp, objv[2],
&(responseObj->
sendHeader)) ==
TCL_ERROR) {
return TCL_ERROR;
}
Tcl_SetObjResult(interp, Tcl_NewBooleanObj(res));
return TCL_OK;
break;
}
case SELECT:{
ResponseObj *old = NULL;
char *name = NULL;
/* fprintf(stderr,"DBG -select called\n"); fflush(stderr); */
WebAssertObjc(objc != 3, 2, "channelName");
old = responseObj;
name = Tcl_GetString(objv[2]);
/* we have to find the new channel */
if (!strcmp(name, "default")) {
name = (char *) requestGetDefaultOutChannelName(interp);
}
responseObj =
getResponseObj(interp, outData, name);
if (responseObj == NULL) {
Tcl_ResetResult(interp);
Tcl_AppendResult(interp, "invalid response object \"",
name, "\"",
(char *) NULL);
return TCL_ERROR;
}
outData->defaultResponseObj = responseObj;
Tcl_ResetResult(interp); /* empty string */
if (old->name != NULL) {
Tcl_SetObjResult(interp, old->name);
}
return TCL_OK;
break;
}
case BYTESSENT:
WebAssertObjc(objc != 2, 2, NULL);
Tcl_SetObjResult(interp,
Tcl_NewLongObj(responseObj->bytesSent));
return TCL_OK;
case HTTPRESPONSE:{
Tcl_Obj *current;
WebAssertObjc(objc > 3, 2, NULL);
current = responseObj->httpresponse;
if (current)
Tcl_SetObjResult(interp, current);
if (objc == 3) {
/* if length = 0 we reset
* if equal to "default", take from HTTP_RESPONSE
* otherwise take value */
int len;
char *response = Tcl_GetStringFromObj(objv[2], &len);
if (len == 0)
responseObj->httpresponse = NULL;
else {
if (!strcmp("default", response)) {
responseObj->httpresponse =
Tcl_NewStringObj(HTTP_RESPONSE, -1);
}
else {
responseObj->httpresponse =
Tcl_DuplicateObj(objv[2]);
}
Tcl_IncrRefCount(responseObj->httpresponse);
}
/* forget old value */
if (current)
Tcl_DecrRefCount(current);
}
return TCL_OK;
break;
}
default:
break;
}
}
WebAssertObjc(1, 1, "(unknown syntax)");
}
return res;
}