TI's CC3100 websocket camera demo with Arducam mini ov5642 and freertos. Should work with other M3's. Work in progress test demo.
http/server/HttpStatic.cpp@1:e448e81c416f, 2015-09-11 (annotated)
- Committer:
- dflet
- Date:
- Fri Sep 11 15:38:33 2015 +0000
- Revision:
- 1:e448e81c416f
- Parent:
- 0:400d8e75a8d0
Removed some debud.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dflet | 0:400d8e75a8d0 | 1 | //***************************************************************************** |
dflet | 0:400d8e75a8d0 | 2 | // Copyright (C) 2014 Texas Instruments Incorporated |
dflet | 0:400d8e75a8d0 | 3 | // |
dflet | 0:400d8e75a8d0 | 4 | // All rights reserved. Property of Texas Instruments Incorporated. |
dflet | 0:400d8e75a8d0 | 5 | // Restricted rights to use, duplicate or disclose this code are |
dflet | 0:400d8e75a8d0 | 6 | // granted through contract. |
dflet | 0:400d8e75a8d0 | 7 | // The program may not be used without the written permission of |
dflet | 0:400d8e75a8d0 | 8 | // Texas Instruments Incorporated or against the terms and conditions |
dflet | 0:400d8e75a8d0 | 9 | // stipulated in the agreement under which this program has been supplied, |
dflet | 0:400d8e75a8d0 | 10 | // and under no circumstances can it be used with non-TI connectivity device. |
dflet | 0:400d8e75a8d0 | 11 | // |
dflet | 0:400d8e75a8d0 | 12 | //***************************************************************************** |
dflet | 0:400d8e75a8d0 | 13 | |
dflet | 0:400d8e75a8d0 | 14 | #include "HttpStatic.h" |
dflet | 0:400d8e75a8d0 | 15 | #include <stdlib.h> |
dflet | 0:400d8e75a8d0 | 16 | |
dflet | 0:400d8e75a8d0 | 17 | #ifdef HTTP_CORE_ENABLE_STATIC |
dflet | 0:400d8e75a8d0 | 18 | |
dflet | 0:400d8e75a8d0 | 19 | #include "HttpRequest.h" |
dflet | 0:400d8e75a8d0 | 20 | #include "HttpResponse.h" |
dflet | 0:400d8e75a8d0 | 21 | #include "HttpCore.h" |
dflet | 0:400d8e75a8d0 | 22 | #include "cc3100.h" |
dflet | 0:400d8e75a8d0 | 23 | #include "cc3100_fs.h" |
dflet | 0:400d8e75a8d0 | 24 | #include "HttpDebug.h" |
dflet | 0:400d8e75a8d0 | 25 | #include "myBoardInit.h" |
dflet | 0:400d8e75a8d0 | 26 | #include "osi.h" |
dflet | 0:400d8e75a8d0 | 27 | |
dflet | 0:400d8e75a8d0 | 28 | using namespace mbed_cc3100; |
dflet | 0:400d8e75a8d0 | 29 | |
dflet | 0:400d8e75a8d0 | 30 | cc3100 _cc3100Module(NC, NC, p9, p10, p8, SPI(p5, p6, p7));//LPC1768 irq, nHib, cs, mosi, miso, sck |
dflet | 0:400d8e75a8d0 | 31 | |
dflet | 0:400d8e75a8d0 | 32 | |
dflet | 0:400d8e75a8d0 | 33 | /** |
dflet | 0:400d8e75a8d0 | 34 | * @addtogroup HttpStatic |
dflet | 0:400d8e75a8d0 | 35 | * @{ |
dflet | 0:400d8e75a8d0 | 36 | */ |
dflet | 0:400d8e75a8d0 | 37 | |
dflet | 0:400d8e75a8d0 | 38 | /** |
dflet | 0:400d8e75a8d0 | 39 | * @defgroup HttpStatic Static request handler module |
dflet | 0:400d8e75a8d0 | 40 | * This module implements static content processing for HTTP requests. |
dflet | 0:400d8e75a8d0 | 41 | * All requests are handled by looking up the URL's resource in the flash database, and returning the content in the response. |
dflet | 0:400d8e75a8d0 | 42 | * Note this module is only compiled if HTTP_CORE_ENABLE_STATIC is defined in HttpConfig.h |
dflet | 0:400d8e75a8d0 | 43 | * |
dflet | 0:400d8e75a8d0 | 44 | * @{ |
dflet | 0:400d8e75a8d0 | 45 | */ |
dflet | 0:400d8e75a8d0 | 46 | |
dflet | 0:400d8e75a8d0 | 47 | #define FILE_NAME_SIZE_MAX (40) |
dflet | 0:400d8e75a8d0 | 48 | |
dflet | 0:400d8e75a8d0 | 49 | //Store File Name from HTTP Header |
dflet | 0:400d8e75a8d0 | 50 | char g_cFileName[FILE_NAME_SIZE_MAX]; //String storing filename |
dflet | 0:400d8e75a8d0 | 51 | int32_t glFileHandle; // file handle |
dflet | 0:400d8e75a8d0 | 52 | |
dflet | 0:400d8e75a8d0 | 53 | /** |
dflet | 0:400d8e75a8d0 | 54 | * Initialize HttpStatic module state for a new request, and identify the request |
dflet | 0:400d8e75a8d0 | 55 | * This function examines the specified resource string, and looks it up in the Flash Database. |
dflet | 0:400d8e75a8d0 | 56 | * If found, it commits to process this request by returning nonzero. Otherwise it returns zero. |
dflet | 0:400d8e75a8d0 | 57 | * @param uConnection The number of the connection. This value is guaranteed to satisfy: 0 <= uConnection < HTTP_CORE_MAX_CONNECTIONS |
dflet | 0:400d8e75a8d0 | 58 | * @param resource The resource part of the URL, as specified by the browser in the request, including any query string (and hash). |
dflet | 0:400d8e75a8d0 | 59 | * Note: The resource string exists ONLY during the call to this function. The string pointer should not be copied by this function. |
dflet | 0:400d8e75a8d0 | 60 | * @return nonzero if request is to be handled by this module. zero if not. |
dflet | 0:400d8e75a8d0 | 61 | */ |
dflet | 0:400d8e75a8d0 | 62 | int HttpStatic_InitRequest(UINT16 uConnection, struct HttpBlob resource) |
dflet | 0:400d8e75a8d0 | 63 | { |
dflet | 0:400d8e75a8d0 | 64 | char *pcWWWFsDir = "www"; |
dflet | 0:400d8e75a8d0 | 65 | memset(g_cFileName,'\0',40); |
dflet | 0:400d8e75a8d0 | 66 | |
dflet | 0:400d8e75a8d0 | 67 | if(resource.uLength ==1 && *(resource.pData)=='/') |
dflet | 0:400d8e75a8d0 | 68 | { |
dflet | 0:400d8e75a8d0 | 69 | strcpy(g_cFileName,"www/main.html"); |
dflet | 0:400d8e75a8d0 | 70 | } |
dflet | 0:400d8e75a8d0 | 71 | else |
dflet | 0:400d8e75a8d0 | 72 | { |
dflet | 0:400d8e75a8d0 | 73 | strcpy(g_cFileName,pcWWWFsDir); |
dflet | 0:400d8e75a8d0 | 74 | strncat(g_cFileName,(char*)resource.pData,resource.uLength); |
dflet | 0:400d8e75a8d0 | 75 | } |
dflet | 0:400d8e75a8d0 | 76 | |
dflet | 0:400d8e75a8d0 | 77 | if(_cc3100Module._fs.sl_FsOpen((unsigned char*)g_cFileName,FS_MODE_OPEN_READ,NULL,&glFileHandle)<0) |
dflet | 0:400d8e75a8d0 | 78 | return 0; |
dflet | 0:400d8e75a8d0 | 79 | else |
dflet | 0:400d8e75a8d0 | 80 | { |
dflet | 0:400d8e75a8d0 | 81 | return 1; |
dflet | 0:400d8e75a8d0 | 82 | } |
dflet | 0:400d8e75a8d0 | 83 | } |
dflet | 0:400d8e75a8d0 | 84 | |
dflet | 0:400d8e75a8d0 | 85 | /** |
dflet | 0:400d8e75a8d0 | 86 | * Process a static-content HTTP request |
dflet | 0:400d8e75a8d0 | 87 | * This function is called after a request was already initialized, and a Flash content entry was identified during a call to HttpStatic_InitRequest() |
dflet | 0:400d8e75a8d0 | 88 | * This function calls HttpResponse_*() to send the content data to the browser. |
dflet | 0:400d8e75a8d0 | 89 | * @param request Pointer to all data available about the request |
dflet | 0:400d8e75a8d0 | 90 | * @return nonzero if request was handled. zero if not. |
dflet | 0:400d8e75a8d0 | 91 | */ |
dflet | 0:400d8e75a8d0 | 92 | int HttpStatic_ProcessRequest(struct HttpRequest* request) |
dflet | 0:400d8e75a8d0 | 93 | { |
dflet | 0:400d8e75a8d0 | 94 | struct HttpBlob location,contentType; |
dflet | 0:400d8e75a8d0 | 95 | struct HttpBlob* content = (struct HttpBlob*)malloc(sizeof(struct HttpBlob)); |
dflet | 0:400d8e75a8d0 | 96 | unsigned int Offset = 0; |
dflet | 0:400d8e75a8d0 | 97 | SlFsFileInfo_t pFsFileInfo; |
dflet | 0:400d8e75a8d0 | 98 | UINT32 TotalLength; |
dflet | 0:400d8e75a8d0 | 99 | UINT8 HeaderFlag =0; |
dflet | 0:400d8e75a8d0 | 100 | UINT8 bRetVal = 1; |
dflet | 0:400d8e75a8d0 | 101 | UINT8 *buffer1 = NULL; |
dflet | 0:400d8e75a8d0 | 102 | |
dflet | 0:400d8e75a8d0 | 103 | |
dflet | 0:400d8e75a8d0 | 104 | if(content == NULL) |
dflet | 0:400d8e75a8d0 | 105 | { |
dflet | 0:400d8e75a8d0 | 106 | HttpDebug("content = NULL error\n\r"); |
dflet | 0:400d8e75a8d0 | 107 | return 0; |
dflet | 0:400d8e75a8d0 | 108 | } |
dflet | 0:400d8e75a8d0 | 109 | location.pData = NULL; |
dflet | 0:400d8e75a8d0 | 110 | location.uLength = 0; |
dflet | 0:400d8e75a8d0 | 111 | contentType = location; |
dflet | 0:400d8e75a8d0 | 112 | |
dflet | 0:400d8e75a8d0 | 113 | /* if HTTP_REQUEST_FLAG_METHOD_POST==1 (i.e. it is POST) |
dflet | 0:400d8e75a8d0 | 114 | HttpResponse_CannedError() responds to client with status HTTP_STATUS_ERROR_INTERNAL |
dflet | 0:400d8e75a8d0 | 115 | POST method is not supported for static pages */ |
dflet | 0:400d8e75a8d0 | 116 | if (request->uFlags & HTTP_REQUEST_FLAG_METHOD_POST) |
dflet | 0:400d8e75a8d0 | 117 | { |
dflet | 0:400d8e75a8d0 | 118 | /* HttpResponse_CannedError responds to client with 500 ERROR_INTERNAL */ |
dflet | 0:400d8e75a8d0 | 119 | if(!HttpResponse_CannedError(request->uConnection, HTTP_STATUS_ERROR_INTERNAL)) |
dflet | 0:400d8e75a8d0 | 120 | { |
dflet | 0:400d8e75a8d0 | 121 | HttpDebug("HttpResponse_CannedError \n\r"); |
dflet | 0:400d8e75a8d0 | 122 | bRetVal = 0; |
dflet | 0:400d8e75a8d0 | 123 | goto end; |
dflet | 0:400d8e75a8d0 | 124 | } |
dflet | 0:400d8e75a8d0 | 125 | else |
dflet | 0:400d8e75a8d0 | 126 | { |
dflet | 0:400d8e75a8d0 | 127 | bRetVal = 1; |
dflet | 0:400d8e75a8d0 | 128 | goto end; |
dflet | 0:400d8e75a8d0 | 129 | } |
dflet | 0:400d8e75a8d0 | 130 | } |
dflet | 0:400d8e75a8d0 | 131 | |
dflet | 0:400d8e75a8d0 | 132 | _cc3100Module._fs.sl_FsGetInfo((unsigned char *)g_cFileName, NULL, &pFsFileInfo); |
dflet | 0:400d8e75a8d0 | 133 | TotalLength = (&pFsFileInfo)->FileLen; |
dflet | 0:400d8e75a8d0 | 134 | |
dflet | 0:400d8e75a8d0 | 135 | while(TotalLength > 0) |
dflet | 0:400d8e75a8d0 | 136 | { |
dflet | 0:400d8e75a8d0 | 137 | |
dflet | 0:400d8e75a8d0 | 138 | // HttpDebug("TotalLength = %d\n\r",TotalLength); |
dflet | 0:400d8e75a8d0 | 139 | content->uLength = ((TotalLength < 1000) ? (TotalLength):(1000)); |
dflet | 0:400d8e75a8d0 | 140 | buffer1 = (uint8_t*)realloc(buffer1, content->uLength); |
dflet | 0:400d8e75a8d0 | 141 | if(buffer1 == NULL) |
dflet | 0:400d8e75a8d0 | 142 | { |
dflet | 0:400d8e75a8d0 | 143 | HttpDebug("buffer1 = NULL Error \n\r"); |
dflet | 0:400d8e75a8d0 | 144 | bRetVal = 0; |
dflet | 0:400d8e75a8d0 | 145 | goto end; |
dflet | 0:400d8e75a8d0 | 146 | } |
dflet | 0:400d8e75a8d0 | 147 | content->pData = buffer1; |
dflet | 0:400d8e75a8d0 | 148 | |
dflet | 0:400d8e75a8d0 | 149 | /* if got here than it is a GET method |
dflet | 0:400d8e75a8d0 | 150 | HttpResponse_Headers() responds to client with status HTTP_STATUS_OK */ |
dflet | 0:400d8e75a8d0 | 151 | if(_cc3100Module._fs.sl_FsRead(glFileHandle, Offset, (unsigned char *) content->pData, content->uLength) < 0) |
dflet | 0:400d8e75a8d0 | 152 | { |
dflet | 0:400d8e75a8d0 | 153 | /* call HttpResponse_CannedError responds to client with 500 ERROR_INTERNAL */ |
dflet | 0:400d8e75a8d0 | 154 | if(!HttpResponse_CannedError(request->uConnection, HTTP_STATUS_ERROR_NOT_ACCEPTED)) |
dflet | 0:400d8e75a8d0 | 155 | { |
dflet | 0:400d8e75a8d0 | 156 | HttpDebug("500 ERROR_INTERNAL Error \n\r"); |
dflet | 0:400d8e75a8d0 | 157 | bRetVal = 0; |
dflet | 0:400d8e75a8d0 | 158 | goto end; |
dflet | 0:400d8e75a8d0 | 159 | } |
dflet | 0:400d8e75a8d0 | 160 | else |
dflet | 0:400d8e75a8d0 | 161 | { |
dflet | 0:400d8e75a8d0 | 162 | bRetVal = 1; |
dflet | 0:400d8e75a8d0 | 163 | goto end; |
dflet | 0:400d8e75a8d0 | 164 | } |
dflet | 0:400d8e75a8d0 | 165 | } |
dflet | 0:400d8e75a8d0 | 166 | else |
dflet | 0:400d8e75a8d0 | 167 | { |
dflet | 0:400d8e75a8d0 | 168 | if(!HeaderFlag) |
dflet | 0:400d8e75a8d0 | 169 | { |
dflet | 0:400d8e75a8d0 | 170 | if(!HttpResponse_Headers(request->uConnection, (uint16_t)HTTP_STATUS_OK, NULL,TotalLength, contentType, location)) |
dflet | 0:400d8e75a8d0 | 171 | { |
dflet | 0:400d8e75a8d0 | 172 | HttpDebug("HeaderFlag Error \n\r"); |
dflet | 0:400d8e75a8d0 | 173 | bRetVal = 0; |
dflet | 0:400d8e75a8d0 | 174 | goto end; |
dflet | 0:400d8e75a8d0 | 175 | } |
dflet | 0:400d8e75a8d0 | 176 | HeaderFlag = 1; |
dflet | 0:400d8e75a8d0 | 177 | } |
dflet | 0:400d8e75a8d0 | 178 | |
dflet | 0:400d8e75a8d0 | 179 | /* HttpResponse_Content() sends requested page to the client */ |
dflet | 0:400d8e75a8d0 | 180 | if(!HttpResponse_Content(request->uConnection, *content)) |
dflet | 0:400d8e75a8d0 | 181 | { |
dflet | 0:400d8e75a8d0 | 182 | HttpDebug("HttpResponse_Content Error \n\r"); |
dflet | 0:400d8e75a8d0 | 183 | bRetVal = 0; |
dflet | 0:400d8e75a8d0 | 184 | goto end; |
dflet | 0:400d8e75a8d0 | 185 | } |
dflet | 0:400d8e75a8d0 | 186 | } |
dflet | 0:400d8e75a8d0 | 187 | |
dflet | 0:400d8e75a8d0 | 188 | TotalLength -= content->uLength; |
dflet | 0:400d8e75a8d0 | 189 | Offset += content->uLength; |
dflet | 0:400d8e75a8d0 | 190 | } |
dflet | 0:400d8e75a8d0 | 191 | |
dflet | 0:400d8e75a8d0 | 192 | _cc3100Module._fs.sl_FsClose(glFileHandle,0,0,0); |
dflet | 0:400d8e75a8d0 | 193 | end: |
dflet | 0:400d8e75a8d0 | 194 | if(buffer1 != NULL) |
dflet | 0:400d8e75a8d0 | 195 | { |
dflet | 0:400d8e75a8d0 | 196 | free(buffer1); |
dflet | 0:400d8e75a8d0 | 197 | } |
dflet | 0:400d8e75a8d0 | 198 | free(content); |
dflet | 0:400d8e75a8d0 | 199 | |
dflet | 0:400d8e75a8d0 | 200 | return bRetVal; |
dflet | 0:400d8e75a8d0 | 201 | } |
dflet | 0:400d8e75a8d0 | 202 | |
dflet | 0:400d8e75a8d0 | 203 | /// @} |
dflet | 0:400d8e75a8d0 | 204 | |
dflet | 0:400d8e75a8d0 | 205 | #endif // HTTP_CORE_ENABLE_STATIC |
dflet | 0:400d8e75a8d0 | 206 | |
dflet | 0:400d8e75a8d0 | 207 | |
dflet | 0:400d8e75a8d0 | 208 |