#include <ACEXML/common/HttpCharStream.h>
Inheritance diagram for ACEXML_HttpCharStream:
Public Member Functions | |
ACEXML_HttpCharStream (void) | |
Default constructor. | |
virtual | ~ACEXML_HttpCharStream (void) |
Destructor. | |
int | open (const ACEXML_Char *url) |
Open an URL. | |
virtual int | available (void) |
virtual int | close (void) |
virtual int | get (ACEXML_Char &ch) |
virtual int | read (ACEXML_Char *str, size_t len) |
virtual int | peek (void) |
virtual void | rewind (void) |
virtual int | determine_encoding (void) |
virtual const ACEXML_Char * | getEncoding (void) |
virtual const ACEXML_Char * | getSystemId (void) |
Private Member Functions | |
int | send_request (void) |
int | get_url (size_t &len) |
Private Attributes | |
ACEXML_Char * | url_ |
ACEXML_URL_Addr * | url_addr_ |
ACEXML_Mem_Map_Stream * | stream_ |
Connector * | connector_ |
off_t | size_ |
off_t | data_offset_ |
ACEXML_Char * | encoding_ |
Definition at line 32 of file HttpCharStream.h.
|
Default constructor.
Definition at line 24 of file HttpCharStream.cpp.
00025 : url_(0), 00026 url_addr_(0), 00027 stream_(0), 00028 connector_(0), 00029 size_(0), 00030 data_offset_ (0), 00031 encoding_ (0) 00032 { 00033 00034 } |
|
Destructor.
Definition at line 36 of file HttpCharStream.cpp. References close().
00037 { 00038 this->close (); 00039 } |
|
Returns the available ACEXML_Char in the buffer. -1 if the object is not initialized properly. Implements ACEXML_CharStream. Definition at line 284 of file HttpCharStream.cpp. References ACEXML_Mem_Map_Stream::available().
|
|
Close this stream and release all resources used by it. Implements ACEXML_CharStream. Definition at line 292 of file HttpCharStream.cpp. References data_offset_, url_, and url_addr_. Referenced by ACE_TMAIN(), open(), and ~ACEXML_HttpCharStream().
00293 { 00294 delete[] this->url_; 00295 this->url_ = 0; 00296 00297 delete this->url_addr_; 00298 this->url_addr_ = 0; 00299 00300 delete this->stream_; 00301 this->stream_ = 0; 00302 00303 delete this->connector_; 00304 this->connector_ = 0; 00305 00306 this->size_ = 0; 00307 this->data_offset_ = 0; 00308 00309 delete[] this->encoding_; 00310 this->encoding_ = 0; 00311 00312 return 0; 00313 } |
|
Determine the encoding of the file. Definition at line 316 of file HttpCharStream.cpp. References ACEXML_Char, ACEXML_Mem_Map_Stream::get_char(), ACEXML_Encoding::get_encoding(), ACEXML_Mem_Map_Stream::peek_char(), and ACE::strnew(). Referenced by open(), and rewind().
00317 { 00318 if (this->stream_ == 0) 00319 return -1; 00320 00321 char input[4] = {0, 0, 0, 0}; 00322 int i = 0; 00323 for (; i < 4 && input[i] != (char)-1; ++i) 00324 input[i] = static_cast<char> (this->stream_->peek_char(i)); 00325 if (i < 4) 00326 return -1; 00327 const ACEXML_Char* temp = ACEXML_Encoding::get_encoding (input); 00328 if (!temp) 00329 return -1; 00330 else 00331 { 00332 if (this->encoding_) 00333 delete [] this->encoding_; 00334 this->encoding_ = ACE::strnew (temp); 00335 // ACE_DEBUG ((LM_DEBUG, "URI's encoding is %s\n", this->encoding_)); 00336 } 00337 // Move over the byte-order-mark if present. 00338 for (int j = 0; j < 3; ++j) 00339 { 00340 if (input[i] == '\xFF' || input[i] == '\xFE' || input[i] == '\xEF' || 00341 input[i] == '\xBB' || input[i] == '\xBF') 00342 { 00343 this->stream_->get_char(); 00344 continue; 00345 } 00346 break; 00347 } 00348 return 0; 00349 } |
|
Read the next ACEXML_Char. Return -1 if we are not able to return an ACEXML_Char, 0 if EOS is reached, or 1 if succeed. Implements ACEXML_CharStream. Definition at line 393 of file HttpCharStream.cpp. References ACEXML_Char, and ACEXML_Mem_Map_Stream::get_char(). Referenced by ACE_TMAIN().
00394 { 00395 if (this->stream_ == 0) 00396 return -1; 00397 #if defined (ACE_USES_WCHAR) 00398 return this->get_i (ch); 00399 #else 00400 ch = (ACEXML_Char) this->stream_->get_char(); 00401 return (ch == (ACEXML_Char)EOF ? -1 :0); 00402 #endif /* ACE_USES_WCHAR */ 00403 } |
|
Fetch the URL and save it in backing store. Definition at line 114 of file HttpCharStream.cpp. References ACE_ERROR_RETURN, data_offset_, HDST_BOL, HDST_CR, HDST_CRLF, HDST_CRLFCR, HDST_LF, HDST_LINE1_PROTOCOL, HDST_LINE1_STATUS, HDST_LINE1_WHITESPACE, HDST_TEXT, LM_ERROR, ACEXML_Mem_Map_Stream::recv(), ACEXML_Mem_Map_Stream::rewind(), and ACEXML_Mem_Map_Stream::seek(). Referenced by open().
00115 { 00116 if (this->stream_ == 0) 00117 return -1; 00118 00119 int header_state = HDST_LINE1_PROTOCOL; 00120 int status = 0; 00121 size_t b = 0; 00122 char* buf = 0; 00123 size_t buflen = BUFSIZ; 00124 for (;;) 00125 { 00126 if ((buf = const_cast<char*> (this->stream_->recv (buflen))) == 0) 00127 if (buflen <= 0) 00128 break; 00129 00130 for (b = 0; b < buflen; ++b) 00131 { 00132 switch ( header_state ) 00133 { 00134 case HDST_LINE1_PROTOCOL: 00135 switch ( buf[b] ) 00136 { 00137 case ' ': case '\t': 00138 header_state = HDST_LINE1_WHITESPACE; break; 00139 case '\n': header_state = HDST_LF ; break; 00140 case '\r': header_state = HDST_CR; break; 00141 } 00142 break; 00143 case HDST_LINE1_WHITESPACE: 00144 switch ( buf[b] ) 00145 { 00146 case '0': case '1': case '2': case '3': case '4': 00147 case '5': case '6': case '7': case '8': case '9': 00148 status = buf[b] - '0'; 00149 header_state = HDST_LINE1_STATUS; 00150 break; 00151 case '\n': header_state = HDST_LF ; break; 00152 case '\r': header_state = HDST_CR; break; 00153 default: header_state = HDST_TEXT; break; 00154 } 00155 break; 00156 case HDST_LINE1_STATUS: 00157 switch ( buf[b] ) 00158 { 00159 case '0': case '1': case '2': case '3': case '4': 00160 case '5': case '6': case '7': case '8': case '9': 00161 status = status * 10 + buf[b] - '0'; 00162 break; 00163 case '\n': header_state = HDST_LF ; break; 00164 case '\r': header_state = HDST_CR; break; 00165 default: header_state = HDST_TEXT; break; 00166 } 00167 break; 00168 case HDST_BOL: 00169 switch ( buf[b] ) 00170 { 00171 case '\n': header_state = HDST_LF; break; 00172 case '\r': header_state = HDST_CR; break; 00173 default: header_state = HDST_TEXT; break; 00174 } 00175 break; 00176 case HDST_TEXT: 00177 switch ( buf[b] ) 00178 { 00179 case '\n': header_state = HDST_LF; break; 00180 case '\r': header_state = HDST_CR; break; 00181 } 00182 break; 00183 00184 case HDST_LF: 00185 switch ( buf[b] ) 00186 { 00187 case '\n': goto end_of_headers; 00188 case '\r': header_state = HDST_CR; break; 00189 default: header_state = HDST_TEXT; break; 00190 } 00191 break; 00192 00193 case HDST_CR: 00194 switch ( buf[b] ) 00195 { 00196 case '\n': header_state = HDST_CRLF; break; 00197 case '\r': goto end_of_headers; 00198 default: header_state = HDST_TEXT; break; 00199 } 00200 break; 00201 00202 case HDST_CRLF: 00203 switch ( buf[b] ) 00204 { 00205 case '\n': goto end_of_headers; 00206 case '\r': header_state = HDST_CRLFCR; break; 00207 default: header_state = HDST_TEXT; break; 00208 } 00209 break; 00210 00211 case HDST_CRLFCR: 00212 switch ( buf[b] ) 00213 { 00214 case '\n': case '\r': goto end_of_headers; 00215 default: header_state = HDST_TEXT; break; 00216 } 00217 break; 00218 } 00219 } 00220 } 00221 end_of_headers: 00222 if (b == 0) 00223 return -1; 00224 ++b; 00225 // Store the address of the beginning of data. We will use it to seek to 00226 // beginning of the data in the URL. 00227 char* data_beg = buf + b; 00228 buflen = BUFSIZ; 00229 00230 // Get all of the data. Since this is backed by file store, we won't lose 00231 // any of the data. 00232 while (( buf = const_cast<char*> (this->stream_->recv (buflen))) != 0) 00233 ; 00234 00235 // Length of data in the URL. 00236 len = this->stream_->recv() - data_beg; 00237 00238 // Move the pointer to the beginning of the file store. 00239 this->stream_->rewind(); 00240 00241 this->data_offset_ = data_beg - this->stream_->recv(); 00242 // Forward to the beginning of data. 00243 if (this->stream_->seek (this->data_offset_, SEEK_SET) == -1) 00244 ACE_ERROR_RETURN ((LM_ERROR, "%s: %m", 00245 "Error in seeking to beginning of data"), -1); 00246 00247 return status; 00248 } |
|
Get the encoding of the file Implements ACEXML_CharStream. Definition at line 365 of file HttpCharStream.cpp.
00366 { 00367 return this->encoding_; 00368 } |
|
Implements ACEXML_CharStream. Definition at line 371 of file HttpCharStream.cpp. References url_.
00372 { 00373 return this->url_; 00374 } |
|
Open an URL.
Definition at line 42 of file HttpCharStream.cpp. References ACE_ERROR_RETURN, ACE_NEW_RETURN, ACE_NONBLOCK, ACEXML_Char, close(), Connector, determine_encoding(), get_url(), LM_ERROR, ACEXML_Mem_Map_Stream::open(), send_request(), ACEXML_URL_Addr::string_to_addr(), ACE::strnew(), url_, and url_addr_. Referenced by ACE_TMAIN(), and ACEXML_StreamFactory::create_stream().
00043 { 00044 this->url_ = ACE::strnew (url); 00045 00046 ACE_NEW_RETURN (this->url_addr_, ACEXML_URL_Addr, -1); 00047 ACE_NEW_RETURN (this->stream_, ACEXML_Mem_Map_Stream, -1); 00048 00049 if (this->url_addr_->string_to_addr (this->url_) == -1) { 00050 this->close(); 00051 ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "cannot convert URL"), -1); 00052 } 00053 00054 ACE_NEW_RETURN (this->connector_, 00055 Connector (0, ACE_NONBLOCK), 00056 -1); 00057 00058 if (this->stream_->open (this->connector_, *this->url_addr_) == -1) { 00059 this->close(); 00060 ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "cannot open backing store"), -1); 00061 } 00062 00063 int result = this->send_request(); 00064 if (result == -1) { 00065 this->close(); 00066 ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "send_request"), -1); 00067 } 00068 00069 size_t len = 0; 00070 result = this->get_url(len); 00071 if (result == -1) { 00072 this->close(); 00073 ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "get_url"), -1); 00074 } 00075 if (result != 200) { 00076 this->close(); 00077 ACE_ERROR_RETURN ((LM_ERROR, "Server returned status %d : %s\n", 00078 result, 00079 "Refer HTTP/1.0 error code for details"), -1); 00080 } 00081 00082 this->size_ = static_cast<off_t> (len); 00083 return this->determine_encoding(); 00084 } |
|
Peek the next ACEXML_Char in the CharStream. Return the character if succeess, -1 if EOS is reached. Implements ACEXML_CharStream. Definition at line 406 of file HttpCharStream.cpp. References ACEXML_Mem_Map_Stream::peek_char().
|
|
Read the next batch of ACEXML_Char strings Implements ACEXML_CharStream. Definition at line 378 of file HttpCharStream.cpp. References ACE_TEXT_CHAR_TO_TCHAR, ACEXML_Char, and ACEXML_Mem_Map_Stream::recv().
00380 { 00381 if (this->stream_ == 0) 00382 return -1; 00383 len = len * sizeof (ACEXML_Char); 00384 char* temp = const_cast<char*> (this->stream_->recv (len)); 00385 str = ACE_TEXT_CHAR_TO_TCHAR (temp); 00386 if (str == 0) 00387 return -1; 00388 return static_cast<int> (len); 00389 } |
|
Resets the file pointer to the beginning of the stream. Implements ACEXML_CharStream. Definition at line 352 of file HttpCharStream.cpp. References ACE_ERROR, determine_encoding(), LM_ERROR, ACEXML_Mem_Map_Stream::rewind(), and ACEXML_Mem_Map_Stream::seek().
00353 { 00354 if (this->stream_ == 0) 00355 return; 00356 this->stream_->rewind(); 00357 00358 // Forward to the beginning of data. 00359 if (this->stream_->seek (this->data_offset_, SEEK_SET) == -1) 00360 ACE_ERROR ((LM_ERROR, "%s: %m", "Error in seeking to beginning of data")); 00361 this->determine_encoding(); 00362 } |
|
Send a HTTP/1.1 request to fetch the contents of the URL. Definition at line 252 of file HttpCharStream.cpp. References ACE_DEFAULT_TIMEOUT, ACE_NEW_RETURN, ACE_TEXT_ALWAYS_CHAR, ACEXML_Mem_Map_Stream::send_n(), ACE_OS::sprintf(), ACE_OS::strlen(), and ACE::strnew(). Referenced by open().
00253 { 00254 char* path = ACE::strnew (ACE_TEXT_ALWAYS_CHAR (this->url_addr_->get_path_name())); 00255 ACE_Auto_Basic_Array_Ptr<char> path_ptr (path); 00256 size_t commandsize = ACE_OS::strlen (path) 00257 + ACE_OS::strlen (this->url_addr_->get_host_name ()) 00258 + 20 // Extra 00259 + 1 // NUL byte 00260 + 16 ; // Protocol filler... 00261 00262 char* command; 00263 ACE_NEW_RETURN (command, char[commandsize], -1); 00264 00265 // Ensure that the <command> memory is deallocated. 00266 ACE_Auto_Basic_Array_Ptr<char> cmd_ptr (command); 00267 00268 int bytes = ACE_OS::sprintf (command, "GET %s HTTP/1.0\r\n", path); 00269 bytes += ACE_OS::sprintf (&command[bytes], "Host: %s\r\n", 00270 this->url_addr_->get_host_name ()); 00271 bytes += ACE_OS::sprintf (&command[bytes], "\r\n"); 00272 00273 ACE_Time_Value tv (ACE_DEFAULT_TIMEOUT); 00274 00275 // Send the command to the connected server. 00276 int retval = this->stream_->send_n (command, bytes, &tv); 00277 if (retval <= 0) 00278 return -1; 00279 return retval; 00280 } |
|
Definition at line 127 of file HttpCharStream.h. |
|
Definition at line 131 of file HttpCharStream.h. |
|
Definition at line 133 of file HttpCharStream.h. |
|
Definition at line 129 of file HttpCharStream.h. |
|
Definition at line 125 of file HttpCharStream.h. |
|
Definition at line 121 of file HttpCharStream.h. Referenced by close(), getSystemId(), and open(). |
|
Definition at line 123 of file HttpCharStream.h. |