blob: b3a134e8587817e0873b9a9a0b5933c620d263a7 [file] [log] [blame]
/** @file
A brief file description
@section license License
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.
*/
/****************************************************************************
HttpServerSession.h
Description:
****************************************************************************/
#pragma once
/* Enable LAZY_BUF_ALLOC to delay allocation of buffers until they
* are actually required.
* Enabling LAZY_BUF_ALLOC, stop Http code from allocation space
* for header buffer and tunnel buffer. The allocation is done by
* the net code in read_from_net when data is actually written into
* the buffer. By allocating memory only when it is required we can
* reduce the memory consumed by TS process.
*
* IMPORTANT NOTE: enable/disable LAZY_BUF_ALLOC in HttpSM.h as well.
*/
#define LAZY_BUF_ALLOC
#include "P_Net.h"
#include "HttpConnectionCount.h"
#include "HttpProxyAPIEnums.h"
class HttpSM;
class MIOBuffer;
class IOBufferReader;
enum HSS_State {
HSS_INIT,
HSS_ACTIVE,
HSS_KA_CLIENT_SLAVE,
HSS_KA_SHARED,
};
enum {
HTTP_SS_MAGIC_ALIVE = 0x0123FEED,
HTTP_SS_MAGIC_DEAD = 0xDEADFEED,
};
class HttpServerSession : public VConnection
{
public:
HttpServerSession()
: VConnection(nullptr),
hostname_hash(),
con_id(0),
transact_count(0),
state(HSS_INIT),
to_parent_proxy(false),
server_trans_stat(0),
private_session(false),
sharing_match(TS_SERVER_SESSION_SHARING_MATCH_BOTH),
sharing_pool(TS_SERVER_SESSION_SHARING_POOL_GLOBAL),
enable_origin_connection_limiting(false),
connection_count(nullptr),
read_buffer(nullptr),
server_vc(nullptr),
magic(HTTP_SS_MAGIC_DEAD),
buf_reader(nullptr)
{
}
void destroy();
void new_connection(NetVConnection *new_vc);
void
reset_read_buffer(void)
{
ink_assert(read_buffer->_writer);
ink_assert(buf_reader != nullptr);
read_buffer->dealloc_all_readers();
read_buffer->_writer = nullptr;
buf_reader = read_buffer->alloc_reader();
}
IOBufferReader *
get_reader()
{
return buf_reader;
};
VIO *do_io_read(Continuation *c, int64_t nbytes = INT64_MAX, MIOBuffer *buf = nullptr) override;
VIO *do_io_write(Continuation *c = nullptr, int64_t nbytes = INT64_MAX, IOBufferReader *buf = nullptr,
bool owner = false) override;
void do_io_close(int lerrno = -1) override;
void do_io_shutdown(ShutdownHowTo_t howto) override;
void reenable(VIO *vio) override;
void release();
void attach_hostname(const char *hostname);
NetVConnection *
get_netvc() const
{
return server_vc;
};
void
set_netvc(NetVConnection *new_vc)
{
server_vc = new_vc;
}
// Keys for matching hostnames
IpEndpoint const &
get_server_ip() const
{
ink_release_assert(server_vc != nullptr);
return server_vc->get_remote_endpoint();
}
CryptoHash hostname_hash;
int64_t con_id;
int transact_count;
HSS_State state;
// Used to determine whether the session is for parent proxy
// it is session to orgin server
// We need to determine whether a closed connection was to
// close parent proxy to update the
// proxy.process.http.current_parent_proxy_connections
bool to_parent_proxy;
// Used to verify we are recording the server
// transaction stat properly
int server_trans_stat;
// Sessions become if authentication headers
// are sent over them
bool private_session;
// Copy of the owning SM's server session sharing settings
TSServerSessionSharingMatchType sharing_match;
TSServerSessionSharingPoolType sharing_pool;
// int share_session;
LINK(HttpServerSession, ip_hash_link);
LINK(HttpServerSession, host_hash_link);
// Keep track of connection limiting and a pointer to the
// singleton that keeps track of the connection counts.
bool enable_origin_connection_limiting;
ConnectionCount *connection_count;
// The ServerSession owns the following buffer which use
// for parsing the headers. The server session needs to
// own the buffer so we can go from a keep-alive state
// to being acquired and parsing the header without
// changing the buffer we are doing I/O on. We can
// not change the buffer for I/O without issuing a
// an asyncronous cancel on NT
MIOBuffer *read_buffer;
virtual int
populate_protocol(std::string_view *result, int size) const
{
auto vc = this->get_netvc();
return vc ? vc->populate_protocol(result, size) : 0;
}
virtual const char *
protocol_contains(std::string_view tag_prefix) const
{
auto vc = this->get_netvc();
return vc ? vc->protocol_contains(tag_prefix) : nullptr;
}
private:
HttpServerSession(HttpServerSession &);
NetVConnection *server_vc;
int magic;
IOBufferReader *buf_reader;
};
extern ClassAllocator<HttpServerSession> httpServerSessionAllocator;
inline void
HttpServerSession::attach_hostname(const char *hostname)
{
if (CRYPTO_HASH_ZERO == hostname_hash) {
CryptoContext().hash_immediate(hostname_hash, (unsigned char *)hostname, strlen(hostname));
}
}