New versions:

apache benchmarks succesfully done.


Example:

ab -n 1000000 -c 200 'http://127.0.0.1:6444/'
This commit is contained in:
Massimiliano Pinto
2013-07-09 09:45:59 +02:00
parent c4d8501d75
commit be7d3b6481
2 changed files with 70 additions and 59 deletions

View File

@ -15,22 +15,6 @@
*
* Copyright SkySQL Ab 2013
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dcb.h>
#include <buffer.h>
#include <service.h>
#include <session.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <router.h>
#include <poll.h>
#include <atomic.h>
#include <gw.h>
/**
* @file httpd.c - HTTP daemon protocol module
@ -52,6 +36,8 @@
* @endverbatim
*/
#include <httpd.h>
#define ISspace(x) isspace((int)(x))
#define HTTP_SERVER_STRING "Gateway(c) v.1.0.0"
static char *version_str = "V1.0.0";
@ -126,26 +112,32 @@ GetModuleObject()
static int
httpd_read_event(DCB* dcb)
{
int n = -1;
//SESSION *session = dcb->session;
//ROUTER_OBJECT *router = session->service->router;
//ROUTER *router_instance = session->service->router_instance;
//void *rsession = session->router_session;
int numchars = 1;
char buf[1024];
char buf[HTTPD_REQUESTLINE_MAXLEN-1] = "";
char *query_string = NULL;
//char *path_info = NULL;
char method[255];
char url[255];
//char path[512];
char method[HTTPD_METHOD_MAXLEN-1] = "";
char url[HTTPD_SMALL_BUFFER] = "";
int cgi = 0;
size_t i, j;
GWBUF *buffer=NULL;
int headers_read = 0;
HTTPD_session *client_data = NULL;
dcb->state = DCB_STATE_PROCESSING;
client_data = dcb->data;
/**
* get the request line
* METHOD URL HTTP_VER\r\n
*/
numchars = httpd_get_line(dcb->fd, buf, sizeof(buf));
i = 0; j = 0;
while (!ISspace(buf[j]) && (i < sizeof(method) - 1)) {
method[i] = buf[j];
@ -153,6 +145,9 @@ GWBUF *buffer=NULL;
}
method[i] = '\0';
strcpy(client_data->method, method);
/* check allowed http methods */
if (strcasecmp(method, "GET") && strcasecmp(method, "POST")) {
//httpd_unimplemented(dcb->fd);
return 0;
@ -174,6 +169,10 @@ GWBUF *buffer=NULL;
url[i] = '\0';
/**
* Get the query string if availble
*/
if (strcasecmp(method, "GET") == 0) {
query_string = url;
while ((*query_string != '?') && (*query_string != '\0'))
@ -185,17 +184,46 @@ GWBUF *buffer=NULL;
}
}
while ((numchars > 0) && strcmp("\n", buf)) /* read & discard headers */
numchars = httpd_get_line(dcb->fd, buf, sizeof(buf));
/**
* Get the request headers
*/
while ((numchars > 0) && strcmp("\n", buf)) {
char *value = NULL;
char *end = NULL;
numchars = httpd_get_line(dcb->fd, buf, sizeof(buf));
if ( (value = strchr(buf, ':'))) {
*value = '\0';
value++;
end = &value[strlen(value) -1];
*end = '\0';
if (strncasecmp(buf, "Hostname", 6) == 0) {
strcpy(client_data->hostname, value);
}
if (strncasecmp(buf, "useragent", 9) == 0) {
strcpy(client_data->useragent, value);
}
//fprintf(stderr, "<<< Header [%s:%s]\n", buf, value);
}
}
if (numchars) {
headers_read = 1;
memcpy(&client_data->headers_received, &headers_read, sizeof(int));
}
/**
* Now begins the server reply
*/
/* send all the basic headers and close with \r\n */
httpd_send_headers(dcb, 1);
if ((buffer = gwbuf_alloc(1024)) == NULL) {
//httpd_error(dcb->fd);
return 0;
}
/**
* ToDO: launch proper content handling based on the requested URI, later REST interface
*
*/
if (strcmp(url, "/show") == 0) {
dprintAllDCBs(dcb);
@ -205,11 +233,11 @@ GWBUF *buffer=NULL;
}
/* force the client connecton close */
dcb_close(dcb);
dcb->func.close(dcb);
dcb->state = DCB_STATE_POLLING;
return n;
return 0;
}
/**
@ -247,6 +275,7 @@ httpd_write(DCB *dcb, GWBUF *queue)
static int
httpd_error(DCB *dcb)
{
dcb_close(dcb);
return 0;
}
@ -258,6 +287,7 @@ httpd_error(DCB *dcb)
static int
httpd_hangup(DCB *dcb)
{
dcb_close(dcb);
return 0;
}
@ -274,10 +304,11 @@ int n_connect = 0;
while (1)
{
int so;
int so = -1;
struct sockaddr_in addr;
socklen_t addrlen;
DCB *client;
DCB *client = NULL;
HTTPD_session *client_data = NULL;
if ((so = accept(dcb->fd, (struct sockaddr *)&addr, &addrlen)) == -1)
return n_connect;
@ -298,6 +329,10 @@ int n_connect = 0;
}
n_connect++;
/* create the session data for HTTPD */
client_data = (HTTPD_session *)calloc(1, sizeof(HTTPD_session));
client->data = client_data;
client->state = DCB_STATE_POLLING;
}
}
@ -421,29 +456,4 @@ static void httpd_send_headers(DCB *dcb, int final)
dcb_printf(dcb, "\r\n");
}
}
/**
* HTTPD get line from client
*/
static int httpd_dcb_readline(DCB *dcb) {
int n = -1;
char c = '\0';
char *ptr = NULL;
GWBUF *buffer = NULL;
buffer = NULL;
n = dcb_read(dcb, &buffer);
ptr = GWBUF_DATA(buffer);
while (ptr) {
c = *ptr;
ptr++;
}
buffer = gwbuf_consume(buffer, gwbuf_length(buffer));
return n;
}
///
//