blob: 4e0ddd1fb10346c406beb9e7e497896ed017e959 [file] [log] [blame]
// 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.
#pragma once
#include <stddef.h>
#include <stdint.h>
#include <ostream>
namespace doris {
struct HttpChunkParseCtx {
int state; // Parse state
size_t size; // Chunk size
size_t length; // minimal length need to read
HttpChunkParseCtx() : state(0), size(0), length(0) {}
};
std::ostream& operator<<(std::ostream& os, const HttpChunkParseCtx& ctx);
class HttpParser {
public:
enum ParseState {
PARSE_OK, // reach trunk data, you can read data
PARSE_AGAIN, // continue call this function
PARSE_DONE, // trunk is over
PARSE_ERROR, // parse failed.
};
// Used to parse http Chunked Transfer Coding(rfc2616 3.6.1)
// Params:
// buf network buffer's pointer, changed when receive data
// when this function return, *buf point to position where
// next call will begin processing
// buf_len length of receive http data
// ctx parse context, used to save parse state and data size
//
// Returns:
// PARSE_OK return this means we reach chunk-data, *buf point to begin of data
// size of chunk-data is saved in ctx->size. Caller need subtract size
// consumed from ctx->size before next call of this function.
// PARSE_AGAIN return this means that caller need to call this function with new data
// from network
// PARSE_DONE All of chunks readed
// PARSE_ERROR Error happened
static ParseState http_parse_chunked(const uint8_t** buf, const int64_t buf_len,
HttpChunkParseCtx* ctx);
};
} // namespace doris