Student project by David Berlin and Boris Dogadov made for the Embedded Systems Workshop course given in Tel-Aviv University on 2010 by Sivan Toledo. Visit the project website for more details: http://davidberlin.co.il/sadna/ .
Dependencies: EthernetNetIf NTPClient_NetServices mbed HTTPServer HTTPClient CyaSSL
HttpHandlerSetup.cpp@0:3e7d6f496a67, 2011-04-17 (annotated)
- Committer:
- sivan_toledo
- Date:
- Sun Apr 17 21:30:10 2011 +0000
- Revision:
- 0:3e7d6f496a67
- Child:
- 1:b05231650f32
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sivan_toledo | 0:3e7d6f496a67 | 1 | #include "HttpHandlerSetup.h" |
sivan_toledo | 0:3e7d6f496a67 | 2 | |
sivan_toledo | 0:3e7d6f496a67 | 3 | bool ReadSettings(char* username, char* password) |
sivan_toledo | 0:3e7d6f496a67 | 4 | { |
sivan_toledo | 0:3e7d6f496a67 | 5 | //printf("ReadSettings start\r\n"); |
sivan_toledo | 0:3e7d6f496a67 | 6 | FILE* settingsFile = fopen("/usb/DBSet.txt", "r"); |
sivan_toledo | 0:3e7d6f496a67 | 7 | if (settingsFile) |
sivan_toledo | 0:3e7d6f496a67 | 8 | { |
sivan_toledo | 0:3e7d6f496a67 | 9 | //printf("before fseek %d\n\r", settingsFile); |
sivan_toledo | 0:3e7d6f496a67 | 10 | fseek(settingsFile, 9L, SEEK_SET); |
sivan_toledo | 0:3e7d6f496a67 | 11 | fgets(username, 32, settingsFile); |
sivan_toledo | 0:3e7d6f496a67 | 12 | fseek(settingsFile, 9L, SEEK_CUR); |
sivan_toledo | 0:3e7d6f496a67 | 13 | fgets(password, 32, settingsFile); |
sivan_toledo | 0:3e7d6f496a67 | 14 | |
sivan_toledo | 0:3e7d6f496a67 | 15 | |
sivan_toledo | 0:3e7d6f496a67 | 16 | int len = strlen(username); username[len - 2] = 0; // remove /r/n |
sivan_toledo | 0:3e7d6f496a67 | 17 | //printf("ReadSettings %s, %s, %d, %d, %s\r\n", username, password, len, ftell(settingsFile), data); |
sivan_toledo | 0:3e7d6f496a67 | 18 | |
sivan_toledo | 0:3e7d6f496a67 | 19 | fclose(settingsFile); |
sivan_toledo | 0:3e7d6f496a67 | 20 | } |
sivan_toledo | 0:3e7d6f496a67 | 21 | |
sivan_toledo | 0:3e7d6f496a67 | 22 | return settingsFile != 0; |
sivan_toledo | 0:3e7d6f496a67 | 23 | } |
sivan_toledo | 0:3e7d6f496a67 | 24 | |
sivan_toledo | 0:3e7d6f496a67 | 25 | HttpHandlerSetup::HttpHandlerSetup(const char* rootPath, const char* path, TCPSocket* pTCPSocket) : |
sivan_toledo | 0:3e7d6f496a67 | 26 | HTTPRequestHandler(rootPath, path, pTCPSocket) |
sivan_toledo | 0:3e7d6f496a67 | 27 | { |
sivan_toledo | 0:3e7d6f496a67 | 28 | //printf("HttpHandlerSetup()"); |
sivan_toledo | 0:3e7d6f496a67 | 29 | } |
sivan_toledo | 0:3e7d6f496a67 | 30 | |
sivan_toledo | 0:3e7d6f496a67 | 31 | HttpHandlerSetup::~HttpHandlerSetup() |
sivan_toledo | 0:3e7d6f496a67 | 32 | { |
sivan_toledo | 0:3e7d6f496a67 | 33 | } |
sivan_toledo | 0:3e7d6f496a67 | 34 | |
sivan_toledo | 0:3e7d6f496a67 | 35 | void HttpHandlerSetup::doGetPageWelcome() |
sivan_toledo | 0:3e7d6f496a67 | 36 | { |
sivan_toledo | 0:3e7d6f496a67 | 37 | //printf("doGetPageWelcome()-start\r\n"); |
sivan_toledo | 0:3e7d6f496a67 | 38 | const char* resp = |
sivan_toledo | 0:3e7d6f496a67 | 39 | "<html><body>" |
sivan_toledo | 0:3e7d6f496a67 | 40 | "<p><span style=\"color: #a9a9a9\"><span style=\"font-size: 12px\">DropBox Sync Setup</span></span></p><p>" |
sivan_toledo | 0:3e7d6f496a67 | 41 | "<p><a href=\"/Setup\">Setup</a></p>" |
sivan_toledo | 0:3e7d6f496a67 | 42 | "<p><a href=\"/UsbBrowser/root/\">DiskOnKey browser</a></p>" |
sivan_toledo | 0:3e7d6f496a67 | 43 | "</form><p> </p>" |
sivan_toledo | 0:3e7d6f496a67 | 44 | "<p><strong><span style=\"color: #000080\">BDDB Ltd.</span></strong></p>" |
sivan_toledo | 0:3e7d6f496a67 | 45 | "</body>" |
sivan_toledo | 0:3e7d6f496a67 | 46 | "</html>"; |
sivan_toledo | 0:3e7d6f496a67 | 47 | |
sivan_toledo | 0:3e7d6f496a67 | 48 | int len = strlen(resp); |
sivan_toledo | 0:3e7d6f496a67 | 49 | setContentLen(len); |
sivan_toledo | 0:3e7d6f496a67 | 50 | respHeaders()["Connection"] = "close"; |
sivan_toledo | 0:3e7d6f496a67 | 51 | writeData(resp, len); |
sivan_toledo | 0:3e7d6f496a67 | 52 | } |
sivan_toledo | 0:3e7d6f496a67 | 53 | |
sivan_toledo | 0:3e7d6f496a67 | 54 | void HttpHandlerSetup::UpdateSettingsFile() |
sivan_toledo | 0:3e7d6f496a67 | 55 | { |
sivan_toledo | 0:3e7d6f496a67 | 56 | if (m_WasDataRead) |
sivan_toledo | 0:3e7d6f496a67 | 57 | { |
sivan_toledo | 0:3e7d6f496a67 | 58 | return; |
sivan_toledo | 0:3e7d6f496a67 | 59 | } |
sivan_toledo | 0:3e7d6f496a67 | 60 | |
sivan_toledo | 0:3e7d6f496a67 | 61 | char buffer[256]; |
sivan_toledo | 0:3e7d6f496a67 | 62 | int dataLength = dataLen(); |
sivan_toledo | 0:3e7d6f496a67 | 63 | int readBytes = readData(buffer, 45 + dataLength); |
sivan_toledo | 0:3e7d6f496a67 | 64 | |
sivan_toledo | 0:3e7d6f496a67 | 65 | if (readBytes > 0) |
sivan_toledo | 0:3e7d6f496a67 | 66 | { |
sivan_toledo | 0:3e7d6f496a67 | 67 | int offset = readBytes > dataLength ? 45 : 0; // Inconsistency id data reading |
sivan_toledo | 0:3e7d6f496a67 | 68 | char* c1 = strchr(buffer, '&'); |
sivan_toledo | 0:3e7d6f496a67 | 69 | char* c2 = strchr(buffer + offset, '=') + 1; |
sivan_toledo | 0:3e7d6f496a67 | 70 | char* c3 = strchr(c1, '=') + 1; |
sivan_toledo | 0:3e7d6f496a67 | 71 | int lenU = c1 - c2; |
sivan_toledo | 0:3e7d6f496a67 | 72 | int lenP = readBytes - (c3 - buffer); |
sivan_toledo | 0:3e7d6f496a67 | 73 | |
sivan_toledo | 0:3e7d6f496a67 | 74 | char* c2_fixed = strstr(c2, "%40"); |
sivan_toledo | 0:3e7d6f496a67 | 75 | if (c2_fixed) // case @ is replaced by %40 |
sivan_toledo | 0:3e7d6f496a67 | 76 | { |
sivan_toledo | 0:3e7d6f496a67 | 77 | c2_fixed[0] = '@'; |
sivan_toledo | 0:3e7d6f496a67 | 78 | memcpy(c2_fixed + 1, c2_fixed + 3, lenU - (c2_fixed - c2) - 3); |
sivan_toledo | 0:3e7d6f496a67 | 79 | lenU -= 2; |
sivan_toledo | 0:3e7d6f496a67 | 80 | printf(c2); |
sivan_toledo | 0:3e7d6f496a67 | 81 | } |
sivan_toledo | 0:3e7d6f496a67 | 82 | |
sivan_toledo | 0:3e7d6f496a67 | 83 | FILE* settingsFile = fopen("/usb/DBSet.txt", "w"); |
sivan_toledo | 0:3e7d6f496a67 | 84 | if (settingsFile) |
sivan_toledo | 0:3e7d6f496a67 | 85 | { |
sivan_toledo | 0:3e7d6f496a67 | 86 | fwrite("USERNAME=", 1, 9, settingsFile); |
sivan_toledo | 0:3e7d6f496a67 | 87 | fwrite(c2, 1, lenU, settingsFile); |
sivan_toledo | 0:3e7d6f496a67 | 88 | fwrite("\r\nPASSWORD=", 1, 11, settingsFile); |
sivan_toledo | 0:3e7d6f496a67 | 89 | fwrite(c3, 1, lenP, settingsFile); |
sivan_toledo | 0:3e7d6f496a67 | 90 | fclose(settingsFile); |
sivan_toledo | 0:3e7d6f496a67 | 91 | |
sivan_toledo | 0:3e7d6f496a67 | 92 | //printf("Updated %s, %s\r\n", c2, c3); |
sivan_toledo | 0:3e7d6f496a67 | 93 | } |
sivan_toledo | 0:3e7d6f496a67 | 94 | m_WasDataRead = true; |
sivan_toledo | 0:3e7d6f496a67 | 95 | } |
sivan_toledo | 0:3e7d6f496a67 | 96 | |
sivan_toledo | 0:3e7d6f496a67 | 97 | //printf("readBytes %d\r\n", readBytes); |
sivan_toledo | 0:3e7d6f496a67 | 98 | } |
sivan_toledo | 0:3e7d6f496a67 | 99 | |
sivan_toledo | 0:3e7d6f496a67 | 100 | void HttpHandlerSetup::doGet() |
sivan_toledo | 0:3e7d6f496a67 | 101 | { |
sivan_toledo | 0:3e7d6f496a67 | 102 | //printf("Setup path %s\r\n", path()); |
sivan_toledo | 0:3e7d6f496a67 | 103 | if (path().size() <= 1) |
sivan_toledo | 0:3e7d6f496a67 | 104 | { |
sivan_toledo | 0:3e7d6f496a67 | 105 | doGetPageWelcome(); |
sivan_toledo | 0:3e7d6f496a67 | 106 | return; |
sivan_toledo | 0:3e7d6f496a67 | 107 | } |
sivan_toledo | 0:3e7d6f496a67 | 108 | |
sivan_toledo | 0:3e7d6f496a67 | 109 | //printf("doGet()-start %s, %s\r\n", Username, Password); |
sivan_toledo | 0:3e7d6f496a67 | 110 | const char* resp1 = |
sivan_toledo | 0:3e7d6f496a67 | 111 | "<html><body>" |
sivan_toledo | 0:3e7d6f496a67 | 112 | "<p><span style=\"color: #a9a9a9\"><span style=\"font-size: 12px\">DropBox Sync Setup</span></span></p><p>" |
sivan_toledo | 0:3e7d6f496a67 | 113 | "<form method=\"post\" action=\"\">" |
sivan_toledo | 0:3e7d6f496a67 | 114 | "Username: <input type=\"text\" name=\"Username\" value=\""; |
sivan_toledo | 0:3e7d6f496a67 | 115 | const char* resp2 = "\" /><br />Password: <input type=\"text\" name=\"Password\" value=\""; |
sivan_toledo | 0:3e7d6f496a67 | 116 | const char* resp3 = |
sivan_toledo | 0:3e7d6f496a67 | 117 | "\" /><br /><input type=\"submit\" value=\"Submit\" />" |
sivan_toledo | 0:3e7d6f496a67 | 118 | "</form><p> </p>" |
sivan_toledo | 0:3e7d6f496a67 | 119 | "<p><strong><span style=\"color: #000080\">BDDB Ltd</span></strong></p>" |
sivan_toledo | 0:3e7d6f496a67 | 120 | "</body>" |
sivan_toledo | 0:3e7d6f496a67 | 121 | "</html>"; |
sivan_toledo | 0:3e7d6f496a67 | 122 | |
sivan_toledo | 0:3e7d6f496a67 | 123 | char username[32]="invalid", password[32]="error"; |
sivan_toledo | 0:3e7d6f496a67 | 124 | ReadSettings(username, password); |
sivan_toledo | 0:3e7d6f496a67 | 125 | |
sivan_toledo | 0:3e7d6f496a67 | 126 | int l1 = strlen(resp1), l2 = strlen(resp2), l3 = strlen(resp3); |
sivan_toledo | 0:3e7d6f496a67 | 127 | int p = strlen(password), u = strlen(username); |
sivan_toledo | 0:3e7d6f496a67 | 128 | |
sivan_toledo | 0:3e7d6f496a67 | 129 | respHeaders()["Connection"] = "close"; |
sivan_toledo | 0:3e7d6f496a67 | 130 | |
sivan_toledo | 0:3e7d6f496a67 | 131 | setContentLen(l1 + l2 + l3 + p + u); |
sivan_toledo | 0:3e7d6f496a67 | 132 | int t1 = writeData(resp1, l1); |
sivan_toledo | 0:3e7d6f496a67 | 133 | int t2 = writeData(username, u); |
sivan_toledo | 0:3e7d6f496a67 | 134 | int t3 = writeData(resp2, l2); |
sivan_toledo | 0:3e7d6f496a67 | 135 | int t4 = writeData(password,p); |
sivan_toledo | 0:3e7d6f496a67 | 136 | int t5 = writeData(resp3, l3); |
sivan_toledo | 0:3e7d6f496a67 | 137 | |
sivan_toledo | 0:3e7d6f496a67 | 138 | m_WasDataRead = false; |
sivan_toledo | 0:3e7d6f496a67 | 139 | printf("doGet()-end\r\n"); |
sivan_toledo | 0:3e7d6f496a67 | 140 | } |
sivan_toledo | 0:3e7d6f496a67 | 141 | |
sivan_toledo | 0:3e7d6f496a67 | 142 | void HttpHandlerSetup::doPost() |
sivan_toledo | 0:3e7d6f496a67 | 143 | {/* |
sivan_toledo | 0:3e7d6f496a67 | 144 | map<string,string>::iterator it = reqHeaders().begin(); |
sivan_toledo | 0:3e7d6f496a67 | 145 | printf("printing %s\n\r", path()); |
sivan_toledo | 0:3e7d6f496a67 | 146 | while (it != reqHeaders().end()) |
sivan_toledo | 0:3e7d6f496a67 | 147 | { |
sivan_toledo | 0:3e7d6f496a67 | 148 | printf("%s --- %s\r\n", it->first, it->second); |
sivan_toledo | 0:3e7d6f496a67 | 149 | it++; |
sivan_toledo | 0:3e7d6f496a67 | 150 | } |
sivan_toledo | 0:3e7d6f496a67 | 151 | */ |
sivan_toledo | 0:3e7d6f496a67 | 152 | printf("doPost()-start\r\n"); |
sivan_toledo | 0:3e7d6f496a67 | 153 | UpdateSettingsFile(); |
sivan_toledo | 0:3e7d6f496a67 | 154 | |
sivan_toledo | 0:3e7d6f496a67 | 155 | const char* resp = |
sivan_toledo | 0:3e7d6f496a67 | 156 | "<html><body>" |
sivan_toledo | 0:3e7d6f496a67 | 157 | "<p><span style=\"color: #0080FF\"><span style=\"font-size: 14px\">Password changed</span></span></p><p>" |
sivan_toledo | 0:3e7d6f496a67 | 158 | "<FORM><INPUT TYPE=\"button\" VALUE=\"Back\" onClick=\"history.go(-1);return true;\"></FORM>" |
sivan_toledo | 0:3e7d6f496a67 | 159 | "</form><p> </p>" |
sivan_toledo | 0:3e7d6f496a67 | 160 | "<p><strong><span style=\"color: #000080\">BDDB Ltd.</span></strong></p>" |
sivan_toledo | 0:3e7d6f496a67 | 161 | "</body>" |
sivan_toledo | 0:3e7d6f496a67 | 162 | "</html>"; |
sivan_toledo | 0:3e7d6f496a67 | 163 | const int length = strlen(resp); |
sivan_toledo | 0:3e7d6f496a67 | 164 | setContentLen(length); |
sivan_toledo | 0:3e7d6f496a67 | 165 | respHeaders()["Connection"] = "keep-alive"; |
sivan_toledo | 0:3e7d6f496a67 | 166 | writeData(resp, length); |
sivan_toledo | 0:3e7d6f496a67 | 167 | |
sivan_toledo | 0:3e7d6f496a67 | 168 | printf("doPost()-end\r\n"); |
sivan_toledo | 0:3e7d6f496a67 | 169 | } |
sivan_toledo | 0:3e7d6f496a67 | 170 | |
sivan_toledo | 0:3e7d6f496a67 | 171 | void HttpHandlerSetup::doHead() |
sivan_toledo | 0:3e7d6f496a67 | 172 | { |
sivan_toledo | 0:3e7d6f496a67 | 173 | printf("onHead\r\n"); |
sivan_toledo | 0:3e7d6f496a67 | 174 | } |
sivan_toledo | 0:3e7d6f496a67 | 175 | |
sivan_toledo | 0:3e7d6f496a67 | 176 | void HttpHandlerSetup::onReadable() //Data has been read |
sivan_toledo | 0:3e7d6f496a67 | 177 | { |
sivan_toledo | 0:3e7d6f496a67 | 178 | printf("onReadable\r\n"); |
sivan_toledo | 0:3e7d6f496a67 | 179 | UpdateSettingsFile(); |
sivan_toledo | 0:3e7d6f496a67 | 180 | } |
sivan_toledo | 0:3e7d6f496a67 | 181 | |
sivan_toledo | 0:3e7d6f496a67 | 182 | void HttpHandlerSetup::onWriteable() //Data has been written & buf is free |
sivan_toledo | 0:3e7d6f496a67 | 183 | { |
sivan_toledo | 0:3e7d6f496a67 | 184 | // printf("onWriteable() password: %s, username:%s \r\n", Password, Username); |
sivan_toledo | 0:3e7d6f496a67 | 185 | printf("onWriteable\r\n"); |
sivan_toledo | 0:3e7d6f496a67 | 186 | //close(); //Data written, we can close the connection |
sivan_toledo | 0:3e7d6f496a67 | 187 | } |
sivan_toledo | 0:3e7d6f496a67 | 188 | |
sivan_toledo | 0:3e7d6f496a67 | 189 | void HttpHandlerSetup::onClose() //Connection is closing |
sivan_toledo | 0:3e7d6f496a67 | 190 | { |
sivan_toledo | 0:3e7d6f496a67 | 191 | printf("onClose\r\n"); |
sivan_toledo | 0:3e7d6f496a67 | 192 | //Nothing to do |
sivan_toledo | 0:3e7d6f496a67 | 193 | } |