提交 20efbc6a4515519bc8a629f829de074e1c1475b4

作者 LJH 李佳桓
1 个父辈 5536a3ea

add

正在显示 1 个修改的文件 包含 267 行增加0 行删除
  1 +/*
  2 + * Copyright 2007 Stephen Liu
  3 + * For license terms, see the file COPYING along with this library.
  4 + */
  5 +
  6 +#include <stdio.h>
  7 +#include <time.h>
  8 +#include <string.h>
  9 +
  10 +#include "spthread.hpp"
  11 +
  12 +#include "sphttp.hpp"
  13 +#include "sphttpmsg.hpp"
  14 +#include "spbuffer.hpp"
  15 +#include "sprequest.hpp"
  16 +#include "spresponse.hpp"
  17 +#include "spmsgblock.hpp"
  18 +
  19 +SP_HttpHandler :: ~SP_HttpHandler()
  20 +{
  21 +}
  22 +
  23 +void SP_HttpHandler :: error()
  24 +{
  25 +}
  26 +
  27 +void SP_HttpHandler :: timeout()
  28 +{
  29 +}
  30 +
  31 +//---------------------------------------------------------
  32 +
  33 +SP_HttpHandlerFactory :: ~SP_HttpHandlerFactory()
  34 +{
  35 +}
  36 +
  37 +//---------------------------------------------------------
  38 +
  39 +class SP_HttpRequestDecoder : public SP_MsgDecoder {
  40 +public:
  41 + SP_HttpRequestDecoder();
  42 +
  43 + virtual ~SP_HttpRequestDecoder();
  44 +
  45 + virtual int decode( SP_Buffer * inBuffer );
  46 +
  47 + SP_HttpRequest * getMsg();
  48 +
  49 +private:
  50 + SP_HttpMsgParser * mParser;
  51 +};
  52 +
  53 +SP_HttpRequestDecoder :: SP_HttpRequestDecoder()
  54 +{
  55 + mParser = new SP_HttpMsgParser();
  56 +}
  57 +
  58 +SP_HttpRequestDecoder :: ~SP_HttpRequestDecoder()
  59 +{
  60 + delete mParser;
  61 +}
  62 +
  63 +int SP_HttpRequestDecoder :: decode( SP_Buffer * inBuffer )
  64 +{
  65 + if( inBuffer->getSize() > 0 ) {
  66 + int len = mParser->append( inBuffer->getBuffer(), inBuffer->getSize() );
  67 +
  68 + inBuffer->erase( len );
  69 +
  70 + return mParser->isCompleted() ? eOK : eMoreData;
  71 + } else {
  72 + return eMoreData;
  73 + }
  74 +}
  75 +
  76 +SP_HttpRequest * SP_HttpRequestDecoder :: getMsg()
  77 +{
  78 + return mParser->getRequest();
  79 +}
  80 +
  81 +//---------------------------------------------------------
  82 +
  83 +class SP_HttpResponseMsgBlock : public SP_MsgBlock {
  84 +public:
  85 + SP_HttpResponseMsgBlock( SP_HttpResponse * response );
  86 + virtual ~SP_HttpResponseMsgBlock();
  87 +
  88 + virtual const void * getData() const;
  89 + virtual size_t getSize() const;
  90 +
  91 +private:
  92 + SP_HttpResponse * mResponse;
  93 +};
  94 +
  95 +
  96 +SP_HttpResponseMsgBlock :: SP_HttpResponseMsgBlock( SP_HttpResponse * response )
  97 +{
  98 + mResponse = response;
  99 +}
  100 +
  101 +SP_HttpResponseMsgBlock :: ~SP_HttpResponseMsgBlock()
  102 +{
  103 + if( NULL != mResponse ) delete mResponse;
  104 + mResponse = NULL;
  105 +}
  106 +
  107 +const void * SP_HttpResponseMsgBlock :: getData() const
  108 +{
  109 + return mResponse->getContent();
  110 +}
  111 +
  112 +size_t SP_HttpResponseMsgBlock :: getSize() const
  113 +{
  114 + return mResponse->getContentLength();
  115 +}
  116 +
  117 +//---------------------------------------------------------
  118 +
  119 +class SP_HttpHandlerAdapter : public SP_Handler {
  120 +public:
  121 + SP_HttpHandlerAdapter( SP_HttpHandler * handler );
  122 +
  123 + virtual ~SP_HttpHandlerAdapter();
  124 +
  125 + // return -1 : terminate session, 0 : continue
  126 + virtual int start( SP_Request * request, SP_Response * response );
  127 +
  128 + // return -1 : terminate session, 0 : continue
  129 + virtual int handle( SP_Request * request, SP_Response * response );
  130 +
  131 + virtual void error( SP_Response * response );
  132 +
  133 + virtual void timeout( SP_Response * response );
  134 +
  135 + virtual void close();
  136 +
  137 +private:
  138 + SP_HttpHandler * mHandler;
  139 +};
  140 +
  141 +SP_HttpHandlerAdapter :: SP_HttpHandlerAdapter( SP_HttpHandler * handler )
  142 +{
  143 + mHandler = handler;
  144 +}
  145 +
  146 +SP_HttpHandlerAdapter :: ~SP_HttpHandlerAdapter()
  147 +{
  148 + delete mHandler;
  149 +}
  150 +
  151 +int SP_HttpHandlerAdapter :: start( SP_Request * request, SP_Response * response )
  152 +{
  153 + request->setMsgDecoder( new SP_HttpRequestDecoder() );
  154 +
  155 + return 0;
  156 +}
  157 +
  158 +int SP_HttpHandlerAdapter :: handle( SP_Request * request, SP_Response * response )
  159 +{
  160 + SP_HttpRequestDecoder * decoder = ( SP_HttpRequestDecoder * ) request->getMsgDecoder();
  161 + SP_HttpRequest * httpRequest = ( SP_HttpRequest * ) decoder->getMsg();
  162 +
  163 + httpRequest->setClinetIP( request->getClientIP() );
  164 +
  165 + SP_HttpResponse * httpResponse = new SP_HttpResponse();
  166 + httpResponse->setVersion( httpRequest->getVersion() );
  167 +
  168 + mHandler->handle( httpRequest, httpResponse );
  169 +
  170 + SP_Buffer * reply = response->getReply()->getMsg();
  171 +
  172 + char buffer[ 512 ] = { 0 };
  173 + snprintf( buffer, sizeof( buffer ), "%s %i %s\r\n", httpResponse->getVersion(),
  174 + httpResponse->getStatusCode(), httpResponse->getReasonPhrase() );
  175 + reply->append( buffer );
  176 +
  177 + // check keep alive header
  178 + if( httpRequest->isKeepAlive() ) {
  179 + if( NULL == httpResponse->getHeaderValue( SP_HttpMessage::HEADER_CONNECTION ) ) {
  180 + httpResponse->addHeader( SP_HttpMessage::HEADER_CONNECTION, "Keep-Alive" );
  181 + }
  182 + }
  183 +
  184 + if( 0 != strcasecmp( httpRequest->getMethod(), "head" ) ) {
  185 + // check Content-Length header
  186 + httpResponse->removeHeader( SP_HttpMessage::HEADER_CONTENT_LENGTH );
  187 + if( httpResponse->getContentLength() >= 0 ) {
  188 + snprintf( buffer, sizeof( buffer ), "%d", httpResponse->getContentLength() );
  189 + httpResponse->addHeader( SP_HttpMessage::HEADER_CONTENT_LENGTH, buffer );
  190 + }
  191 + }
  192 +
  193 + // check date header
  194 + httpResponse->removeHeader( SP_HttpMessage::HEADER_DATE );
  195 + time_t tTime = time( NULL );
  196 + struct tm tmTime;
  197 + gmtime_r( &tTime, &tmTime );
  198 + strftime( buffer, sizeof( buffer ), "%a, %d %b %Y %H:%M:%S %Z", &tmTime );
  199 + httpResponse->addHeader( SP_HttpMessage::HEADER_DATE, buffer );
  200 +
  201 + // check Content-Type header
  202 + if( NULL == httpResponse->getHeaderValue( SP_HttpMessage::HEADER_CONTENT_TYPE ) ) {
  203 + httpResponse->addHeader( SP_HttpMessage::HEADER_CONTENT_TYPE,
  204 + "text/html; charset=ISO-8859-1" );
  205 + }
  206 +
  207 + // check Server header
  208 + httpResponse->removeHeader( SP_HttpMessage::HEADER_SERVER );
  209 + httpResponse->addHeader( SP_HttpMessage::HEADER_SERVER, "sphttp/spserver" );
  210 +
  211 + for( int i = 0; i < httpResponse->getHeaderCount(); i++ ) {
  212 + snprintf( buffer, sizeof( buffer ), "%s: %s\r\n",
  213 + httpResponse->getHeaderName( i ), httpResponse->getHeaderValue( i ) );
  214 + reply->append( buffer );
  215 + }
  216 +
  217 + reply->append( "\r\n" );
  218 +
  219 + char keepAlive[ 32 ] = { 0 };
  220 + if( NULL != httpResponse->getHeaderValue( SP_HttpMessage::HEADER_CONNECTION ) ) {
  221 + strncpy( keepAlive, httpResponse->getHeaderValue(
  222 + SP_HttpMessage::HEADER_CONNECTION ), sizeof( keepAlive ) - 1 );
  223 + }
  224 +
  225 + if( NULL != httpResponse->getContent() ) {
  226 + response->getReply()->getFollowBlockList()->append(
  227 + new SP_HttpResponseMsgBlock( httpResponse ) );
  228 + } else {
  229 + delete httpResponse;
  230 + }
  231 +
  232 + request->setMsgDecoder( new SP_HttpRequestDecoder() );
  233 +
  234 + return 0 == strcasecmp( keepAlive, "Keep-Alive" ) ? 0 : -1;
  235 +}
  236 +
  237 +void SP_HttpHandlerAdapter :: error( SP_Response * response )
  238 +{
  239 + mHandler->error();
  240 +}
  241 +
  242 +void SP_HttpHandlerAdapter :: timeout( SP_Response * response )
  243 +{
  244 + mHandler->timeout();
  245 +}
  246 +
  247 +void SP_HttpHandlerAdapter :: close()
  248 +{
  249 +}
  250 +
  251 +//---------------------------------------------------------
  252 +
  253 +SP_HttpHandlerAdapterFactory :: SP_HttpHandlerAdapterFactory( SP_HttpHandlerFactory * factory )
  254 +{
  255 + mFactory = factory;
  256 +}
  257 +
  258 +SP_HttpHandlerAdapterFactory :: ~SP_HttpHandlerAdapterFactory()
  259 +{
  260 + delete mFactory;
  261 +}
  262 +
  263 +SP_Handler * SP_HttpHandlerAdapterFactory :: create() const
  264 +{
  265 + return new SP_HttpHandlerAdapter( mFactory->create() );
  266 +}
  267 +
注册登录 后发表评论