123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- // Licensed to the Apache Software Foundation (ASF) under one
- // or more contributor license agreements. See the NOTICE file
- // distributed with this work for additional information
- // regarding copyright ownership. The ASF licenses this file
- // to you under the Apache License, Version 2.0 (the
- // "License"); you may not use this file except in compliance
- // with the License. You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing,
- // software distributed under the License is distributed on an
- // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- // KIND, either express or implied. See the License for the
- // specific language governing permissions and limitations
- // under the License.
- #include <gtest/gtest.h>
- #include <iostream>
- #include "butil/time.h"
- #include "butil/logging.h"
- #include "brpc/details/http_parser.h"
- #include "brpc/builtin/common.h" // AppendFileName
- using brpc::http_parser;
- using brpc::http_parser_init;
- using brpc::http_parser_settings;
- class HttpParserTest : public testing::Test {
- protected:
- void SetUp() {}
- void TearDown() {}
- };
- TEST_F(HttpParserTest, init_perf) {
- const size_t loops = 10000000;
- butil::Timer timer;
- timer.start();
- for (size_t i = 0; i < loops; ++i) {
- http_parser parser;
- http_parser_init(&parser, brpc::HTTP_REQUEST);
- }
- timer.stop();
- std::cout << "It takes " << timer.n_elapsed() / loops
- << "ns to init a http_parser"
- << std::endl;
- }
- int on_message_begin(http_parser *) {
- LOG(INFO) << "Start parsing message";
- return 0;
- }
- int on_url(http_parser *, const char *at, const size_t length) {
- LOG(INFO) << "Get url " << std::string(at, length);
- return 0;
- }
- int on_headers_complete(http_parser *) {
- LOG(INFO) << "Header complete";
- return 0;
- }
- int on_message_complete(http_parser *) {
- LOG(INFO) << "Message complete";
- return 0;
- }
- int on_header_field(http_parser *, const char *at, const size_t length) {
- LOG(INFO) << "Get header field " << std::string(at, length);
- return 0;
- }
- int on_header_value(http_parser *, const char *at, const size_t length) {
- LOG(INFO) << "Get header value " << std::string(at, length);
- return 0;
- }
- int on_body(http_parser *, const char *at, const size_t length) {
- LOG(INFO) << "Get body " << std::string(at, length);
- return 0;
- }
- TEST_F(HttpParserTest, http_example) {
- const char *http_request =
- "GET /path/file.html?sdfsdf=sdfs HTTP/1.0\r\n"
- "From: someuser@jmarshall.com\r\n"
- "User-Agent: HTTPTool/1.0\r\n"
- "Content-Type: json\r\n"
- "Content-Length: 19\r\n"
- "Host: sdlfjslfd\r\n"
- "Accept: */*\r\n"
- "\r\n"
- "Message Body sdfsdf\r\n"
- ;
- std::cout << http_request << std::endl;
- http_parser parser;
- http_parser_init(&parser, brpc::HTTP_REQUEST);
- http_parser_settings settings;
- memset(&settings, 0, sizeof(settings));
- settings.on_message_begin = on_message_begin;
- settings.on_url = on_url;
- settings.on_headers_complete = on_headers_complete;
- settings.on_message_complete = on_message_complete;
- settings.on_header_field = on_header_field;
- settings.on_header_value = on_header_value;
- settings.on_body = on_body;
- LOG(INFO) << http_parser_execute(&parser, &settings, http_request, strlen(http_request));
- }
- TEST_F(HttpParserTest, append_filename) {
- std::string dir;
- dir = "/home/someone/.bsvn/..";
- brpc::AppendFileName(&dir, "..");
- ASSERT_EQ("/home", dir);
- dir = "/home/someone/.bsvn/../";
- brpc::AppendFileName(&dir, "..");
- ASSERT_EQ("/home", dir);
- dir = "/home/someone/./..";
- brpc::AppendFileName(&dir, "..");
- ASSERT_EQ("/", dir);
-
- dir = "/home/someone/./../";
- brpc::AppendFileName(&dir, "..");
- ASSERT_EQ("/", dir);
- dir = "/foo/bar";
- brpc::AppendFileName(&dir, "..");
- ASSERT_EQ("/foo", dir);
- dir = "/foo/bar/";
- brpc::AppendFileName(&dir, "..");
- ASSERT_EQ("/foo", dir);
- dir = "/foo";
- brpc::AppendFileName(&dir, ".");
- ASSERT_EQ("/foo", dir);
- dir = "/foo/";
- brpc::AppendFileName(&dir, ".");
- ASSERT_EQ("/foo/", dir);
- dir = "foo";
- brpc::AppendFileName(&dir, "..");
- ASSERT_EQ("", dir);
- dir = "foo/";
- brpc::AppendFileName(&dir, "..");
- ASSERT_EQ("", dir);
- dir = "foo/..";
- brpc::AppendFileName(&dir, "..");
- ASSERT_EQ("..", dir);
- dir = "foo/../";
- brpc::AppendFileName(&dir, "..");
- ASSERT_EQ("..", dir);
-
- dir = "/foo";
- brpc::AppendFileName(&dir, "..");
- ASSERT_EQ("/", dir);
- dir = "/foo/";
- brpc::AppendFileName(&dir, "..");
- ASSERT_EQ("/", dir);
- }
|