void MTD_FLASHMEM MultipartFormDataProcessor::handle_GettingFile_GettingValue(char c) { static char const BOB[4] = {0x0D, 0x0A, '-', '-'}; // begin of boundary (just before every boundary) if (substate < 4 && c == BOB[substate]) { ++substate; } else if (substate >= 4 && c == boundary[substate - 4]) { ++substate; if (substate - 4 == boundarylen) { // found boundary, end file or value if (state == GettingFile) file.close(); else formfields->add(nameBegin, nameEnd, valueStorage->getIterator(), CharChunksIterator()); state = BoundaryFound; substate = 0; } } else { if (substate > 0) { // first "substate" bytes seemed the BOB or Boundary, but they were not! int32_t cnt = substate; substate = 0; if (state == GettingFile) file.write(BOB, 1); else valueStorage->append(BOB[0], FORM_CHUNK_SIZE); for (int32_t i = 1; i != cnt; ++i) push(i < 4 ? BOB[i] : boundary[i - 4]); push(c); } else { if (state == GettingFile) file.write(&c, 1); else valueStorage->append(c, FORM_CHUNK_SIZE); } } }
void MTD_FLASHMEM MultipartFormDataProcessor::handle_DecodingHeaders(char c) { static char const EOH[4] = {0x0D, 0x0A, 0x0D, 0x0A}; if (c == EOH[substate]) { ++substate; if (substate == 2) { // useful if this is not an EOH to separate headers headers->append(0x0D, 1); } else if (substate == 4) { // end of headers headers->append(0, 1); // add string terminating zero // look for "name" parameter CharChunksIterator keyBegin; extractParameter(FSTR(" name="), headers->getIterator(), &keyBegin, &nameBegin, &nameEnd); // look for "filename" parameter CharChunksIterator filenameBegin, filenameEnd; if (extractParameter(FSTR(" filename="), headers->getIterator(), &keyBegin, &filenameBegin, &filenameEnd)) { //// this is a file // add "filename" to form fields filenameBegin = getFilename(filenameBegin, filenameEnd); // some browsers send a full path instead of a simple file name (IE) formfields->add(keyBegin + 1, keyBegin + 9, filenameBegin, filenameEnd); // extract Content-Type parameter CharChunksIterator contentTypeBegin, contentTypeEnd; if (extractParameter(FSTR("Content-Type:"), filenameEnd, &keyBegin, &contentTypeBegin, &contentTypeEnd)) { // add "Content-Type" to form fields formfields->add(keyBegin, keyBegin + 12, contentTypeBegin, contentTypeEnd); // create file file.create(APtr<char>(t_strdup(filenameBegin, filenameEnd)).get(), APtr<char>(t_strdup(contentTypeBegin, contentTypeEnd)).get()); state = GettingFile; } else { // missing content-type, cannot get as file! state = GettingValue; } } else { //// this is a normal field valueStorage = chunksFactory.add(); state = GettingValue; } substate = 0; } } else { // add to headers buffer headers->append(c, HEADERS_CHUNK_SIZE); substate = 0; } }
void MTD_FLASHMEM HTTPTemplateResponse::addParamFmt(char const *key, char const *fmt, ...) { va_list args; va_start(args, fmt); uint16_t len = vsprintf(NULL, fmt, args); va_end(args); char *buf = new char[len + 1]; va_start(args, fmt); vsprintf(buf, fmt, args); va_end(args); LinkedCharChunks *linkedCharChunks = m_params.add(key); linkedCharChunks->addChunk(buf, len, true); // true = need to free }
void MTD_FLASHMEM HTTPTemplateResponse::addParamInt(char const* key, int32_t value) { char* valueStr = f_printf(FSTR("%d"), value); LinkedCharChunks* linkedCharChunks = m_params.add(key); linkedCharChunks->addChunk(valueStr, f_strlen(valueStr), true); // true = need to free }
void MTD_FLASHMEM HTTPTemplateResponse::addParamStr(char const* key, char const* value) { LinkedCharChunks* linkedCharChunks = m_params.add(key); linkedCharChunks->addChunk(value); }
void MTD_FLASHMEM HTTPTemplateResponse::addParamStr(char const* key, char const* value) { LinkedCharChunks linkedCharChunks; linkedCharChunks.addChunk(value, f_strlen(value), false); m_params.add(key, linkedCharChunks); }
void MTD_FLASHMEM HTTPGPIOConfigurationResponse::flush() { if (getRequest().method == HTTPHandler::Post) { char const* gpio = getRequest().form[FSTR("GPIO")]; if (getRequest().form[FSTR("configured")]) { // gpio enabled char const* mode = getRequest().form[STR_mode]; char const* pullUp = getRequest().form[STR_pullup]; ConfigurationManager::setGPIOParams(strtol(gpio, NULL, 10), true, f_strcmp(mode, STR_out) == 0, pullUp != NULL, false); ConfigurationManager::applyGPIO(); } else if (gpio) { // gpio disabled (not configured) ConfigurationManager::setGPIOParams(strtol(gpio, NULL, 10), false, false, false, false); } } HTTPHelperConfiguration::GPIOSetValue(this); LinkedCharChunks* linkedChunks = addParamCharChunks(FSTR("GPIOS")); for (uint32_t i = 0; i != 16; ++i) { if (i != 1 && i != 3 && (i < 6 || i > 11)) { bool configured, isOutput, pullUp, value; ConfigurationManager::getGPIOParams(i, &configured, &isOutput, &pullUp, &value); linkedChunks->addChunk(f_printf(FSTR("<tr> <td>%d</td> <td><form method='POST'>"), i), true); linkedChunks->addChunk(f_printf(FSTR("Enabled <input type='checkbox' name='configured' value='1' onclick=\"document.getElementById('GPIO%d').disabled=!this.checked\" %s>"), i, configured? STR_checked:STR_), true); linkedChunks->addChunk(f_printf(FSTR("<fieldset class='inline' id='GPIO%d' %s>"), i, configured? STR_:STR_disabled), true); linkedChunks->addChunk(f_printf(FSTR("<select name='mode'><option value='in' %s>IN</option><option value='out' %s>OUT</option></select>"), isOutput? STR_:STR_selected, isOutput? STR_selected:STR_), true); linkedChunks->addChunk(f_printf(FSTR(" PullUp <input type='checkbox' name='pullup' value='1' %s> </fieldset>"), pullUp? STR_checked:STR_), true); linkedChunks->addChunk(f_printf(FSTR("<input type='hidden' name='GPIO' value='%d'>"), i), true); linkedChunks->addChunk(FSTR("<input type='submit' value='Save'></form></td>")); if (configured) { if (isOutput) { linkedChunks->addChunk(f_printf(FSTR("<td><a href='confgpio?gpio=%d&val=%d&store=1' class='link_button2'>%s</a></td> </tr>"), i, !value, value? STR_HI:STR_LO), true); } else { linkedChunks->addChunk(f_printf(FSTR("<td>%s</td> </tr>"), GPIO(i).read()? STR_HI:STR_LO), true); } } else { linkedChunks->addChunk(FSTR("<td></td></tr>")); } } } HTTPTemplateResponse::flush(); }