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

Committer:
sivan_toledo
Date:
Mon Apr 25 12:31:46 2011 +0000
Revision:
1:b05231650f32
Parent:
0:3e7d6f496a67

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sivan_toledo 0:3e7d6f496a67 1 #include "HTTPFileSender.h"
sivan_toledo 0:3e7d6f496a67 2 #include "USBHost.h"
sivan_toledo 0:3e7d6f496a67 3
sivan_toledo 0:3e7d6f496a67 4 char HTTPFileSender::header[] = "";
sivan_toledo 0:3e7d6f496a67 5 char HTTPFileSender::footer[] = "\r\n\r\n--R50hrfBj5JYyfR3vF3wR96GPCC9Fd2q2pVMERvEaOE3D8LZTgLLbRpNwXek3--\r\n";
sivan_toledo 0:3e7d6f496a67 6
sivan_toledo 0:3e7d6f496a67 7 HTTPFileSender::HTTPFileSender(const char *fileName, const char *dstFile)
sivan_toledo 0:3e7d6f496a67 8 {
sivan_toledo 0:3e7d6f496a67 9 pos = 0;
sivan_toledo 0:3e7d6f496a67 10
sivan_toledo 0:3e7d6f496a67 11 printf("Opening %s\n\r", fileName);
sivan_toledo 0:3e7d6f496a67 12
sivan_toledo 0:3e7d6f496a67 13 file = fopen(fileName, "r");
sivan_toledo 0:3e7d6f496a67 14
sivan_toledo 0:3e7d6f496a67 15 printf("Opened %d\n\r", file);
sivan_toledo 0:3e7d6f496a67 16
sivan_toledo 0:3e7d6f496a67 17 fseek(file, 0L, SEEK_END);
sivan_toledo 0:3e7d6f496a67 18 printf("seek1\r\n");
sivan_toledo 0:3e7d6f496a67 19 fileLen = ftell(file);
sivan_toledo 0:3e7d6f496a67 20 printf("seek2\r\n");
sivan_toledo 0:3e7d6f496a67 21 fseek(file, 0L, SEEK_SET);
sivan_toledo 0:3e7d6f496a67 22
sivan_toledo 0:3e7d6f496a67 23 printf("Size %d\n\r", fileLen);
sivan_toledo 0:3e7d6f496a67 24
sivan_toledo 0:3e7d6f496a67 25 /*string dst = dstFile;
sivan_toledo 0:3e7d6f496a67 26 string h = ;
sivan_toledo 0:3e7d6f496a67 27 memcpy(header, h.c_str(), sizeof(header));*/
sivan_toledo 0:3e7d6f496a67 28 sprintf(header, "--R50hrfBj5JYyfR3vF3wR96GPCC9Fd2q2pVMERvEaOE3D8LZTgLLbRpNwXek3\r\nContent-Disposition: form-data; name=file; filename=%s\r\nContent-type: application/octet-stream\r\n\r\n", dstFile);
sivan_toledo 0:3e7d6f496a67 29
sivan_toledo 0:3e7d6f496a67 30 headerSize = strlen(header);
sivan_toledo 0:3e7d6f496a67 31 footerSize = strlen(footer);
sivan_toledo 0:3e7d6f496a67 32
sivan_toledo 0:3e7d6f496a67 33 totalLen = fileLen + strlen(header) + strlen(footer);
sivan_toledo 0:3e7d6f496a67 34 }
sivan_toledo 0:3e7d6f496a67 35
sivan_toledo 0:3e7d6f496a67 36 HTTPFileSender::~HTTPFileSender()
sivan_toledo 0:3e7d6f496a67 37 {
sivan_toledo 0:3e7d6f496a67 38 fclose(file);
sivan_toledo 0:3e7d6f496a67 39 printf("file %d closed\r\n", file);
sivan_toledo 0:3e7d6f496a67 40 }
sivan_toledo 0:3e7d6f496a67 41
sivan_toledo 0:3e7d6f496a67 42 int HTTPFileSender::read(char* buf, int len)
sivan_toledo 0:3e7d6f496a67 43 {
sivan_toledo 0:3e7d6f496a67 44 //printf("read requested %d bytes from file %d\n\r", len, file);
sivan_toledo 0:3e7d6f496a67 45
sivan_toledo 0:3e7d6f496a67 46 int dataSent = 0;
sivan_toledo 0:3e7d6f496a67 47
sivan_toledo 0:3e7d6f496a67 48 //printf("Header: %d, Footer: %d\r\n", headerSize, footerSize);
sivan_toledo 0:3e7d6f496a67 49
sivan_toledo 0:3e7d6f496a67 50 if (pos >= totalLen)
sivan_toledo 0:3e7d6f496a67 51 {
sivan_toledo 0:3e7d6f496a67 52 printf("End of file\n\r");
sivan_toledo 0:3e7d6f496a67 53 return 0;
sivan_toledo 0:3e7d6f496a67 54 }
sivan_toledo 0:3e7d6f496a67 55
sivan_toledo 0:3e7d6f496a67 56 if (pos < headerSize)
sivan_toledo 0:3e7d6f496a67 57 {
sivan_toledo 0:3e7d6f496a67 58 int bytesToCopy = headerSize - pos;
sivan_toledo 0:3e7d6f496a67 59 memcpy(buf, header + pos, bytesToCopy);
sivan_toledo 0:3e7d6f496a67 60
sivan_toledo 0:3e7d6f496a67 61 dataSent += bytesToCopy;
sivan_toledo 0:3e7d6f496a67 62 pos += bytesToCopy;
sivan_toledo 0:3e7d6f496a67 63
sivan_toledo 0:3e7d6f496a67 64 //printf("transfer header %d\r\n", bytesToCopy);
sivan_toledo 0:3e7d6f496a67 65 }
sivan_toledo 0:3e7d6f496a67 66
sivan_toledo 0:3e7d6f496a67 67 //printf("Before content: %d %d\r\n", pos, dataSent);
sivan_toledo 0:3e7d6f496a67 68
sivan_toledo 0:3e7d6f496a67 69 if (pos >= headerSize &&
sivan_toledo 0:3e7d6f496a67 70 pos < (headerSize + fileLen))
sivan_toledo 0:3e7d6f496a67 71 {
sivan_toledo 0:3e7d6f496a67 72 int bytesRead = fread(buf + dataSent, 1, len - dataSent, file);
sivan_toledo 0:3e7d6f496a67 73
sivan_toledo 0:3e7d6f496a67 74 dataSent += bytesRead;
sivan_toledo 0:3e7d6f496a67 75 pos += bytesRead;
sivan_toledo 0:3e7d6f496a67 76
sivan_toledo 0:3e7d6f496a67 77 // printf("transfer content %d\r\n", bytesRead);
sivan_toledo 0:3e7d6f496a67 78 }
sivan_toledo 0:3e7d6f496a67 79
sivan_toledo 0:3e7d6f496a67 80 // printf("Before footer: %d %d\n\r", pos, dataSent);
sivan_toledo 0:3e7d6f496a67 81
sivan_toledo 0:3e7d6f496a67 82 if (dataSent < len &&
sivan_toledo 0:3e7d6f496a67 83 pos >= (headerSize + fileLen) &&
sivan_toledo 0:3e7d6f496a67 84 pos < (headerSize + fileLen + footerSize))
sivan_toledo 0:3e7d6f496a67 85 {
sivan_toledo 0:3e7d6f496a67 86 int posInFooter = pos - fileLen - headerSize;
sivan_toledo 0:3e7d6f496a67 87 int bytesToCopy = min(footerSize - posInFooter, len - dataSent);
sivan_toledo 0:3e7d6f496a67 88
sivan_toledo 0:3e7d6f496a67 89 memcpy(buf + dataSent, footer + posInFooter, bytesToCopy);
sivan_toledo 0:3e7d6f496a67 90
sivan_toledo 0:3e7d6f496a67 91 dataSent += bytesToCopy;
sivan_toledo 0:3e7d6f496a67 92 pos += bytesToCopy;
sivan_toledo 0:3e7d6f496a67 93
sivan_toledo 0:3e7d6f496a67 94 // printf("transfer footer %d\r\n", bytesToCopy);
sivan_toledo 0:3e7d6f496a67 95 }
sivan_toledo 0:3e7d6f496a67 96
sivan_toledo 0:3e7d6f496a67 97 //printf("After: %d %d\r\n", pos, dataSent);
sivan_toledo 0:3e7d6f496a67 98
sivan_toledo 0:3e7d6f496a67 99 //int result = fread(buf, 1, len, file);
sivan_toledo 0:3e7d6f496a67 100
sivan_toledo 0:3e7d6f496a67 101 //printf("read %s %d bytes\r\n", buf, dataSent);
sivan_toledo 0:3e7d6f496a67 102 if (pos % 1024 == 0) printf("read %d bytes pos %d\r\n", dataSent, pos);
sivan_toledo 0:3e7d6f496a67 103
sivan_toledo 0:3e7d6f496a67 104 return dataSent;
sivan_toledo 0:3e7d6f496a67 105 }
sivan_toledo 0:3e7d6f496a67 106
sivan_toledo 0:3e7d6f496a67 107 string HTTPFileSender::getDataType()
sivan_toledo 0:3e7d6f496a67 108 {
sivan_toledo 0:3e7d6f496a67 109 // printf("data type read\n\r");
sivan_toledo 0:3e7d6f496a67 110 return "multipart/form-data; boundary=R50hrfBj5JYyfR3vF3wR96GPCC9Fd2q2pVMERvEaOE3D8LZTgLLbRpNwXek3";
sivan_toledo 0:3e7d6f496a67 111 }
sivan_toledo 0:3e7d6f496a67 112
sivan_toledo 0:3e7d6f496a67 113 int HTTPFileSender::getDataLen()
sivan_toledo 0:3e7d6f496a67 114 {
sivan_toledo 0:3e7d6f496a67 115 // printf("get data len %d\n\r", totalLen);
sivan_toledo 0:3e7d6f496a67 116 return totalLen;
sivan_toledo 0:3e7d6f496a67 117 }
sivan_toledo 0:3e7d6f496a67 118
sivan_toledo 0:3e7d6f496a67 119 void HTTPFileSender::clear() { }
sivan_toledo 0:3e7d6f496a67 120
sivan_toledo 0:3e7d6f496a67 121 int HTTPFileSender::write(const char* buf, int len) { return 0; }
sivan_toledo 0:3e7d6f496a67 122
sivan_toledo 0:3e7d6f496a67 123 void HTTPFileSender::setDataType(const string& type) { }
sivan_toledo 0:3e7d6f496a67 124
sivan_toledo 0:3e7d6f496a67 125 bool HTTPFileSender::getIsChunked() { return false; }
sivan_toledo 0:3e7d6f496a67 126 void HTTPFileSender::setIsChunked(bool chunked) { }
sivan_toledo 0:3e7d6f496a67 127
sivan_toledo 0:3e7d6f496a67 128 void HTTPFileSender::setDataLen(int len) { }