From a66d739f240afce52a95aa92241af4fd6dff3538 Mon Sep 17 00:00:00 2001 From: Francesco Saverio Giudice Date: Fri, 31 Jul 2009 08:20:13 +0000 Subject: [PATCH] 2009-07-31 10:16 UTC+0200 Francesco Saverio Giudice (info/at/fsgiudice.com) * harbour/Changelog * fixed wrong month in previous updates * harbour/examples/httpsrv/uhttpd.prg * Fixed readRequest() and Handler_HrbScript() functions as per Przemek suggestions. Thank you. --- harbour/ChangeLog | 11 +++- harbour/examples/httpsrv/uhttpd.prg | 83 +++++++++++++++-------------- 2 files changed, 52 insertions(+), 42 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 447b143879..9844b2e509 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -17,11 +17,18 @@ past entries belonging to author(s): Viktor Szakats. */ -2009-04-30 18:56 UTC+0200 Francesco Saverio Giudice (info/at/fsgiudice.com) +2009-07-31 10:16 UTC+0200 Francesco Saverio Giudice (info/at/fsgiudice.com) + * harbour/Changelog + * fixed wrong month in previous updates + * harbour/examples/httpsrv/uhttpd.prg + * Fixed readRequest() and Handler_HrbScript() functions as per + Przemek suggestions. Thank you. + +2009-07-30 18:56 UTC+0200 Francesco Saverio Giudice (info/at/fsgiudice.com) * harbour/Changelog * minor fix to previous entry -2009-04-30 18:49 UTC+0200 Francesco Saverio Giudice (info/at/fsgiudice.com) +2009-07-30 18:49 UTC+0200 Francesco Saverio Giudice (info/at/fsgiudice.com) * harbour/examples/httpsrv/uhttpd.prg * Added some hb_ToOutDebug() points garded from DEBUG_ACTIVE define for debugging purpose diff --git a/harbour/examples/httpsrv/uhttpd.prg b/harbour/examples/httpsrv/uhttpd.prg index b6af43a20d..e1b5b6e2f6 100644 --- a/harbour/examples/httpsrv/uhttpd.prg +++ b/harbour/examples/httpsrv/uhttpd.prg @@ -1797,57 +1797,60 @@ PROCEDURE uhttpd_Write( cString ) ********************************************************************/ STATIC FUNCTION readRequest( hSocket, /* @ */ cRequest ) - LOCAL nLen, cBuf -#ifdef USE_HB_INET - LOCAL nRcvLen, nContLen -#endif + LOCAL cBuf, nLen, nPos /* receive query */ #ifdef USE_HB_INET - cRequest := "" - nLen := 0 - nRcvLen := 1 - nContLen := 0 - DO WHILE /* AT( CR_LF + CR_LF, cRequest ) == 0 .AND. */ nRcvLen > 0 - cBuf := hb_InetRecvLine( hSocket, @nRcvLen ) -#ifdef DEBUG_ACTIVE - hb_ToOutDebug( "readRequest(): nRcvLen = %i, cBuf = %s \n\r", nRcvLen, cBuf ) -#endif - IF nRcvLen > 0 - cRequest += cBuf + CR_LF - nLen += nRcvLen - IF At( "CONTENT-LENGTH:", Upper( cBuf ) ) == 1 - cBuf := Substr( cBuf, At( ":", cBuf ) + 1 ) - nContLen := Val( cBuf ) - ENDIF - ENDIF - ENDDO - -#ifdef DEBUG_ACTIVE - hb_ToOutDebug( "readRequest(): nLen = %i, nContLen = %i \n\r", nLen, nContLen ) -#endif - // if the request has a content-lenght, we must read it - IF nLen > 0 .AND. nContLen > 0 - // cPostData is autoAllocated - cBuf := Space( nContLen ) - IF hb_InetRecvAll( hSocket, @cBuf, nContLen ) <= 0 - nLen := -1 // force error check - ELSE - cRequest += cBuf - ENDIF + cRequest := hb_InetRecvEndBlock( hSocket, CR_LF + CR_LF, @nLen ) + IF nLen > 0 + cRequest += CR_LF + CR_LF ENDIF #else cRequest := "" - nLen := 1 - DO WHILE AT( CR_LF + CR_LF, cRequest ) == 0 .AND. nLen > 0 + DO WHILE .T. nLen := socket_recv( hSocket, @cBuf ) -#ifdef DEBUG_ACTIVE - hb_ToOutDebug( "readRequest(): nLen = %i, cBuf = %s \n\r", nLen, cBuf ) -#endif + IF nLen <= 0 + EXIT + ENDIF cRequest += cBuf + IF CR_LF + CR_LF $ cRequest + EXIT + ENDIF ENDDO #endif + /* receive CONTENT-LENGTH data */ + IF nLen > 0 + nPos := HB_ATI( CR_LF + "CONTENT-LENGTH:", cRequest ) + IF nPos > 0 + nPos := Val( Substr( cRequest, nPos + 17, 10 ) ) + IF nPos > 0 +#ifdef USE_HB_INET + cBuf := Space( nPos ) + nLen := hb_InetRecvAll( hSocket, @cBuf, nPos ) + IF nLen < 0 + nLen := -1 + ELSE + cRequest += Left( cBuf, nLen ) + ENDIF +#else + /* we have to decrease number of bytes to read by already read + * data after CR_LF + CR_LF + */ + nPos -= Len( cRequest ) - At( CR_LF + CR_LF, cRequest ) - 3 + WHILE nPos > 0 + nLen := socket_recv( hSocket, @cBuf, nPos ) + IF nLen <= 0 + EXIT + ENDIF + cRequest += cBuf + nPos -= nLen + ENDDO +#endif + ENDIF + ENDIF + ENDIF + #ifdef DEBUG_ACTIVE hb_ToOutDebug( "readRequest(): nLen = %i, cRequest = %s \n\r", nLen, cRequest ) #endif