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:
Fri Sep 13 02:08:33 2019 +0000
Revision:
18:673d663a1ed7
Parent:
15:371fbad587ed
Add macro HTTP_SERVER_THREAD_MAX (default 1)

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 14:d3dc6ad09790 27 int (*SnapshotHandler::callback_func_req2)(const char* rootPath, const char* path, const char ** pp_data);
dkato 15:371fbad587ed 28 void (*SnapshotHandler::callback_func_send_end)(const char* rootPath, const char* path, const char * p_data);
dkato 6:d9e6379eefac 29 Semaphore SnapshotHandler::req_sem(1);
dkato 6:d9e6379eefac 30
dkato 6:d9e6379eefac 31
dkato 11:0700755d64ae 32 SnapshotHandler::SnapshotHandler(const char* rootPath, const char* path, TCPSocket* pTCPSocket) : HTTPRequestHandler(rootPath, path, pTCPSocket), m_err404(false)
dkato 6:d9e6379eefac 33 {
dkato 6:d9e6379eefac 34 }
dkato 6:d9e6379eefac 35
dkato 6:d9e6379eefac 36 SnapshotHandler::~SnapshotHandler()
dkato 6:d9e6379eefac 37 {
dkato 6:d9e6379eefac 38 }
dkato 6:d9e6379eefac 39
dkato 6:d9e6379eefac 40 void SnapshotHandler::doGet()
dkato 6:d9e6379eefac 41 {
dkato 6:d9e6379eefac 42 const char * p_data = NULL;
dkato 6:d9e6379eefac 43 int size = 0;
dkato 6:d9e6379eefac 44
dkato 6:d9e6379eefac 45 req_sem.wait();
dkato 6:d9e6379eefac 46 if (callback_func_req != NULL) {
dkato 6:d9e6379eefac 47 size = callback_func_req(&p_data);
dkato 6:d9e6379eefac 48 }
dkato 13:d3571c244759 49 if (callback_func_req2 != NULL) {
dkato 14:d3dc6ad09790 50 size = callback_func_req2((rootPath()).c_str(), (path()).c_str(), &p_data);
dkato 13:d3571c244759 51 }
dkato 6:d9e6379eefac 52
dkato 6:d9e6379eefac 53 if ((p_data == NULL) || (size <= 0)) {
dkato 15:371fbad587ed 54 if (callback_func_send_end != NULL) {
dkato 15:371fbad587ed 55 callback_func_send_end((rootPath()).c_str(), (path()).c_str(), p_data);
dkato 15:371fbad587ed 56 }
dkato 6:d9e6379eefac 57 m_err404 = true;
dkato 6:d9e6379eefac 58 setErrCode(404);
dkato 6:d9e6379eefac 59 const char* msg = "File not found.";
dkato 6:d9e6379eefac 60 setContentLen(strlen(msg));
dkato 6:d9e6379eefac 61 respHeaders()["Content-Type"] = "text/html";
dkato 6:d9e6379eefac 62 respHeaders()["Connection"] = "close";
dkato 6:d9e6379eefac 63 writeData(msg,strlen(msg)); //Only send header
dkato 6:d9e6379eefac 64 printf("\r\nExit SnapshotHandler::doGet() w Error 404\r\n");
dkato 6:d9e6379eefac 65 req_sem.release();
dkato 6:d9e6379eefac 66 return;
dkato 6:d9e6379eefac 67 }
dkato 6:d9e6379eefac 68 send_data_buf = p_data;
dkato 6:d9e6379eefac 69 send_size = size;
dkato 6:d9e6379eefac 70 send_index = 0;
dkato 6:d9e6379eefac 71
dkato 6:d9e6379eefac 72 //Response
dkato 6:d9e6379eefac 73 setContentLen(send_size);
dkato 6:d9e6379eefac 74
dkato 6:d9e6379eefac 75 //Make sure that the browser won't cache this request
dkato 6:d9e6379eefac 76 respHeaders()["Cache-Control"] = "no-store";
dkato 6:d9e6379eefac 77 respHeaders()["Pragma"] = "no-cache";
dkato 6:d9e6379eefac 78 respHeaders()["Expires"] = "0";
dkato 6:d9e6379eefac 79
dkato 6:d9e6379eefac 80 //Write data
dkato 6:d9e6379eefac 81 respHeaders()["Connection"] = "close";
dkato 6:d9e6379eefac 82 onWriteable();
dkato 6:d9e6379eefac 83
dkato 6:d9e6379eefac 84 req_sem.release();
dkato 6:d9e6379eefac 85 }
dkato 6:d9e6379eefac 86
dkato 6:d9e6379eefac 87 void SnapshotHandler::doPost()
dkato 6:d9e6379eefac 88 {
dkato 6:d9e6379eefac 89
dkato 6:d9e6379eefac 90 }
dkato 6:d9e6379eefac 91
dkato 6:d9e6379eefac 92 void SnapshotHandler::doHead()
dkato 6:d9e6379eefac 93 {
dkato 6:d9e6379eefac 94
dkato 6:d9e6379eefac 95 }
dkato 6:d9e6379eefac 96
dkato 6:d9e6379eefac 97 void SnapshotHandler::onReadable() //Data has been read
dkato 6:d9e6379eefac 98 {
dkato 6:d9e6379eefac 99
dkato 6:d9e6379eefac 100 }
dkato 6:d9e6379eefac 101
dkato 6:d9e6379eefac 102 void SnapshotHandler::onWriteable() //Data has been written & buf is free
dkato 6:d9e6379eefac 103 {
dkato 6:d9e6379eefac 104 if (m_err404) {
dkato 6:d9e6379eefac 105 //Error has been served, now exit
dkato 6:d9e6379eefac 106 close();
dkato 6:d9e6379eefac 107 } else {
dkato 6:d9e6379eefac 108 while (true) {
dkato 6:d9e6379eefac 109 int len = send_size - send_index;
dkato 6:d9e6379eefac 110 if (len > 0) {
dkato 6:d9e6379eefac 111 int writtenLen = writeData((char *)&send_data_buf[send_index], len);
dkato 6:d9e6379eefac 112 if (writtenLen < 0) { //Socket error
dkato 6:d9e6379eefac 113 close();
dkato 15:371fbad587ed 114 if (callback_func_send_end != NULL) {
dkato 15:371fbad587ed 115 callback_func_send_end((rootPath()).c_str(), (path()).c_str(), send_data_buf);
dkato 15:371fbad587ed 116 }
dkato 6:d9e6379eefac 117 return;
dkato 6:d9e6379eefac 118 } else {
dkato 6:d9e6379eefac 119 send_index += writtenLen;
dkato 6:d9e6379eefac 120 }
dkato 6:d9e6379eefac 121 } else {
dkato 6:d9e6379eefac 122 close();
dkato 15:371fbad587ed 123 if (callback_func_send_end != NULL) {
dkato 15:371fbad587ed 124 callback_func_send_end((rootPath()).c_str(), (path()).c_str(), send_data_buf);
dkato 15:371fbad587ed 125 }
dkato 6:d9e6379eefac 126 return;
dkato 6:d9e6379eefac 127 }
dkato 6:d9e6379eefac 128 }
dkato 6:d9e6379eefac 129 }
dkato 6:d9e6379eefac 130 }
dkato 6:d9e6379eefac 131
dkato 6:d9e6379eefac 132 void SnapshotHandler::onClose() //Connection is closing
dkato 6:d9e6379eefac 133 {
dkato 6:d9e6379eefac 134 //Nothing to do
dkato 6:d9e6379eefac 135 }
dkato 11:0700755d64ae 136