#include <sockets.h>
Public Member Functions | |
SocketReader (Socket &socket) | |
int | get_state () |
int | peek () |
void | next () |
int | read_line (char *line, size_t len) |
int | read (char *buffer, size_t len) |
string | receive_all () |
Private Member Functions | |
void | fetch () |
Private Attributes | |
Socket & | _socket |
int | _state |
char | _buffer [BUFFER_LEN] |
char * | _g_ptr |
char * | _e_ptr |
Definition at line 325 of file sockets.h.
SocketReader::SocketReader | ( | Socket & | socket ) | [inline] |
void SocketReader::fetch | ( | ) | [inline, private] |
Definition at line 465 of file sockets.h.
References _buffer, _e_ptr, _g_ptr, _socket, BUFFER_LEN, read(), and Socket::receive_fragmented().
Referenced by peek().
{ int read = _socket.receive_fragmented(_buffer, BUFFER_LEN); if (read >= 0) { _g_ptr = _buffer; _e_ptr = _buffer + read; } }
int SocketReader::get_state | ( | ) | [inline] |
void SocketReader::next | ( | ) | [inline] |
int SocketReader::peek | ( | ) | [inline] |
int SocketReader::read | ( | char * | buffer, |
size_t | len | ||
) | [inline] |
Definition at line 407 of file sockets.h.
References _e_ptr, _g_ptr, _socket, and Socket::receive().
Referenced by fetch(), HttpServer::handle_request(), and receive_all().
{ int sum = 0; // first read the available data from the buffer size_t avail = _e_ptr - _g_ptr; if (avail > 0) { size_t read = min(avail, len); memcpy(buffer, _g_ptr, read); _g_ptr += read; buffer += read; len -= read; } // Do we need more data? if (len > 0) sum += _socket.receive(buffer, len); return sum; }
int SocketReader::read_line | ( | char * | line, |
size_t | len | ||
) | [inline] |
Definition at line 359 of file sockets.h.
References _state, next(), and peek().
Referenced by HttpServer::handle_request().
{ char* p = NULL; char* end = line + (len-1); for(;;) { if (p && p>=end) break; int c = peek(); if (c == EOF) { _state |= ios_base::eofbit; if (p == line) _state |= ios_base::failbit; break; } if (!p) p = line; if (c == '\n') { next(); break; } else if (c == '\r') { next(); if (peek() == '\n') next(); break; } else *p++ = (char)c; next(); } if (!p) p = line; *p = '\0'; return p - line; }
string SocketReader::receive_all | ( | ) | [inline] |
Definition at line 431 of file sockets.h.
References _e_ptr, _g_ptr, _socket, BUFFER_LEN, read(), and Socket::receive_fragmented().
{ ostringstream ret; char buffer[BUFFER_LEN]; // first read all data from the buffer int avail = _e_ptr - _g_ptr; if (avail > 0) { ret.write(_g_ptr, avail); _g_ptr = _e_ptr; } // now loop until no more data can be read from the socket for(;;) { int read = _socket.receive_fragmented(buffer, BUFFER_LEN); if (read <= 0) break; ret.write(buffer, read); } return ret.str(); }
char SocketReader::_buffer[BUFFER_LEN] [private] |
Definition at line 461 of file sockets.h.
Referenced by fetch(), and SocketReader().
char* SocketReader::_e_ptr [private] |
char* SocketReader::_g_ptr [private] |
Socket& SocketReader::_socket [private] |
Definition at line 458 of file sockets.h.
Referenced by fetch(), read(), and receive_all().
int SocketReader::_state [private] |
Definition at line 459 of file sockets.h.
Referenced by get_state(), and read_line().