freeswitch/libs/libscgi/src/scgi_oop.cpp

128 lines
2.1 KiB
C++

#include <scgi.h>
#include <scgi_oop.h>
#define connection_construct_common() memset(&handle, 0, sizeof(handle))
SCGIhandle::SCGIhandle(void)
{
connection_construct_common();
}
SCGIhandle::~SCGIhandle()
{
scgi_disconnect(&handle);
scgi_safe_free(data_buf);
buflen = 0;
bufsize = 0;
}
int SCGIhandle::socketDescriptor()
{
if (handle.connected) {
return (int) handle.sock;
}
return -1;
}
int SCGIhandle::disconnect()
{
return scgi_disconnect(&handle);
}
int SCGIhandle::connected()
{
return handle.connected;
}
int SCGIhandle::addParam(const char *name, const char *value)
{
return (int) scgi_add_param(&handle, name, value);
}
int SCGIhandle::addBody(const char *value)
{
return (int) scgi_add_body(&handle, value);
}
char *SCGIhandle::getBody()
{
return handle.body;
}
char *SCGIhandle::getParam(const char *name)
{
return (char *) scgi_get_param(&handle, name);
}
char *SCGIhandle::sendRequest(const char *host, int port, int timeout)
{
ssize_t len;
if (!host) {
return 0;
}
if (timeout < 1000) {
timeout = 1000;
}
if (scgi_connect(&handle, host, port, timeout) == SCGI_SUCCESS) {
if (scgi_send_request(&handle) == SCGI_SUCCESS) {
while((len = scgi_recv(&handle, buf, sizeof(buf))) > 0) {
if (buflen + len > bufsize) {
bufsize = buflen + len + 1024;
void *tmp = realloc(data_buf, bufsize);
assert(tmp);
data_buf = (char *)tmp;
*(data_buf+buflen) = '\0';
}
snprintf(data_buf+buflen, bufsize-buflen, "%s", buf);
buflen += len;
}
return data_buf;
}
}
return (char *) "";
}
int SCGIhandle::bind(const char *host, int port)
{
return (scgi_bind(host, port, &server_sock) == SCGI_SUCCESS) ? 1 : 0;
}
int SCGIhandle::accept(void)
{
scgi_socket_t client_sock;
if (scgi_accept(server_sock, &client_sock, NULL) == SCGI_SUCCESS) {
if (scgi_parse(client_sock, &handle) == SCGI_SUCCESS) {
return 1;
}
closesocket(client_sock);
}
return 0;
}
int SCGIhandle::respond(char *msg)
{
int b = write(handle.sock, msg, strlen(msg));
scgi_disconnect(&handle);
scgi_safe_free(data_buf);
buflen = 0;
bufsize = 0;
return b;
}