CookieServer

Dependencies:   EthernetInterface mbed-rtos mbed

Fork of TCP-TCPEchoServer by avnish aggarwal

Committer:
sunilaluri6
Date:
Tue May 13 03:44:37 2014 +0000
Revision:
6:9044de9736a1
Cookie Server

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sunilaluri6 6:9044de9736a1 1 /***********************************************************************/
sunilaluri6 6:9044de9736a1 2 /******************************Prologue*********************************/
sunilaluri6 6:9044de9736a1 3 /* University of California Santa Cruz Extension */
sunilaluri6 6:9044de9736a1 4 /* */
sunilaluri6 6:9044de9736a1 5 /* Internet of Things */
sunilaluri6 6:9044de9736a1 6 /* Instructor: Avnish Aggarwal */
sunilaluri6 6:9044de9736a1 7 /* Author: Sunil Aluri */
sunilaluri6 6:9044de9736a1 8 /* Assignment 4 part2a */
sunilaluri6 6:9044de9736a1 9 /* */
sunilaluri6 6:9044de9736a1 10 /* File name: mbed_tcp_cookie_server_Sunil_Aluri.cpp */
sunilaluri6 6:9044de9736a1 11 /* Date:5/12/2014 */
sunilaluri6 6:9044de9736a1 12 /* Objective: Develop a program to */
sunilaluri6 6:9044de9736a1 13 /* fetch cookies,date from internet and send them to client */
sunilaluri6 6:9044de9736a1 14 /* each time it connects */
sunilaluri6 6:9044de9736a1 15 /* Comments: Since, I do not have two Mbed boards, used a */
sunilaluri6 6:9044de9736a1 16 /* telent client to get the server data */
sunilaluri6 6:9044de9736a1 17 /***********************************************************************/
sunilaluri6 6:9044de9736a1 18
sunilaluri6 6:9044de9736a1 19
sunilaluri6 6:9044de9736a1 20 #include "mbed.h"
sunilaluri6 6:9044de9736a1 21 #include "EthernetInterface.h"
sunilaluri6 6:9044de9736a1 22 #define ECHO_SERVER_PORT 7 // define the port which the clients can connect to
sunilaluri6 6:9044de9736a1 23
sunilaluri6 6:9044de9736a1 24 // FetchCookies Class function is to , connect to a http web server and get the html header
sunilaluri6 6:9044de9736a1 25 // of the webiste, which contains Date and Set-Cookie fields.
sunilaluri6 6:9044de9736a1 26 class FetchCookies
sunilaluri6 6:9044de9736a1 27 {
sunilaluri6 6:9044de9736a1 28 private:
sunilaluri6 6:9044de9736a1 29 char buffer[300],*key,*date,*cookie,*client_message;
sunilaluri6 6:9044de9736a1 30 int ret;
sunilaluri6 6:9044de9736a1 31 TCPSocketConnection sock; //create a socket for TCP connection on the server
sunilaluri6 6:9044de9736a1 32 public:
sunilaluri6 6:9044de9736a1 33 FetchCookies() { // initiate all the pointers and buffers
sunilaluri6 6:9044de9736a1 34 ret=0;
sunilaluri6 6:9044de9736a1 35 buffer[0]='\0';
sunilaluri6 6:9044de9736a1 36 key =0;
sunilaluri6 6:9044de9736a1 37 date=0;
sunilaluri6 6:9044de9736a1 38 cookie=0;
sunilaluri6 6:9044de9736a1 39 client_message=0;
sunilaluri6 6:9044de9736a1 40 }
sunilaluri6 6:9044de9736a1 41 ~FetchCookies() { // destructor that frees the memory allocated
sunilaluri6 6:9044de9736a1 42 free(client_message);
sunilaluri6 6:9044de9736a1 43 }
sunilaluri6 6:9044de9736a1 44
sunilaluri6 6:9044de9736a1 45
sunilaluri6 6:9044de9736a1 46 // getCookie method, connects to a website and requests header. It fetches the date and cookie
sunilaluri6 6:9044de9736a1 47 // part of the received header and sends out the information to the caller function.
sunilaluri6 6:9044de9736a1 48 char* getCookie () {
sunilaluri6 6:9044de9736a1 49 sock.connect("google.com", 80); // connect to the webserver
sunilaluri6 6:9044de9736a1 50 //send the HEAD cmd to request header of the webpage
sunilaluri6 6:9044de9736a1 51 char http_cmd[] = "HEAD http://www.google.com/ HTTP/1.0\r\n\r\n";
sunilaluri6 6:9044de9736a1 52 sock.send_all(http_cmd, sizeof(http_cmd)-1);
sunilaluri6 6:9044de9736a1 53 // receive the information from web server
sunilaluri6 6:9044de9736a1 54 ret = sock.receive(buffer, sizeof(buffer)-1);
sunilaluri6 6:9044de9736a1 55 // using strtok function, fetch for date and cookie part of header, which are
sunilaluri6 6:9044de9736a1 56 //delimited by \n charecter
sunilaluri6 6:9044de9736a1 57 if (ret > 0) {
sunilaluri6 6:9044de9736a1 58 buffer[ret] = '\0';
sunilaluri6 6:9044de9736a1 59 key = strtok(buffer,"\n");
sunilaluri6 6:9044de9736a1 60 date = strtok(NULL,"\n");
sunilaluri6 6:9044de9736a1 61 while(key!=NULL) {
sunilaluri6 6:9044de9736a1 62 key=strtok(NULL,"\n");
sunilaluri6 6:9044de9736a1 63 if(strstr(key,"Set")==NULL) {
sunilaluri6 6:9044de9736a1 64 continue;
sunilaluri6 6:9044de9736a1 65 } else {
sunilaluri6 6:9044de9736a1 66 cookie =key;
sunilaluri6 6:9044de9736a1 67 break;
sunilaluri6 6:9044de9736a1 68 }
sunilaluri6 6:9044de9736a1 69 }
sunilaluri6 6:9044de9736a1 70 // for string concatenation, assign memory
sunilaluri6 6:9044de9736a1 71 client_message = (char*)malloc(strlen(date)+strlen(cookie)+1);
sunilaluri6 6:9044de9736a1 72 // copy the date and cookie info into the message pointer
sunilaluri6 6:9044de9736a1 73 sprintf(client_message,"%s\r\n%s",date,cookie);
sunilaluri6 6:9044de9736a1 74 }
sunilaluri6 6:9044de9736a1 75 //close the webserver connection
sunilaluri6 6:9044de9736a1 76 sock.close();
sunilaluri6 6:9044de9736a1 77 // send the TCP client message pointer.
sunilaluri6 6:9044de9736a1 78 return(client_message);
sunilaluri6 6:9044de9736a1 79 }
sunilaluri6 6:9044de9736a1 80 };
sunilaluri6 6:9044de9736a1 81
sunilaluri6 6:9044de9736a1 82
sunilaluri6 6:9044de9736a1 83 int main (void)
sunilaluri6 6:9044de9736a1 84 {
sunilaluri6 6:9044de9736a1 85 /**** ether net interface definition begin *****/
sunilaluri6 6:9044de9736a1 86 EthernetInterface eth;
sunilaluri6 6:9044de9736a1 87 eth.init(); //Use DHCP
sunilaluri6 6:9044de9736a1 88 eth.connect();
sunilaluri6 6:9044de9736a1 89 /**** ethernet interface definition end*******/
sunilaluri6 6:9044de9736a1 90 FetchCookies FC; // create an object for Fetch Cookies class
sunilaluri6 6:9044de9736a1 91 printf("\r\nIP Address is %s\n", eth.getIPAddress()); //print the server IP address
sunilaluri6 6:9044de9736a1 92 TCPSocketServer server; //create a socket for server to listen to requests
sunilaluri6 6:9044de9736a1 93 server.bind(ECHO_SERVER_PORT); // bind the port to server
sunilaluri6 6:9044de9736a1 94 server.listen(); //listen for client requests
sunilaluri6 6:9044de9736a1 95 char *client_info=0;
sunilaluri6 6:9044de9736a1 96 //the following loop, listens for new connections, make them and send the response message to clients
sunilaluri6 6:9044de9736a1 97 while (true) {
sunilaluri6 6:9044de9736a1 98 printf("\r\nWait for new connection...\r\n");
sunilaluri6 6:9044de9736a1 99 TCPSocketConnection client;
sunilaluri6 6:9044de9736a1 100
sunilaluri6 6:9044de9736a1 101 server.accept(client); // accept the incoming connection
sunilaluri6 6:9044de9736a1 102 client.set_blocking(false, 5500); // Timeout after (1.5)s
sunilaluri6 6:9044de9736a1 103 client_info =FC.getCookie(); // fetch new cookie and date from webservers
sunilaluri6 6:9044de9736a1 104 printf("Connection from: %s\r\n", client.get_address());
sunilaluri6 6:9044de9736a1 105 if(client_info == 0) // if no message was obtained, quit and start for new client connection
sunilaluri6 6:9044de9736a1 106 break;
sunilaluri6 6:9044de9736a1 107 printf("Sending Data to client...\r\n"); // if webserver gives the cookies, send them to client.
sunilaluri6 6:9044de9736a1 108 client.send_all(client_info,strlen(client_info));
sunilaluri6 6:9044de9736a1 109 wait(5);
sunilaluri6 6:9044de9736a1 110 printf("Closing connection\r\n"); // after sending the message, close the connection
sunilaluri6 6:9044de9736a1 111 client.close();
sunilaluri6 6:9044de9736a1 112 }
sunilaluri6 6:9044de9736a1 113
sunilaluri6 6:9044de9736a1 114 }
sunilaluri6 6:9044de9736a1 115
sunilaluri6 6:9044de9736a1 116