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);
 }
Example #6
0
 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();
 }