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
Dropbox/HTTPFileSender.cpp@1:b05231650f32, 2011-04-25 (annotated)
- Committer:
- sivan_toledo
- Date:
- Mon Apr 25 12:31:46 2011 +0000
- Revision:
- 1:b05231650f32
- Parent:
- 0:3e7d6f496a67
Who changed what in which revision?
User | Revision | Line number | New 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) { } |