HttpServer Library for "mbed-os" which added a snapshot handler.

Dependents:   GR-PEACH-webcam GR-Boards_WebCamera GR-Boards_WebCamera GR-Boards_WebCamera

Fork of HttpServer_snapshot by Renesas

Committer:
dkato
Date:
Wed Jun 07 05:53:36 2017 +0000
Revision:
13:d3571c244759
Parent:
12:95cc47e42b79
Child:
14:d3dc6ad09790
SnapshotHandler can register multiple paths.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 6:d9e6379eefac 1 /*******************************************************************************
dkato 6:d9e6379eefac 2 * DISCLAIMER
dkato 6:d9e6379eefac 3 * This software is supplied by Renesas Electronics Corporation and is only
dkato 6:d9e6379eefac 4 * intended for use with Renesas products. No other uses are authorized. This
dkato 6:d9e6379eefac 5 * software is owned by Renesas Electronics Corporation and is protected under
dkato 6:d9e6379eefac 6 * all applicable laws, including copyright laws.
dkato 6:d9e6379eefac 7 * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING
dkato 6:d9e6379eefac 8 * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT
dkato 6:d9e6379eefac 9 * LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
dkato 6:d9e6379eefac 10 * AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED.
dkato 6:d9e6379eefac 11 * TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS
dkato 6:d9e6379eefac 12 * ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE
dkato 6:d9e6379eefac 13 * FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR
dkato 6:d9e6379eefac 14 * ANY REASON RELATED TO THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE
dkato 6:d9e6379eefac 15 * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
dkato 6:d9e6379eefac 16 * Renesas reserves the right, without notice, to make changes to this software
dkato 6:d9e6379eefac 17 * and to discontinue the availability of this software. By using this software,
dkato 6:d9e6379eefac 18 * you agree to the additional terms and conditions found by accessing the
dkato 6:d9e6379eefac 19 * following link:
dkato 6:d9e6379eefac 20 * http://www.renesas.com/disclaimer*
dkato 6:d9e6379eefac 21 * Copyright (C) 2015 Renesas Electronics Corporation. All rights reserved.
dkato 6:d9e6379eefac 22 *******************************************************************************/
dkato 6:d9e6379eefac 23
dkato 6:d9e6379eefac 24 #include "SnapshotHandler.h"
dkato 6:d9e6379eefac 25
dkato 6:d9e6379eefac 26 int (*SnapshotHandler::callback_func_req)(const char ** pp_data);
dkato 13:d3571c244759 27 int (*SnapshotHandler::callback_func_req2)(const char* rootPath, const char ** pp_data);
dkato 6:d9e6379eefac 28 Semaphore SnapshotHandler::req_sem(1);
dkato 6:d9e6379eefac 29
dkato 6:d9e6379eefac 30
dkato 11:0700755d64ae 31 SnapshotHandler::SnapshotHandler(const char* rootPath, const char* path, TCPSocket* pTCPSocket) : HTTPRequestHandler(rootPath, path, pTCPSocket), m_err404(false)
dkato 6:d9e6379eefac 32 {
dkato 6:d9e6379eefac 33 }
dkato 6:d9e6379eefac 34
dkato 6:d9e6379eefac 35 SnapshotHandler::~SnapshotHandler()
dkato 6:d9e6379eefac 36 {
dkato 6:d9e6379eefac 37 }
dkato 6:d9e6379eefac 38
dkato 6:d9e6379eefac 39 void SnapshotHandler::doGet()
dkato 6:d9e6379eefac 40 {
dkato 6:d9e6379eefac 41 const char * p_data = NULL;
dkato 6:d9e6379eefac 42 int size = 0;
dkato 6:d9e6379eefac 43
dkato 6:d9e6379eefac 44 req_sem.wait();
dkato 6:d9e6379eefac 45 if (callback_func_req != NULL) {
dkato 6:d9e6379eefac 46 size = callback_func_req(&p_data);
dkato 6:d9e6379eefac 47 }
dkato 13:d3571c244759 48 if (callback_func_req2 != NULL) {
dkato 13:d3571c244759 49 size = callback_func_req2((rootPath()).c_str(), &p_data);
dkato 13:d3571c244759 50 }
dkato 6:d9e6379eefac 51
dkato 6:d9e6379eefac 52 if ((p_data == NULL) || (size <= 0)) {
dkato 6:d9e6379eefac 53 m_err404 = true;
dkato 6:d9e6379eefac 54 setErrCode(404);
dkato 6:d9e6379eefac 55 const char* msg = "File not found.";
dkato 6:d9e6379eefac 56 setContentLen(strlen(msg));
dkato 6:d9e6379eefac 57 respHeaders()["Content-Type"] = "text/html";
dkato 6:d9e6379eefac 58 respHeaders()["Connection"] = "close";
dkato 6:d9e6379eefac 59 writeData(msg,strlen(msg)); //Only send header
dkato 6:d9e6379eefac 60 printf("\r\nExit SnapshotHandler::doGet() w Error 404\r\n");
dkato 6:d9e6379eefac 61 req_sem.release();
dkato 6:d9e6379eefac 62 return;
dkato 6:d9e6379eefac 63 }
dkato 6:d9e6379eefac 64 send_data_buf = p_data;
dkato 6:d9e6379eefac 65 send_size = size;
dkato 6:d9e6379eefac 66 send_index = 0;
dkato 6:d9e6379eefac 67
dkato 6:d9e6379eefac 68 //Response
dkato 6:d9e6379eefac 69 setContentLen(send_size);
dkato 6:d9e6379eefac 70
dkato 6:d9e6379eefac 71 //Make sure that the browser won't cache this request
dkato 6:d9e6379eefac 72 respHeaders()["Cache-Control"] = "no-store";
dkato 6:d9e6379eefac 73 respHeaders()["Pragma"] = "no-cache";
dkato 6:d9e6379eefac 74 respHeaders()["Expires"] = "0";
dkato 6:d9e6379eefac 75
dkato 6:d9e6379eefac 76 //Write data
dkato 6:d9e6379eefac 77 respHeaders()["Connection"] = "close";
dkato 6:d9e6379eefac 78 onWriteable();
dkato 6:d9e6379eefac 79
dkato 6:d9e6379eefac 80 req_sem.release();
dkato 6:d9e6379eefac 81 }
dkato 6:d9e6379eefac 82
dkato 6:d9e6379eefac 83 void SnapshotHandler::doPost()
dkato 6:d9e6379eefac 84 {
dkato 6:d9e6379eefac 85
dkato 6:d9e6379eefac 86 }
dkato 6:d9e6379eefac 87
dkato 6:d9e6379eefac 88 void SnapshotHandler::doHead()
dkato 6:d9e6379eefac 89 {
dkato 6:d9e6379eefac 90
dkato 6:d9e6379eefac 91 }
dkato 6:d9e6379eefac 92
dkato 6:d9e6379eefac 93 void SnapshotHandler::onReadable() //Data has been read
dkato 6:d9e6379eefac 94 {
dkato 6:d9e6379eefac 95
dkato 6:d9e6379eefac 96 }
dkato 6:d9e6379eefac 97
dkato 6:d9e6379eefac 98 void SnapshotHandler::onWriteable() //Data has been written & buf is free
dkato 6:d9e6379eefac 99 {
dkato 6:d9e6379eefac 100 if (m_err404) {
dkato 6:d9e6379eefac 101 //Error has been served, now exit
dkato 6:d9e6379eefac 102 close();
dkato 6:d9e6379eefac 103 } else {
dkato 6:d9e6379eefac 104 while (true) {
dkato 6:d9e6379eefac 105 int len = send_size - send_index;
dkato 6:d9e6379eefac 106 if (len > 0) {
dkato 6:d9e6379eefac 107 int writtenLen = writeData((char *)&send_data_buf[send_index], len);
dkato 6:d9e6379eefac 108 if (writtenLen < 0) { //Socket error
dkato 6:d9e6379eefac 109 close();
dkato 6:d9e6379eefac 110 return;
dkato 6:d9e6379eefac 111 } else {
dkato 6:d9e6379eefac 112 send_index += writtenLen;
dkato 6:d9e6379eefac 113 }
dkato 6:d9e6379eefac 114 } else {
dkato 6:d9e6379eefac 115 close();
dkato 6:d9e6379eefac 116 return;
dkato 6:d9e6379eefac 117 }
dkato 6:d9e6379eefac 118 }
dkato 6:d9e6379eefac 119 }
dkato 6:d9e6379eefac 120 }
dkato 6:d9e6379eefac 121
dkato 6:d9e6379eefac 122 void SnapshotHandler::onClose() //Connection is closing
dkato 6:d9e6379eefac 123 {
dkato 6:d9e6379eefac 124 //Nothing to do
dkato 6:d9e6379eefac 125 }
dkato 11:0700755d64ae 126