From 243896dc3fc7da22c08e263259f02959c7f26f5f Mon Sep 17 00:00:00 2001 From: koennecke Date: Fri, 3 Mar 2006 15:31:32 +0000 Subject: [PATCH] - chnages to new http HM code --- libpsi.a | Bin 1731870 -> 1734618 bytes sinqhttp.c | 188 ++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 151 insertions(+), 37 deletions(-) diff --git a/libpsi.a b/libpsi.a index 476d5696a6b16bee097ffdae55a4ca7a25221dc3..c5e0124847a85ff69a2fd8df4b7a853f6393ef98 100644 GIT binary patch delta 31529 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 + while((httpStatus = ghttp_process(self->syncRequest)) + == ghttp_not_done){ + } + self->asyncRunning = 0; + } self->errorCode = 0; ghttp_clean(self->syncRequest); @@ -71,25 +80,59 @@ static int sinqHttpGet(pSinqHttp self, char *request){ self->errorCode = BADURL; return 0; } + ghttp_set_authinfo(self->syncRequest,self->userName, + self->passWord); + ghttp_set_sync(self->syncRequest,ghttp_sync); + return 1; +} +/*-------------------------------------------------------------------*/ +static int sinqHttpCheckResponse(pSinqHttp self){ + char *pPtr = NULL; + int len; + + self->failCount = 0; + pPtr = ghttp_get_body(self->syncRequest); + len = ghttp_get_body_len(self->syncRequest); + if(len > 511){ + len = 510; + } + if(strstr(pPtr,"ERROR") != NULL){ + memset(self->hmError,0,512*sizeof(char)); + strncpy(self->hmError,pPtr, len); + self->errorCode = HTTPERROR; + return 0; + } else if(strstr(pPtr,"Authentication Error") != NULL){ + memset(self->hmError,0,512*sizeof(char)); + strncpy(self->hmError,pPtr, len); + self->errorCode = BADAUTH; + return 0; + } + return 1; +} +/*-------------------------------------------------------------------*/ +static int sinqHttpGet(pSinqHttp self, char *request){ + ghttp_status httpStatus; + char *pPtr = NULL; + + if(!sinqHttpGetPrepare(self,request)){ + return 0; + } + /* + * try two times: a reconnect is no error + */ ghttp_prepare(self->syncRequest); httpStatus = ghttp_process(self->syncRequest); if(httpStatus != ghttp_done){ - strncpy(self->hmError,ghttp_get_error(self->syncRequest), 511); - self->errorCode = SERVERERROR; - return 0; - } else { - self->failCount = 0; - pPtr = ghttp_get_body(self->syncRequest); - len = ghttp_get_body_len(self->syncRequest); - if(len > 511){ - len = 510; - } - if(strstr(pPtr,"ERROR") != NULL){ - memset(self->hmError,0,512*sizeof(char)); - strncpy(self->hmError,pPtr, len); - self->errorCode = HTTPERROR; + ghttp_close(self->syncRequest); + sinqHttpGetPrepare(self,request); + httpStatus = ghttp_process(self->syncRequest); + } + if(httpStatus != ghttp_done){ + strncpy(self->hmError,"Reconnect", 511); + self->errorCode = SERVERERROR; return 0; - } + } else { + return sinqHttpCheckResponse(self); } return 1; } @@ -117,6 +160,23 @@ static int SinqHttpConfigure(pHistDriver self, SConnection *pCon, return 0; } + /* + * looser credentials + */ + if(StringDictGet(pOpt,"username",pPriv->userName, 131) != 1){ + SCWrite(pCon, + "ERROR: required configuration parameter username not found", + eError); + return 0; + } + if(StringDictGet(pOpt,"password",pPriv->passWord, 131) != 1){ + SCWrite(pCon, + "ERROR: required configuration parameter password not found", + eError); + return 0; + } + + /* actual configuration. Check for flag INIT in options. We do not need to configure, if the HM has configured itself already. What is does, these days. @@ -161,6 +221,9 @@ static int SinqHttpConfigure(pHistDriver self, SConnection *pCon, confData = (char *)Tcl_GetStringResult(pSics->pTcl); status = ghttp_set_body(pPriv->syncRequest,confData, strlen(confData)); + ghttp_set_authinfo(pPriv->syncRequest, pPriv->userName, + pPriv->passWord); + ghttp_set_sync(pPriv->syncRequest,ghttp_sync); status = ghttp_prepare(pPriv->syncRequest); httpStatus = ghttp_process(pPriv->syncRequest); confData = (char *)ghttp_get_body(pPriv->syncRequest); @@ -176,6 +239,11 @@ static int SinqHttpConfigure(pHistDriver self, SConnection *pCon, SCWrite(pCon,confCommand,eError); return 0; } + if(strstr(confData,"Authentication Error") != NULL){ + snprintf(confCommand,511,"%s",confData); + SCWrite(pCon,confCommand,eError); + return 0; + } } } } @@ -240,10 +308,15 @@ static int SinqHttpContinue(pHistDriver self, SConnection *pCon){ return 1; } /*--------------------------------------------------------------------*/ -static int readStatus(pSinqHttp self){ +static int readStatus(pHistDriver pDriv){ char *pPtr = NULL, *pLinePtr; char line[132]; char name[80], value[80]; + pSinqHttp self = NULL; + char *daqPtr = NULL, *daqValPtr = NULL; + + self = (pSinqHttp)pDriv->pPriv; + assert(self != NULL); pPtr = ghttp_get_body(self->syncRequest); if(pPtr == NULL){ @@ -256,10 +329,11 @@ static int readStatus(pSinqHttp self){ pLinePtr = line; pLinePtr = stptok(pLinePtr,name,80,":"); pLinePtr = stptok(pLinePtr,value,80,":"); - if(StringDictExists(self->lastStatus,trim(name)) == 1){ - StringDictUpdate(self->lastStatus,trim(name),trim(value)); + strtolower(name); + if(StringDictExists(pDriv->pOption,trim(name)) == 1){ + StringDictUpdate(pDriv->pOption,trim(name),trim(value)); } else { - StringDictAddPair(self->lastStatus,trim(name),trim(value)); + StringDictAddPair(pDriv->pOption,trim(name),trim(value)); } pPtr = stptok(pPtr,line,131,"\n"); } @@ -268,6 +342,7 @@ static int readStatus(pSinqHttp self){ /*---------------------------------------------------------------------*/ static int SinqHttpStatus(pHistDriver self,SConnection *pCon){ pSinqHttp pPriv = NULL; + ghttp_status httpStatus; char daqStatus[20]; int status, len; char *pPtr = NULL; @@ -279,17 +354,48 @@ static int SinqHttpStatus(pHistDriver self,SConnection *pCon){ return HWPause; } - status = sinqHttpGet(pPriv,statusdaq); - if(status != 1){ - return HWFault; + if(pPriv->asyncRunning == 0){ + status = sinqHttpGetPrepare(pPriv,statusdaq); + ghttp_set_sync(pPriv->syncRequest,ghttp_async); + ghttp_prepare(pPriv->syncRequest); + if(status != 1){ + return HWFault; + } + pPriv->asyncRunning = 1; + } + httpStatus = ghttp_process(pPriv->syncRequest); + switch(httpStatus){ + case ghttp_error: + ghttp_close(pPriv->syncRequest); + sinqHttpGetPrepare(pPriv,statusdaq); + ghttp_prepare(pPriv->syncRequest); + httpStatus = ghttp_process(pPriv->syncRequest); + if(httpStatus != ghttp_done){ + strncpy(pPriv->hmError,"Reconnect", 511); + pPriv->errorCode = SERVERERROR; + return HWFault; + pPriv->asyncRunning = 0; + } + break; + case ghttp_not_done: + return HWBusy; + break; + case ghttp_done: + pPriv->asyncRunning = 0; + status = sinqHttpCheckResponse(pPriv); + if(status != 1){ + return HWFault; + } + break; } - status = readStatus(pPriv); + + status = readStatus(self); if(status != 1){ return HWFault; } - if(StringDictGet(pPriv->lastStatus,"DAQ",daqStatus,20) != 1){ + if(StringDictGet(self->pOption,"daq",daqStatus,20) != 1){ pPriv->errorCode = BADSTATUS; strncpy(pPriv->hmError,"ERROR: status does not contain DAQ field",511); return HWFault; @@ -403,6 +509,18 @@ static float SinqHttpGetTime(pHistDriver self, SConnection *pCon){ } /*---------------------------------------------------------------------*/ static int SinqHttpPreset(pHistDriver self, SConnection *pCon, int val){ + pSinqHttp pPriv = NULL; + int status; + char command[512]; + + pPriv = (pSinqHttp)self->pPriv; + assert(pPriv != NULL); + + snprintf(command,512,"%s?value=%d",preset,val); + status = sinqHttpGet(pPriv,command); + if(status != 1){ + return HWFault; + } return 1; } /*---------------------------------------------------------------------*/ @@ -414,9 +532,6 @@ static int SinqHttpFreePrivate(pHistDriver self){ return 1; } - if(pPriv->lastStatus != NULL){ - DeleteStringDict(pPriv->lastStatus); - } if(pPriv->syncRequest != NULL){ ghttp_request_destroy(pPriv->syncRequest); } @@ -446,9 +561,8 @@ pHistDriver CreateSinqHttpDriver(pStringDict pOption){ } memset(pInternal,0,sizeof(sinqHttp)); pNew->pPriv = pInternal; - pInternal->lastStatus = CreateStringDict(); pInternal->syncRequest = ghttp_request_new(); - if(pInternal->lastStatus == NULL && pInternal->syncRequest == NULL){ + if(pInternal->syncRequest == NULL){ free(pNew); free(pInternal); return NULL;