Ejemplo n.º 1
0
MTD_FLASHMEM bool MultipartFormDataProcessor::extractParameter(char const *name, CharChunksIterator curpos,
                                                               CharChunksIterator *nameBegin, CharChunksIterator *begin,
                                                               CharChunksIterator *end) {
  if (curpos != CharChunksIterator()) {
    *nameBegin = t_strstr(curpos, CharIterator(name));
    if (*nameBegin != CharChunksIterator()) {
      // bypass "name"
      CharChunksIterator it = *nameBegin + f_strlen(name);

      // bypass spaces and a quote
      bool hasQuote = false;
      for (; it != CharChunksIterator() && (isspace(*it) || *it == '"'); ++it)
        if (*it == '"')
          hasQuote = true;
      *begin = it;

      // look for spaces or a quote
      while (it != CharChunksIterator() && ((!hasQuote && !isspace(*it)) || (hasQuote && *it != '"')))
        ++it;
      *end = it;

      return true;
    }
  }
  return false;
}
Ejemplo n.º 2
0
void MTD_FLASHMEM HTTPHandler::dispatch() {
  for (uint32_t i = 0; i != m_routesCount; ++i) {
    if (f_strcmp(FSTR("*"), m_routes[i].page) == 0 ||
        t_strcmp(m_request.requestedPage, CharIterator(m_routes[i].page)) == 0) {
      (this->*m_routes[i].pageHandler)();
      return;
    }
  }
  // not found (routes should always have route "*" to handle 404 not found)
}
Ejemplo n.º 3
0
bool MTD_FLASHMEM HTTPHandler::processRequest() {
  // look for 0x0D 0x0A 0x0D 0x0A
  CharChunksIterator headerEnd =
      t_strstr(m_receivedData.getIterator(), CharChunksIterator(), CharIterator(FSTR("\x0D\x0A\x0D\x0A")));
  if (headerEnd.isValid()) {
    // move header end after CRLFCRLF
    headerEnd += 4;

    CharChunksIterator curc = m_receivedData.getIterator();

    // extract method (GET, POST, etc..)
    CharChunksIterator method = curc;
    while (curc != headerEnd && *curc != ' ')
      ++curc;
    *curc++ = 0; // ends method
    if (t_strcmp(method, CharIterator(FSTR("GET"))) == 0)
      m_request.method = Get;
    else if (t_strcmp(method, CharIterator(FSTR("POST"))) == 0)
      m_request.method = Post;
    else if (t_strcmp(method, CharIterator(FSTR("HEAD"))) == 0)
      m_request.method = Head;
    else
      m_request.method = Unsupported;

    // extract requested page and query parameters
    m_request.requestedPage = curc;
    while (curc != headerEnd) {
      if (*curc == '?') {
        *curc++ = 0; // ends requestedPage
        curc = extractURLEncodedFields(curc, headerEnd, &m_request.query);
        break;
      } else if (*curc == ' ') {
        *curc++ = 0; // ends requestedPage
        break;
      }
      ++curc;
    }

    // bypass HTTP version
    while (curc != headerEnd && *curc != 0x0D)
      ++curc;

    // extract headers
    curc = extractHeaders(curc, headerEnd, &m_request.headers);

    // get content length (may be NULL)
    char const *contentLengthStr = m_request.headers[STR_Content_Length];
    int32_t contentLength = contentLengthStr ? strtol(contentLengthStr, NULL, 10) : 0;

    if (m_request.method == Post) {
      // check content type (POST)
      char const *contentType = m_request.headers[STR_Content_Type];
      if (contentType && f_strstr(contentType, FSTR("multipart/form-data"))) {
        //// content type is multipart/form-data
        processMultipartFormData(headerEnd, contentLength, contentType);
      } else if (contentType == NULL ||
                 (contentType && f_strstr(contentType, FSTR("application/x-www-form-urlencoded")))) {
        //// content type is application/x-www-form-urlencoded
        processXWWWFormUrlEncoded(headerEnd, contentLength);
      }
    } else
      dispatch();

    return true;
  } else {
    // header is not complete
    return false;
  }
}
Ejemplo n.º 4
0
    void MTD_FLASHMEM DefaultHTTPHandler::dispatch()
    {
#if (FDV_INCLUDE_SERIALBINARY == 1)            
        if (ConfigurationManager::getSerialBinary() && ConfigurationManager::getSerialBinary()->isReady())
        {
            StringList* routes = ConfigurationManager::getSerialBinary()->getHTTPRoutes();
            if (routes)
            {                
                for (uint32_t i = 0; i != routes->size(); ++i)
                {
                    if (f_strcmp(FSTR("*"), routes->getItem(i)) == 0 || t_strcmp(getRequest().requestedPage, CharIterator(routes->getItem(i))) == 0)
                    {
                        ConfigurationManager::getSerialBinary()->send_CMD_HTTPREQUEST(i, this);
                        return;
                    }
                }
            }
        }
#endif            
        HTTPHandler::dispatch();
    }