Commit 280aae80 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

case-insensitive headers

parent 605f0ea2
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -60,6 +60,11 @@ void HTTPInputStream::readHeaders(

    while (state_ == HTTP_STATE_HKEY) {
      readNextByte(&target->back().first);
      std::transform(
          target->back().first.begin(),
          target->back().first.end(),
          target->back().first.begin(),
          ::tolower);
    }

    while (state_ == HTTP_STATE_HVAL) {
+12 −4
Original line number Diff line number Diff line
@@ -33,8 +33,11 @@ const std::vector<std::pair<std::string, std::string>>&
}

const std::string& HTTPMessage::getHeader(const std::string& key) const {
  auto key_low = key;
  std::transform(key_low.begin(), key_low.end(), key_low.begin(), ::tolower);

  for (const auto& header : headers_) {
    if (header.first == key) {
    if (header.first == key_low) {
      return header.second;
    }
  }
@@ -43,18 +46,23 @@ const std::string& HTTPMessage::getHeader(const std::string& key) const {
}

void HTTPMessage::addHeader(const std::string& key, const std::string& value) {
  headers_.emplace_back(key, value);
  auto key_low = key;
  std::transform(key_low.begin(), key_low.end(), key_low.begin(), ::tolower);
  headers_.emplace_back(key_low, value);
}

void HTTPMessage::setHeader(const std::string& key, const std::string& value) {
  auto key_low = key;
  std::transform(key_low.begin(), key_low.end(), key_low.begin(), ::tolower);

  for (auto& header : headers_) {
    if (header.first == key) {
    if (header.first == key_low) {
      header.second = value;
      return;
    }
  }

  headers_.emplace_back(key, value);
  headers_.emplace_back(key_low, value);
}

const std::string& HTTPMessage::getBody() const {
+6 −1
Original line number Diff line number Diff line
@@ -45,12 +45,17 @@ void HTTPServer::listen(int port) {
    RAISE(kIOError, "create socket() failed");
  }

  int opt = 1;
  if (setsockopt(ssock_, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
    RAISE_ERRNO(kIOError, "setsockopt(SO_REUSEADDR) failed");
    return;
  }

  struct sockaddr_in addr;
  memset((char *) &addr, 0, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = htonl(INADDR_ANY);
  addr.sin_port = htons(port);

  if (::bind(ssock_, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
    RAISE_ERRNO(kIOError, "bind() failed");
  }
+6 −1
Original line number Diff line number Diff line
@@ -43,12 +43,17 @@ void UDPServer::listen(int port) {
    RAISE(kIOError, "create socket() failed");
  }

  int opt = 1;
  if (setsockopt(ssock_, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
    RAISE_ERRNO(kIOError, "setsockopt(SO_REUSEADDR) failed");
    return;
  }

  struct sockaddr_in addr;
  memset((char *) &addr, 0, sizeof(addr));
  addr.sin_family = AF_INET;
  addr.sin_addr.s_addr = htonl(INADDR_ANY);
  addr.sin_port = htons(port);

  if (bind(ssock_, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
    RAISE_ERRNO(kIOError, "bind() failed");
  }
+0 −1
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@

[ release ]
    - svg: escape series names, labels!
    - inline libev
    - ruby client
    - javascript client + doc