Fork of HttpServer_snapshot_mbed-os library

Fork of HttpServer_snapshot_mbed-os by Renesas

Committer:
dkato
Date:
Fri Aug 21 02:07:48 2015 +0000
Revision:
6:d9e6379eefac
Child:
7:62bfc317772b
Add snapshot handler.

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