blob: e5e3059987de3d90ffa9eb3a8c8399def788c615 [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:
****************************************************************************/
#ifndef _HTTP_SERVER_SESSION_H_
#define _HTTP_SERVER_SESSION_H_
/* 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"
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(NULL),
hostname_hash(),
host_hash_computed(false), con_id(0), transact_count(0),
state(HSS_INIT), to_parent_proxy(false), server_trans_stat(0),
private_session(false), share_session(0),
enable_origin_connection_limiting(false),
connection_count(NULL), read_buffer(NULL),
server_vc(NULL), magic(HTTP_SS_MAGIC_DEAD), buf_reader(NULL)
{
ink_zero(server_ip);
}
void destroy();
void new_connection(NetVConnection *new_vc);
void reset_read_buffer(void)
{
ink_assert(read_buffer->_writer);
ink_assert(buf_reader != NULL);
read_buffer->dealloc_all_readers();
read_buffer->_writer = NULL;
buf_reader = read_buffer->alloc_reader();
}
IOBufferReader *get_reader()
{
return buf_reader;
};
virtual VIO *do_io_read(Continuation *c, int64_t nbytes = INT64_MAX, MIOBuffer *buf = 0);
virtual VIO *do_io_write(Continuation *c = NULL, int64_t nbytes = INT64_MAX, IOBufferReader *buf = 0, bool owner = false);
virtual void do_io_close(int lerrno = -1);
virtual void do_io_shutdown(ShutdownHowTo_t howto);
virtual void reenable(VIO *vio);
void release();
void attach_hostname(const char *hostname);
NetVConnection *get_netvc()
{
return server_vc;
};
// Keys for matching hostnames
IpEndpoint server_ip;
INK_MD5 hostname_hash;
bool host_hash_computed;
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 authenication headers
// are sent over them
bool private_session;
// Copy of the owning SM's share_server_session setting
int share_session;
LINK(HttpServerSession, lru_link);
LINK(HttpServerSession, 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;
private:
HttpServerSession(HttpServerSession &);
NetVConnection *server_vc;
int magic;
IOBufferReader *buf_reader;
};
extern ClassAllocator<HttpServerSession> httpServerSessionAllocator;
inline void
HttpServerSession::attach_hostname(const char *hostname)
{
if (!host_hash_computed) {
ink_code_md5((unsigned char *) hostname, strlen(hostname), (unsigned char *) &hostname_hash);
host_hash_computed = true;
}
}
#endif