added some urs code

This commit is contained in:
2014-08-25 16:18:17 +00:00
parent eb1511b817
commit 78f8b4a994
54 changed files with 779 additions and 259 deletions

View File

@ -24,5 +24,5 @@ libqsehttp_la_SOURCES = \
upxd.c
libqsehttp_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
libqsehttp_la_LIBADD = -lqsecmn $(SOCKET_LIBS) $(SENDFILE_LIBS) $(SSL_LIBS)
libqsehttp_la_LIBADD = -lqsecmn $(SOCKET_LIBS) $(SENDFILE_LIBS) $(SSL_LIBS)

View File

@ -55,6 +55,7 @@ subdir = lib/http
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/argz.m4 \
$(top_srcdir)/m4/ax_check_sign.m4 \
$(top_srcdir)/m4/ax_cxx_namespace.m4 \
$(top_srcdir)/m4/ax_numval.m4 $(top_srcdir)/m4/ax_pthread.m4 \
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltdl.m4 \
@ -345,7 +346,7 @@ libqsehttp_la_SOURCES = \
upxd.c
libqsehttp_la_LDFLAGS = -L../cmn -version-info 1:0:0 -no-undefined
libqsehttp_la_LIBADD = -lqsecmn $(SOCKET_LIBS) $(SENDFILE_LIBS) $(SSL_LIBS)
libqsehttp_la_LIBADD = -lqsecmn $(SOCKET_LIBS) $(SENDFILE_LIBS) $(SSL_LIBS)
all: all-am
.SUFFIXES:

View File

@ -545,7 +545,7 @@ static QSE_INLINE int task_main_getdir (
qse_httpd_reqsum_t reqsum;
acc.remote = remote;
acc.qpath = qpath;
acc.qpath = qpath;
acc.status = 200;
acc.version = ...;
acc.method = ...;

View File

@ -357,12 +357,11 @@ static int dns_open (qse_httpd_t* httpd, qse_httpd_dns_t* dns)
httpd->opt.rcb.logact (httpd, &msg);
}
dns->handle[0].i = open_udp_socket (httpd, AF_INET);
dns->handle[0].i = open_udp_socket (httpd, AF_INET, SOCK_DGRAM, IPPROTO_UDP);
#if defined(AF_INET6)
dns->handle[1].i = open_udp_socket (httpd, AF_INET6);
dns->handle[1].i = open_udp_socket (httpd, AF_INET6, SOCK_DGRAM, IPPROTO_UDP);
#endif
if (!is_valid_socket(dns->handle[0].i) &&
!is_valid_socket(dns->handle[1].i))
if (!qse_isvalidsckhnd(dns->handle[0].i) && !qse_isvalidsckhnd(dns->handle[1].i))
{
goto oops;
}
@ -380,7 +379,7 @@ static int dns_open (qse_httpd_t* httpd, qse_httpd_dns_t* dns)
}
else
{
dc->dns_socket = SOCK_INVALID;
dc->dns_socket = QSE_INVALID_SCKHND;
}
dns->handle_count = 2;
@ -389,8 +388,8 @@ static int dns_open (qse_httpd_t* httpd, qse_httpd_dns_t* dns)
return 0;
oops:
if (is_valid_socket(dns->handle[0].i)) close_socket (dns->handle[0].i);
if (is_valid_socket(dns->handle[1].i)) close_socket (dns->handle[1].i);
if (qse_isvalidsckhnd(dns->handle[0].i)) qse_closesckhnd (dns->handle[0].i);
if (qse_isvalidsckhnd(dns->handle[1].i)) qse_closesckhnd (dns->handle[1].i);
if (dc) qse_httpd_freemem (httpd, dc);
return -1;
@ -441,8 +440,8 @@ static void dns_close (qse_httpd_t* httpd, qse_httpd_dns_t* dns)
for (i = 0; i < dns->handle_count; i++)
{
if (is_valid_socket(dns->handle[i].i))
close_socket (dns->handle[i].i);
if (qse_isvalidsckhnd(dns->handle[i].i))
qse_closesckhnd (dns->handle[i].i);
}
qse_httpd_freemem (httpd, dns->ctx);
}

View File

@ -33,10 +33,10 @@ typedef struct urs_req_t urs_req_t;
#include <qse/pack1.h>
struct urs_hdr_t
{
qse_uint16_t seq; /* in network-byte order */
qse_uint16_t rcode; /* response code */
qse_uint32_t qusum;/* checksum of url in the request */
qse_uint16_t len; /* url length in network-byte order */
qse_uint16_t seq; /* in network-byte order */
qse_uint16_t rcode; /* response code */
qse_uint32_t urlsum; /* checksum of url in the request */
qse_uint16_t urllen; /* url length in network-byte order */
};
struct urs_pkt_t
@ -95,6 +95,7 @@ static int urs_open (qse_httpd_t* httpd, qse_httpd_urs_t* urs)
qse_nwad_t nwad;
urs_ctx_t* dc;
httpd_xtn_t* httpd_xtn;
int type, proto = IPPROTO_SCTP;
httpd_xtn = qse_httpd_getxtn (httpd);
@ -118,12 +119,14 @@ static int urs_open (qse_httpd_t* httpd, qse_httpd_urs_t* urs)
httpd->opt.rcb.logact (httpd, &msg);
}
urs->handle[0].i = open_udp_socket (httpd, AF_INET);
type = (proto == IPPROTO_SCTP)? SOCK_SEQPACKET: SOCK_DGRAM;
urs->handle[0].i = open_udp_socket (httpd, AF_INET, type, proto);
#if defined(AF_INET6)
urs->handle[1].i = open_udp_socket (httpd, AF_INET6);
urs->handle[1].i = open_udp_socket (httpd, AF_INET6, type, proto);
#endif
if (!is_valid_socket(urs->handle[0].i) &&
!is_valid_socket(urs->handle[1].i))
if (!qse_isvalidsckhnd(urs->handle[0].i) && !qse_isvalidsckhnd(urs->handle[1].i))
{
goto oops;
}
@ -141,17 +144,23 @@ static int urs_open (qse_httpd_t* httpd, qse_httpd_urs_t* urs)
}
else
{
dc->urs_socket = SOCK_INVALID;
dc->urs_socket = QSE_INVALID_SCKHND;
}
if (proto == IPPROTO_SCTP)
{
/* TODO: error ahndleing */
if (qse_isvalidsckhnd(urs->handle[0].i)) listen (urs->handle[0].i, 99);
if (qse_isvalidsckhnd(urs->handle[1].i)) listen (urs->handle[1].i, 99);
}
urs->handle_count = 2;
urs->ctx = dc;
return 0;
oops:
if (is_valid_socket(urs->handle[0].i)) close_socket (urs->handle[0].i);
if (is_valid_socket(urs->handle[1].i)) close_socket (urs->handle[1].i);
if (qse_isvalidsckhnd(urs->handle[0].i)) qse_closesckhnd (urs->handle[0].i);
if (qse_isvalidsckhnd(urs->handle[1].i)) qse_closesckhnd (urs->handle[1].i);
if (dc) qse_httpd_freemem (httpd, dc);
return -1;
@ -189,8 +198,8 @@ static void urs_close (qse_httpd_t* httpd, qse_httpd_urs_t* urs)
for (i = 0; i < urs->handle_count; i++)
{
if (is_valid_socket(urs->handle[i].i))
close_socket (urs->handle[i].i);
if (qse_isvalidsckhnd(urs->handle[i].i))
qse_closesckhnd (urs->handle[i].i);
}
qse_httpd_freemem (httpd, urs->ctx);
@ -220,15 +229,16 @@ printf ("URS_RECV....\n");
/* TODO: check if fromaddr matches the dc->skad... */
pkt = (urs_pkt_t*)dc->rcvbuf;
if (len >= QSE_SIZEOF(pkt->hdr) && len >= QSE_SIZEOF(pkt->hdr) + qse_ntoh16(pkt->hdr.len))
if (len >= QSE_SIZEOF(pkt->hdr) && len >= QSE_SIZEOF(pkt->hdr) + qse_ntoh16(pkt->hdr.urllen))
{
xid = qse_ntoh16(pkt->hdr.seq) % QSE_COUNTOF(dc->reqs);
for (req = dc->reqs[xid]; req; req = req->next)
{
if (req->pkt->hdr.seq == pkt->hdr.seq && req->pkt->hdr.qusum == pkt->hdr.qusum)
if (req->pkt->hdr.seq == pkt->hdr.seq && req->pkt->hdr.urlsum == pkt->hdr.urlsum)
{
pkt->url[qse_ntoh16(pkt->hdr.len)] = QSE_MT('\0');
/* null-terminate the url for easier processing */
pkt->url[qse_ntoh16(pkt->hdr.urllen)] = QSE_MT('\0');
urs_remove_tmr_tmout (httpd, req);
req->rewrite (httpd, req->pkt->url, pkt->url, req->ctx);
@ -329,11 +339,10 @@ static int urs_send (qse_httpd_t* httpd, qse_httpd_urs_t* urs, const qse_mchar_t
urs_req_t* req = QSE_NULL;
qse_size_t url_len;
qse_tmr_event_t tmout_event;
httpd_xtn = qse_httpd_getxtn (httpd);
printf ("URS REALLY SENING>>>>>>>>>>>>>>>>>>>>>>>\n");
if (dc->req_count >= QSE_COUNTOF(dc->reqs))
{
/* too many pending requests */
@ -361,8 +370,8 @@ printf ("URS REALLY SENING>>>>>>>>>>>>>>>>>>>>>>>\n");
req->pkt = (urs_pkt_t*)(req + 1);
req->pkt->hdr.seq = qse_hton16(seq);
req->pkt->hdr.len = qse_hton16(url_len);
req->pkt->hdr.qusum = hash_string (url);
req->pkt->hdr.urllen = qse_hton16(url_len);
req->pkt->hdr.urlsum = hash_string (url);
qse_mbscpy (req->pkt->url, url);
/* -1 to exclude the terminating '\0' as urs_pkt_t has url[1]. */
@ -412,6 +421,21 @@ printf ("URS REALLY SENING>>>>>>>>>>>>>>>>>>>>>>>\n");
tmout_event.updater = tmr_urs_tmout_update;
if (qse_httpd_inserttimerevent (httpd, &tmout_event, &req->tmr_tmout) <= -1) goto oops;
/*
{
struct msghdr msg;
struct iovec iov;
QSE_MEMSET (&msg, 0, QSE_SIZEOF(msg));
msg.msg_name = &req->urs_skad;
msg.msg_namelen = req->urs_skadlen;
iov.iov_base = req->pkt;
iov.iov_len = req->pktlen;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
if (sendmsg (req->urs_socket, &msg, 0) != req->pktlen)
}
*/
if (sendto (req->urs_socket, req->pkt, req->pktlen, 0, (struct sockaddr*)&req->urs_skad, req->urs_skadlen) != req->pktlen)
{
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());

View File

@ -33,6 +33,7 @@
#include <qse/cmn/dir.h>
#include <qse/cmn/fio.h>
#include <qse/cmn/sio.h>
#include <qse/cmn/sck.h>
#define STAT_REG 1
#define STAT_DIR 2
@ -87,6 +88,9 @@
# define IP_TRANSPARENT 19
# endif
# endif
# if defined(HAVE_NETINET_SCTP_H)
# include <netinet/sctp.h>
# endif
#endif
#if defined(HAVE_SSL)
@ -651,41 +655,7 @@ void* qse_httpd_getxtnstd (qse_httpd_t* httpd)
/* ------------------------------------------------------------------- */
#if defined(_WIN32)
typedef SOCKET sock_t;
# define SOCK_INVALID INVALID_SOCKET
#else
typedef int sock_t;
# define SOCK_INVALID -1
#endif
#if !defined(HAVE_SOCKLEN_T)
typedef int socklen_t;
#endif
static QSE_INLINE int is_valid_socket (sock_t fd)
{
#if defined(_WIN32)
return fd != INVALID_SOCKET;
#else
return fd >= 0;
#endif
}
static QSE_INLINE void close_socket (sock_t fd)
{
#if defined(_WIN32)
closesocket (fd);
#elif defined(__OS2__)
soclose (fd);
#elif defined(__DOS__)
/* TODO: */
#else
QSE_CLOSE (fd);
#endif
}
static int set_socket_nonblock (qse_httpd_t* httpd, sock_t fd, int enabled)
static int set_socket_nonblock (qse_httpd_t* httpd, qse_sck_hnd_t fd, int enabled)
{
#if defined(_WIN32)
if (ioctlsocket (fd, FIONBIO, &enabled) == SOCKET_ERROR)
@ -723,13 +693,13 @@ static int set_socket_nonblock (qse_httpd_t* httpd, sock_t fd, int enabled)
}
static sock_t open_udp_socket (qse_httpd_t* httpd, int domain)
static qse_sck_hnd_t open_udp_socket (qse_httpd_t* httpd, int domain, int type, int proto)
{
sock_t fd;
qse_sck_hnd_t fd;
int flag;
fd = socket (domain, SOCK_DGRAM, IPPROTO_UDP);
if (!is_valid_socket(fd))
fd = socket (domain, type, proto);
if (!qse_isvalidsckhnd(fd))
{
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
goto oops;
@ -750,13 +720,34 @@ static sock_t open_udp_socket (qse_httpd_t* httpd, int domain)
setsockopt (fd, SOL_SOCKET, SO_REUSEPORT, (void*)&flag, QSE_SIZEOF(flag));
#endif
#if defined(IPV6_V6ONLY)
if (domain == AF_INET6)
{
flag = 1;
setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY, (void*)&flag, QSE_SIZEOF(flag));
}
#endif
if (set_socket_nonblock (httpd, fd, 1) <= -1) goto oops;
if (proto == IPPROTO_SCTP)
{
struct sctp_initmsg im;
QSE_MEMSET (&im, 0, QSE_SIZEOF(im));
im.sinit_num_ostreams = 1;
im.sinit_max_instreams = 1;
im.sinit_max_attempts = 1;
if (setsockopt (fd, SOL_SCTP, SCTP_INITMSG, &im, QSE_SIZEOF(im)) <= -1) goto oops;
}
return fd;
oops:
if (is_valid_socket(fd)) close_socket (fd);
return SOCK_INVALID;
if (qse_isvalidsckhnd(fd)) qse_closesckhnd (fd);
return QSE_INVALID_SCKHND;
}
/* ------------------------------------------------------------------- */
@ -767,7 +758,7 @@ static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server)
qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL);
return -1;
#else
sock_t fd = SOCK_INVALID, flag;
qse_sck_hnd_t fd = QSE_INVALID_SCKHND, flag;
qse_skad_t addr;
int addrsize;
@ -779,7 +770,7 @@ static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server)
}
fd = socket (qse_skadfamily(&addr), SOCK_STREAM, IPPROTO_TCP);
if (!is_valid_socket(fd))
if (!qse_isvalidsckhnd(fd))
{
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
goto oops;
@ -861,24 +852,15 @@ static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server)
{
int on = 1;
setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof(on));
if (bind (fd, (struct sockaddr*)&addr, addrsize) <= -1)
{
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
goto oops;
}
if (bind (fd, (struct sockaddr*)&addr, addrsize) == 0) goto bind_ok;
}
else
{
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
goto oops;
}
#else
#endif
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
goto oops;
#endif
}
bind_ok:
if (listen (fd, 10) <= -1)
{
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
@ -891,14 +873,14 @@ static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server)
return 0;
oops:
if (is_valid_socket(fd)) close_socket (fd);
if (qse_isvalidsckhnd(fd)) qse_closesckhnd (fd);
return -1;
#endif
}
static void server_close (qse_httpd_t* httpd, qse_httpd_server_t* server)
{
close_socket (server->handle.i);
qse_closesckhnd (server->handle.i);
}
static int server_accept (
@ -910,13 +892,13 @@ static int server_accept (
#else
qse_skad_t addr;
socklen_t addrlen;
sock_t fd = SOCK_INVALID;
qse_sck_len_t addrlen;
qse_sck_hnd_t fd = QSE_INVALID_SCKHND;
int flag;
addrlen = QSE_SIZEOF(addr);
fd = accept (server->handle.i, (struct sockaddr*)&addr, &addrlen);
if (!is_valid_socket(fd))
if (!qse_isvalidsckhnd(fd))
{
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
goto oops;
@ -985,7 +967,7 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: too many client?\n"));
return 0;
oops:
if (is_valid_socket(fd)) close_socket (fd);
if (qse_isvalidsckhnd(fd)) qse_closesckhnd (fd);
return -1;
#endif
}
@ -1005,7 +987,8 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer)
qse_skad_t connaddr, bindaddr;
int connaddrsize, bindaddrsize;
int connected = 1;
sock_t fd = SOCK_INVALID;
qse_sck_hnd_t fd = QSE_INVALID_SCKHND;
#if defined(_WIN32)
unsigned long cmd;
#elif defined(__OS2__)
@ -1026,7 +1009,7 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer)
bindaddrsize = qse_nwadtoskad (&peer->local, &bindaddr);
fd = socket (qse_skadfamily(&connaddr), SOCK_STREAM, IPPROTO_TCP);
if (!is_valid_socket(fd))
if (!qse_isvalidsckhnd(fd))
{
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
goto oops;
@ -1038,6 +1021,7 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer)
setsockopt (fd, SOL_IP, IP_TRANSPARENT, &flag, QSE_SIZEOF(flag));
#endif
/* don't use invalid binding address */
if (bindaddrsize >= 0 &&
bind (fd, (struct sockaddr*)&bindaddr, bindaddrsize) <= -1)
{
@ -1096,7 +1080,7 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer)
oops:
qse_httpd_seterrnum (httpd, SKERR_TO_ERRNUM());
if (is_valid_socket(fd)) close_socket (fd);
if (qse_isvalidsckhnd(fd)) qse_closesckhnd (fd);
return -1;
/* -------------------------------------------------------------------- */
@ -1105,7 +1089,7 @@ oops:
static void peer_close (qse_httpd_t* httpd, qse_httpd_peer_t* peer)
{
close_socket (peer->handle.i);
qse_closesckhnd (peer->handle.i);
}
static int peer_connected (qse_httpd_t* httpd, qse_httpd_peer_t* peer)
@ -1159,7 +1143,7 @@ static int peer_connected (qse_httpd_t* httpd, qse_httpd_peer_t* peer)
#else
socklen_t len;
qse_sck_len_t len;
int ret;
len = QSE_SIZEOF(ret);
@ -1857,7 +1841,7 @@ static void client_close (qse_httpd_t* httpd, qse_httpd_client_t* client)
#else
shutdown (client->handle.i, SHUT_RDWR);
#endif
close_socket (client->handle.i);
qse_closesckhnd (client->handle.i);
}
static void client_shutdown (qse_httpd_t* httpd, qse_httpd_client_t* client)