128 lines
2.1 KiB
C++
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;
|
|
}
|