static BaseType_t prvOpenUrl( xHTTPClient *pxClient ) { BaseType_t xRc; char pcSlash[ 2 ]; pxClient->bits.ulFlags = 0; if( pxClient->pcUrlData[ 0 ] != '/' ) { /* Insert a slah before the file name */ pcSlash[ 0 ] = '/'; pcSlash[ 1 ] = '\0'; } else { /* The browser provided a starting '/' already */ pcSlash[ 0 ] = '\0'; } snprintf( pxClient->pcCurrentFilename, sizeof pxClient->pcCurrentFilename, "%s%s%s", pxClient->pcRootDir, pcSlash, pxClient->pcUrlData); pxClient->pxFileHandle = ff_fopen( pxClient->pcCurrentFilename, "rb" ); FreeRTOS_printf( ( "Open file '%s': %s\n", pxClient->pcCurrentFilename, pxClient->pxFileHandle != NULL ? "Ok" : strerror( stdioGET_ERRNO() ) ) ); if( pxClient->pxFileHandle == NULL ) { xRc = prvSendReply( pxClient, WEB_NOT_FOUND ); /* "404 File not found" */ } else { pxClient->xBytesLeft = pxClient->pxFileHandle->ulFileSize; xRc = prvSendFile( pxClient ); } return xRc; }
static BaseType_t prvSendFile( xHTTPClient *pxClient ) { size_t xSpace; size_t xCount; BaseType_t xRc = 0; if( pxClient->bits.bReplySent == pdFALSE ) { pxClient->bits.bReplySent = pdTRUE; strcpy( pxClient->pxParent->pcContentsType, pcGetContentsType( pxClient->pcCurrentFilename ) ); snprintf( pxClient->pxParent->pcExtraContents, sizeof pxClient->pxParent->pcExtraContents, "Content-Length: %d\r\n", ( int ) pxClient->xBytesLeft); xRc = prvSendReply( pxClient, WEB_REPLY_OK ); /* "Requested file action OK" */ } if( xRc >= 0 ) do { xSpace = FreeRTOS_tx_space( pxClient->xSocket ); if( pxClient->xBytesLeft < xSpace ) { xCount = pxClient->xBytesLeft; } else { xCount = xSpace; } if( xCount > 0 ) { if( xCount > sizeof( pxClient->pxParent->pcFileBuffer ) ) { xCount = sizeof( pxClient->pxParent->pcFileBuffer ); } ff_fread( pxClient->pxParent->pcFileBuffer, 1, xCount, pxClient->pxFileHandle ); pxClient->xBytesLeft -= xCount; xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pxParent->pcFileBuffer, xCount, 0 ); if( xRc < 0 ) { break; } } } while( xCount > 0 ); if( pxClient->xBytesLeft <= 0 ) { /* Writing is ready, no need for further 'eSELECT_WRITE' events. */ FreeRTOS_FD_CLR( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE ); prvFileClose( pxClient ); } else { /* Wake up the TCP task as soon as this socket may be written to. */ FreeRTOS_FD_SET( pxClient->xSocket, pxClient->pxParent->xSocketSet, eSELECT_WRITE ); } return xRc; }
static BaseType_t prvOpenURL( HTTPClient_t *pxClient ) { BaseType_t xRc; char pcSlash[ 2 ]; pxClient->bits.ulFlags = 0; #if( ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK != 0 ) { if( strchr( pxClient->pcUrlData, ipconfigHTTP_REQUEST_CHARACTER ) != NULL ) { size_t xResult; xResult = uxApplicationHTTPHandleRequestHook( pxClient->pcUrlData, pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ) ); if( xResult > 0 ) { strcpy( pxClient->pxParent->pcContentsType, "text/html" ); snprintf( pxClient->pxParent->pcExtraContents, sizeof( pxClient->pxParent->pcExtraContents ), "Content-Length: %d\r\n", ( int ) xResult ); xRc = prvSendReply( pxClient, WEB_REPLY_OK ); /* "Requested file action OK" */ if( xRc > 0 ) { xRc = FreeRTOS_send( pxClient->xSocket, pxClient->pcCurrentFilename, xResult, 0 ); } /* Although against the coding standard of FreeRTOS, a return is done here to simplify this conditional code. */ return xRc; } } } #endif /* ipconfigHTTP_HAS_HANDLE_REQUEST_HOOK */ if( pxClient->pcUrlData[ 0 ] != '/' ) { /* Insert a slash before the file name. */ pcSlash[ 0 ] = '/'; pcSlash[ 1 ] = '\0'; } else { /* The browser provided a starting '/' already. */ pcSlash[ 0 ] = '\0'; } snprintf( pxClient->pcCurrentFilename, sizeof( pxClient->pcCurrentFilename ), "%s%s%s", pxClient->pcRootDir, pcSlash, pxClient->pcUrlData); pxClient->pxFileHandle = ff_fopen( pxClient->pcCurrentFilename, "rb" ); FreeRTOS_printf( ( "Open file '%s': %s\n", pxClient->pcCurrentFilename, pxClient->pxFileHandle != NULL ? "Ok" : strerror( stdioGET_ERRNO() ) ) ); if( pxClient->pxFileHandle == NULL ) { /* "404 File not found". */ xRc = prvSendReply( pxClient, WEB_NOT_FOUND ); } else { pxClient->uxBytesLeft = ( size_t ) pxClient->pxFileHandle->ulFileSize; xRc = prvSendFile( pxClient ); } return xRc; }