172 lines
4.7 KiB
C++
172 lines
4.7 KiB
C++
// 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);
|
|
}
|