diff options
Diffstat (limited to 'apps/JAWS/PROTOTYPE/HTTPU/http_base.cpp')
-rw-r--r-- | apps/JAWS/PROTOTYPE/HTTPU/http_base.cpp | 323 |
1 files changed, 0 insertions, 323 deletions
diff --git a/apps/JAWS/PROTOTYPE/HTTPU/http_base.cpp b/apps/JAWS/PROTOTYPE/HTTPU/http_base.cpp deleted file mode 100644 index 3a653e5feef..00000000000 --- a/apps/JAWS/PROTOTYPE/HTTPU/http_base.cpp +++ /dev/null @@ -1,323 +0,0 @@ -// $Id$ - -#include "JAWS/Parse_Headers.h" -#include "HTTPU/http_base.h" -#include "HTTPU/http_headers.h" - -int -HTTP_Base::receive (ACE_Message_Block &mb) -{ - if (this->line () == 0) - { - if (this->extract_line (mb) == 0) - return 0; - if (this->status () != STATUS_OK) - return 1; - - // Call into the receive hook. - this->parse_line (); - if (this->status_ == STATUS_INTERNAL_SERVER_ERROR || this->no_headers_) - return 1; - } - - // Parse headers - JAWS_Parse_Headers *parser = JAWS_Parse_Headers_Singleton::instance (); - int ret = parser->parse_headers (&(this->info_), mb); - - switch (this->info_.status ()) - { - case JAWS_Header_Info::OK: - break; - - case JAWS_Header_Info::NO_MEMORY: - case JAWS_Header_Info::TOO_LONG: - default: - this->status_ = STATUS_INTERNAL_SERVER_ERROR; - break; - } - - return ret; -} - -int -HTTP_Base::deliver (ACE_Message_Block &mb) -{ - JAWS_Header_Data *data = 0; - - // Deliver this outgoing request. - // We do this by building the request up and writing it into the - // message block. - if (this->mb_ == 0) - { - // Make our Message Block big enough to hold a header name and - // header value - this->mb_ = new ACE_Message_Block (16384); // MAGIC! 2 x 8192 - if (this->mb_ == 0) - { - this->status_ = STATUS_INTERNAL_SERVER_ERROR; - return -1; - } - - // Call into the deliver hook - int r = this->espouse_line (); - if (r == -1) - return -1; - - if (r == 1) - this->deliver_state_ = 2; - - this->iter_.first (); - } - - while (this->deliver_state_ < 3) - { - // Deliver whatever is currently held in this->mb_. - size_t sz = (mb.space () < this->mb_->length () - ? mb.space () - : this->mb_->length ()); - - if (sz > 0) - { - mb.copy (this->mb_->rd_ptr (), sz); - this->mb_->rd_ptr (sz); - } - - if (mb.space () == 0) - return 0; - - // Arriving here means this->mb_ has been emptied. - this->mb_->crunch (); - - switch (this->deliver_state_) - { - case 0: // Obtain the next header data // Deliver a header name - this->deliver_state_ = this->deliver_header_name (data); - break; - - case 1: // Deliver a header value - this->deliver_state_ = this->deliver_header_value (data); - break; - - case 2: // Finished! - delete this->mb_; - this->mb_ = 0; - this->deliver_state_ = 3; - } - } - - return 1; -} - -int -HTTP_Base::receive_payload (ACE_Message_Block &mb) -{ - int result = 0; - - if (this->payload_.space () < mb.length ()) - result = this->payload_.size (this->payload_.size () + - mb.length () - this->payload_.space ()); - - if (result == 0) - { - this->payload_.copy (mb.rd_ptr (), mb.length ()); - mb.rd_ptr (mb.wr_ptr ()); - mb.crunch (); - } - else - this->status_ = STATUS_INTERNAL_SERVER_ERROR; - - return result; -} - -int -HTTP_Base::receive_payload (ACE_Message_Block &mb, long length) -{ - int result = 0; - - if (length == -1) - return this->receive_payload (mb); - - if (this->payload_.size () < (unsigned long) length) - result = this->payload_.size (length); - - if (result == -1) - { - this->status_ = STATUS_INTERNAL_SERVER_ERROR; - return -1; - } - - if (this->payload_.space () >= mb.length ()) - { - this->payload_.copy (mb.rd_ptr (), mb.length ()); - mb.rd_ptr (mb.wr_ptr ()); - mb.crunch (); - } - else - { - size_t space = this->payload_.space (); - this->payload_.copy (mb.rd_ptr (), space); - mb.rd_ptr (space); - } - - return this->payload_.length () == (unsigned long) length; -} - -const char * -HTTP_Base::payload (void) -{ - return this->payload_.rd_ptr (); -} - -unsigned long -HTTP_Base::payload_size (void) -{ - return this->payload_.length (); -} - -int -HTTP_Base::build_headers (JAWS_Headers *new_headers) -{ - JAWS_Header_Data *data = 0; - JAWS_Header_Data *data2 = 0; - JAWS_Header_Table_Iterator iter (*new_headers); - - iter.first (); - while (! iter.done ()) - { - data = iter.next (); - if (data == 0) - { - iter.advance (); - continue; - } - - if (data->header_type () == HTTP_HCodes::REPLACE_HEADER) - this->headers ()->remove_all (data->header_name ()); - else if (data->header_type () == HTTP_HCodes::INSERT_HEADER - || data->header_type () == HTTP_HCodes::APPENDTO_HEADER) - { - data2 = this->headers ()->find (data->header_name ()); - if (data2 != 0) - { - if (data->header_type () == HTTP_HCodes::APPENDTO_HEADER) - { - // Append to existing header - size_t len - = ACE_OS::strlen (data->header_value ()) - + ACE_OS::strlen (data2->header_value ()) - + 3; /* for comma, space, and nul */ - char *buf = new char [len]; - if (buf == 0) - { - this->status_ = STATUS_INTERNAL_SERVER_ERROR; - return -1; - } - ACE_OS::sprintf (buf, "%s, %s", - data2->header_value (), - data->header_value ()); - data2->header_value (buf); - delete [] buf; - } - - // Only insert if it isn't already present - iter.advance (); - continue; - } - } - - data2 = new JAWS_Header_Data (data->header_name (), - data->header_value ()); - if (data2 == 0 || data2->header_name () == 0 - || data2->header_value () == 0) - { - this->status_ = STATUS_INTERNAL_SERVER_ERROR; - return -1; - } - this->headers ()->insert (data2); - - iter.advance (); - } - - return 0; -} - -int -HTTP_Base::deliver_header_name (JAWS_Header_Data *&data) -{ - data = 0; - - for (;;) - { - if ((data = this->iter_.next ()) == 0) - { - // No more headers, deliver final "\r\n" - this->mb_->copy ("\r\n", 2); - return 2; - } - - if (data->header_name ()) - break; - - this->iter_.advance (); - } - - // Assume the following lines will always succeed. - this->mb_->copy (data->header_name ()); - this->mb_->wr_ptr (this->mb_->wr_ptr () - 1); - this->mb_->copy (": ", 2); - - return 1; -} - -int -HTTP_Base::deliver_header_value (JAWS_Header_Data *&data) -{ - // Assume the following line will always succeed. - if (data->header_value ()) - { - this->mb_->copy (data->header_value ()); - this->mb_->wr_ptr (this->mb_->wr_ptr () - 1); - } - this->mb_->copy ("\r\n", 2); - - this->iter_.advance (); - return 0; -} - - -int -HTTP_Base::extract_line (ACE_Message_Block &mb) -{ - JAWS_Parse_Headers *parser = JAWS_Parse_Headers_Singleton::instance (); - char *p = parser->skipset ("\n", mb.rd_ptr (), mb.wr_ptr ()); - if (p == mb.wr_ptr ()) - return 0; - - this->status_ = STATUS_OK; - - *p = '\0'; - if (p[-1] == '\r') - p[-1] = '\0'; - - this->line_ = ACE_OS::strdup (mb.rd_ptr ()); - if (this->line_ == 0) - this->status_ = STATUS_INTERNAL_SERVER_ERROR; - - mb.rd_ptr (p+1); - this->info_.end_of_line (1); - return 1; -} - -void -HTTP_Base::dump (void) -{ - ACE_DEBUG ((LM_DEBUG, "%s\n", this->line ())); - this->info_.dump (); - ACE_DEBUG ((LM_DEBUG, "STATUS IS %d %s\n", - this->status (), - (*HTTP_SCode::instance ())[this->status ()])); -} - -#if !defined (ACE_HAS_INLINED_OSCALLS) -# include "HTTPU/http_base.i" -# endif /* ACE_HAS_INLINED_OSCALLS */ |