⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htbp_inside_squid_filter.cpp

📁 ACE自适配通信环境(ADAPTIVE Communication Environment)是可以自由使用、开放源码的面向对象(OO)框架(Framework)
💻 CPP
字号:
// ACE_HTBP_Filter.cpp// HTBP_Inside_Squid_Filter.cpp,v 1.3 2005/11/27 12:11:35 ossama Exp#include "ace/Log_Msg.h"//#include <sstream>#include "HTBP_Session.h"#include "HTBP_Inside_Squid_Filter.h"#if !defined (__ACE_INLINE__)#include "HTBP_Inside_Squid_Filter.inl"#endifACE_RCSID(HTBP,ACE_HTBP_Inside_Squid_Filter,"HTBP_Inside_Squid_Filter.cpp,v 1.3 2005/11/27 12:11:35 ossama Exp")ACE_BEGIN_VERSIONED_NAMESPACE_DECLssize_tACE::HTBP::Inside_Squid_Filter::send_data_trailer (ACE::HTBP::Channel *ch){  ch->state(ACE::HTBP::Channel::Wait_For_Ack);  return 0;}intACE::HTBP::Inside_Squid_Filter::make_request_header (ACE::HTBP::Channel *ch,                                                     const char *cmd,                                                     char *buffer,                                                     size_t buffer_size){  // the string is formatted as:  // command  http://host:port/htid/sessionId/request<requestId>.html HTTP/1.1\n  // host:port is the remote host and port from the channel,  // htid is the local endpoint identifier  // sessionId is the discreet session counter between these peers  // requestId is the discreet request sent for this session.  ACE::HTBP::Session *session = ch->session();  const char * format = "%shttp://%s:%d/%s/%d/request%d.html HTTP/1.1\n";  char remote_host[ACE_MAX_FULLY_QUALIFIED_NAME_LEN + 1];  unsigned remote_port = session->peer_addr().get_port_number();  const char *local_htid = session->local_addr().get_htid();  ACE_UINT32 tempId = session->session_id().id_;  size_t sid_size = 1;  size_t rid_size = 1;  while (tempId /= 10) sid_size++;  tempId = ch->request_count();  while (tempId /= 10) rid_size++;  // This test was originally get_host_name() == -1, but this is   // problematic if the address doesn't resolve to a name. I think  // that it should be configurable, or maybe the hostname needs to  // be carried independent of the address to work with hosts that may  // have dynamic IP addresses. For now that isn't a problem.  if (session->peer_addr().get_host_addr(remote_host,                                         sizeof remote_host) == 0)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT("HTBP::Inside_Squid_Filter:could not get ")                       ACE_TEXT("peer_addr hostname\n")),                      -1);  size_t size =    ACE_OS::strlen(format)    - 12    // subtract out the size of the format specifiers    + ACE_OS::strlen (cmd)    + ACE_OS::strlen (remote_host)    + 5     // maximum size for a the remote port number    + ACE_OS::strlen (local_htid)    + sid_size // size of session id    + rid_size; // size of request id  if (size > buffer_size)    ACE_ERROR_RETURN ((LM_ERROR,                       ACE_TEXT("HTBP::Inside_Squid_Filter: insufficient ")                       ACE_TEXT("buffer space for request header, need %d ")                       ACE_TEXT("got %d\n"),                       size, buffer_size),                      -1);  ACE_OS::sprintf (buffer,format,                   cmd,remote_host,remote_port,                   local_htid, session->session_id().id_,                   ch->request_count());  return ACE_OS::strlen(buffer);}ssize_tACE::HTBP::Inside_Squid_Filter::send_data_header (ssize_t data_len,                                                ACE::HTBP::Channel *ch){  char *buffer = new char[BUFSIZ];  ssize_t result = -1;  if (this->make_request_header (ch,"POST ",buffer,BUFSIZ) != -1)    {      ACE_CString header (buffer);      header += "Content-Type: application/octet-stream\nContent-Length: ";      char datalenstr[20];      ACE_OS::itoa (data_len,datalenstr,10);      header += datalenstr;      header += "\n\n";      result = ch->ace_stream().send(header.c_str(),header.length());    }  ch->state(result == -1 ? ACE::HTBP::Channel::Closed :            ACE::HTBP::Channel::Header_Sent);  this->reset_http_code();  return 1;}ssize_tACE::HTBP::Inside_Squid_Filter::recv_data_header (ACE::HTBP::Channel *ch){  if (this->http_code() != 200 && this->http_code() != 0)    {      ACE_DEBUG ((LM_DEBUG,                  ACE_TEXT("Inside_Squid_Filter::recv_data_header, ")                  ACE_TEXT("non-OK result code %d recvd\n"),                  this->http_code()));      errno = ch->consume_error () ? EINVAL : EWOULDBLOCK;      return 0;    }  char *header_end = this->header_complete(ch);  if (header_end == 0)    {      if (ch->state() != ACE::HTBP::Channel::Closed)        {          ch->state (ACE::HTBP::Channel::Header_Pending);          errno = EWOULDBLOCK;        }      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT("Inside_Squid_Filter::recv_data_header, ")                         ACE_TEXT("header not complete\n")),                        0);    }  char *start = ch->leftovers().rd_ptr();  ACE_CString token = "Content-Length: ";  char *tpos = ACE_OS::strstr(start,token.c_str());  char *nl = ACE_OS::strchr (start,'\n');  if (tpos != 0)    {      tpos += token.length();      *nl = 0;      ch->data_len (strtol(tpos,0,10));      start = nl+1;    }  ch->leftovers().rd_ptr(header_end);  if (this->http_code() != 200)    {      ACE_DEBUG ((LM_DEBUG,                  ACE_TEXT("Inside_Squid_Filter::recv_data_header, ")                  ACE_TEXT("non-OK result code %d recvd\n"),                  this->http_code()));      errno = ch->consume_error () ? EINVAL : EWOULDBLOCK;      return 0;    }  ch->state(ACE::HTBP::Channel::Data_Queued);  return 1;}ssize_tACE::HTBP::Inside_Squid_Filter::recv_data_trailer (ACE::HTBP::Channel *ch){  ch->state(ACE::HTBP::Channel::Send_Ack);  return 0;}intACE::HTBP::Inside_Squid_Filter::send_ack (ACE::HTBP::Channel *ch){  char *buffer = new char[BUFSIZ];  ssize_t result = -1;  if (ch->state() == ACE::HTBP::Channel::Ack_Sent)    {      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT("Inside Filter::send_ack: ")                         ACE_TEXT("state is already ACK_SENT\n")),                        1);    }  if (this->make_request_header (ch,"GET ",buffer,BUFSIZ) != -1)    {      ACE_CString header (buffer);      header += "\n";      result = ch->ace_stream().send(header.c_str(),header.length());    }  ch->state(result == -1 ?            ACE::HTBP::Channel::Closed : ACE::HTBP::Channel::Ack_Sent);  this->reset_http_code();  return 1;}intACE::HTBP::Inside_Squid_Filter::recv_ack (ACE::HTBP::Channel *ch){  char *header_end = this->header_complete(ch);  if (header_end == 0)    {      if (ch->state() != ACE::HTBP::Channel::Closed)        errno = EWOULDBLOCK;      ACE_ERROR_RETURN ((LM_ERROR,                         ACE_TEXT("Inside_Squid_Filter::recv_data_header, ")                         ACE_TEXT("header not complete\n")),0);    }  if (this->http_code() == 200)    {      ch->leftovers().length(0);      ch->state(ACE::HTBP::Channel::Ready);      return 1;    }  char *start = ch->leftovers().rd_ptr();  ACE_CString token = "Content-Length: ";  char *tpos = ACE_OS::strstr(start,token.c_str());  char *nl = ACE_OS::strchr (start,'\n');  if (tpos != 0)    {      tpos += token.length();      *nl = 0;      ch->data_len (strtol(tpos,0,10));      start = nl+1;    }  ch->leftovers().rd_ptr(header_end);  errno = ch->consume_error () ? EINVAL : EWOULDBLOCK;  return 0;}ACE_END_VERSIONED_NAMESPACE_DECL

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -