HttpServer Library for "mbed classic" which added a snapshot handler.

Dependents:   GR-PEACH_WebCamera_OV5642_fixedIP GR-PEACH_WebCamera_AP

Fork of HttpServer by Yasushi TAUCHI

Committer:
dkato
Date:
Wed Oct 21 08:27:27 2015 +0000
Revision:
7:62bfc317772b
Parent:
6:d9e6379eefac
speed up

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