|
From: <wsh...@us...> - 2003-08-08 14:48:08
|
Update of /cvsroot/emc/rcslib/src/cms
In directory sc8-pr-cvs1:/tmp/cvs-serv5072
Added Files:
Tag: wps_multiplat_dev_branch
httpnml.cc httpnml.hh
Log Message:
.
--- NEW FILE: httpnml.cc ---
#include "httpnml.hh"
#include "tcp_opts.hh" /* SET_TCP_NODELAY */
#include "sokintrf.h" /* dl_closesocket(), dl_gethostbyname(), dl_sock*/
#include "rcs_prnt.hh"
#include "timer.hh"
#include "sendn.h"
#include "recvn.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
HttpXmlNml::HttpXmlNml( NML_FORMAT_PTR f_ptr, const char *url) : NML(f_ptr,0,0,0)
{
hostname=0;
hostname_len=0;
get_msg=0;
get_msg_len=0;
#ifndef VXWORKS
server_host_entry=0;
#endif
memset(&server_socket_address,0,sizeof(server_socket_address));
tcp_port_number=80;
socket_fd=-1;
buffer =0 ;
buffer_size =0;
#ifndef VXWORKS
server_host_entry = NULL;
#endif
if(strncmp(url,"http://",7))
{
rcs_print_error("HttpXmlNml bad URL=%s\n",url);
return;
}
hostname_len = strcspn(url+7,":/?");
if(hostname_len <= 0)
{
rcs_print_error("HttpXmlNml bad URL=%s\n",url);
return;
}
hostname = (char *) malloc(hostname_len + 1);
memcpy(hostname,url+7,hostname_len);
hostname[hostname_len] = 0;
if(*(url+7+hostname_len) == ':')
{
tcp_port_number = strtol(url+8+hostname_len,0,0);
}
char *pathstart = strchr(url+7,'/');
if(!pathstart)
{
rcs_print_error("HttpXmlNml bad URL=%s\n",url);
return;
}
get_msg = (char *) malloc(strlen(pathstart) + 10);
sprintf(get_msg,"GET %s",pathstart);
get_msg_len = strlen(get_msg);
/* Set up the socket address stucture. */
memset (&server_socket_address, 0, sizeof (server_socket_address));
server_socket_address.sin_family = AF_INET;
server_socket_address.sin_port = dl_htons (((u_short) tcp_port_number));
int hostname_was_address = 0;
char bufferhost_first_char = hostname[0];
if (bufferhost_first_char >= '0' && bufferhost_first_char <= '9')
{
server_socket_address.sin_addr.s_addr = dl_inet_addr (hostname);
if (server_socket_address.sin_addr.s_addr != 0 &&
((long) server_socket_address.sin_addr.s_addr) != -1)
{
hostname_was_address = 1;
}
}
if (!hostname_was_address)
{
if(!isalpha(hostname[0]))
{
rcs_print_error("Bad host name %s\n",hostname);
return;
}
/* Get the IP address of the server using it's hostname. */
#ifndef VXWORKS
dl_gethostbyname (hostname, &server_host_entry);
if (NULL == server_host_entry)
{
#if defined(_WINDOWS) && !defined(gnuwin32)
rcs_print_sys_error (WSAGETLASTERROR_ERROR_SOURCE,
"gethostbyname error");
#endif
rcs_print_error ("TCPMEM: Couldn't get host address for (%s).\n",
hostname);
return;
}
#ifdef __MSDOS__
server_socket_address.sin_addr.s_addr =
*((u_long *) server_host_entry->h_addr_list[0]);
#else
server_socket_address.sin_addr.s_addr =
*((int *) server_host_entry->h_addr_list[0]);
#endif
server_socket_address.sin_family = server_host_entry->h_addrtype;
#else
server_socket_address.sin_addr.s_addr = hostGetByName (hostname);
if (server_socket_address.sin_addr.s_addr == ERROR)
{
rcs_print_error ("TCPMEM: Couldn't get host address for (%s).\n",
hostname);
return;
}
#endif
}
buffer_size = 8192;
buffer = (char *) malloc(buffer_size);
rcs_print_debug (PRINT_CMS_CONFIG_INFO,
"Using server on %s with IP address %s and port %d.\n",
hostname,
dl_inet_ntoa (server_socket_address.sin_addr),
tcp_port_number);
}
NMLmsg *
HttpXmlNml::readMsg(void)
{
if(!buffer)
{
rcs_print_error("HttpXmlNML: not initialized.\n");
}
rcs_print_debug (PRINT_CMS_CONFIG_INFO, "Creating socket . . .\n");
socket_fd = dl_socket (AF_INET, SOCK_STREAM, 0);
if (socket_fd < 0)
{
rcs_print_error ("TCPMEM: Error from socket() (errno = %d:%s)\n",
errno, strerror (errno));
return(0);
}
rcs_print_debug (PRINT_CMS_CONFIG_INFO, "Setting socket options . . . \n");
if (set_tcp_socket_options (socket_fd) < 0)
{
return(0);
}
double timeout = 10.0;
struct timeval tm;
int socket_ret;
double start_time, current_time;
fd_set fds;
sockaddr_in cli_addr;
cli_addr.sin_family = AF_INET;
cli_addr.sin_addr.s_addr = dl_htonl (INADDR_ANY);
cli_addr.sin_port = dl_htons (0);
rcs_print_debug (PRINT_CMS_CONFIG_INFO, "Binding . . . \n");
if (dl_bind (socket_fd, (struct sockaddr *) &cli_addr, sizeof (cli_addr)) <
0)
{
#if defined(_Windows) && !defined(USE_PCNFS) && !defined(gnuwin32)
rcs_print_error ("TCPMEM: bind error %d\n", dl_WSAGetLastError ());
#else
rcs_print_error ("TCPMEM: bind error %d = %s\n", errno,
strerror (errno));
#endif
}
rcs_print_debug (PRINT_CMS_CONFIG_INFO, "Connecting . . .\n");
if (dl_connect (socket_fd, (struct sockaddr *) &server_socket_address,
sizeof (server_socket_address)) < 0)
{
if (
#ifdef gnuwin32
EINPROGRESS == errno
#else
#ifdef _Windows
WSAEWOULDBLOCK == dl_WSAGetLastError ()
#else
#ifdef MSDOS
EWOULDBLOCK == tk_geterrno (socket_fd)
#else
EINPROGRESS == errno
#endif
#endif
#endif
)
{
#ifdef _Windows
tm.tv_sec = 0;
tm.tv_usec = 0;
#else
tm.tv_sec = (long) timeout;
tm.tv_sec = (long) (fmod (timeout, 1.0) * 1e6);
#endif
FD_ZERO (&fds);
RCS_FD_SET (socket_fd, &fds);
start_time = etime ();
while (!(socket_ret = dl_select (socket_fd + 1,
(fd_set *) NULL,
&fds, (fd_set *) NULL, &tm)))
{
RCS_FD_SET (socket_fd, &fds);
esleep (0.001);
current_time = etime ();
double timeleft = start_time + timeout - current_time;
if (timeleft <= 0.0 && timeout >= 0.0)
{
rcs_print_error
("HTTPXMLNML: Timed out waiting for connection.\n");
return(0);
}
#ifdef _Windows
tm.tv_sec = 0;
tm.tv_usec = 0;
#else
tm.tv_sec = (long) timeleft;
tm.tv_sec = (long) (fmod (timeleft, 1.0) * 1e6);
#endif
}
#if defined(_Windows) && !defined(gnuwin32)
if (socket_ret == SOCKET_ERROR)
{
rcs_print_error ("select error: %d\n", dl_WSAGetLastError ());
rcs_print_error ("HTTPXMLNML: Couldn't connect.\n");
return(0);
}
#else
if (-1 == socket_ret)
{
rcs_print_error ("select error: %d -- %s\n", errno,
strerror (errno));
rcs_print_error ("HTTPXMLNML: Couldn't connect.\n");
return(0);
}
#endif
}
else
{
#if defined(_Windows) && !defined(gnuwin32)
rcs_print_error ("connect error: %d\n", dl_WSAGetLastError ());
#else
rcs_print_error ("connect error: %d -- %s\n", errno,
strerror (errno));
#endif
rcs_print_error
("HTTPXMLNML: Error trying to connect to TCP port %d of host %s(%s). sin_family=%d\n",
dl_ntohs (server_socket_address.sin_port), hostname,
dl_inet_ntoa (server_socket_address.sin_addr),
server_socket_address.sin_family);
return(0);
}
}
if(socket_fd < 0)
{
return 0;
}
if(sendn(socket_fd,get_msg,get_msg_len,0,-1) < 0)
{
return 0;
}
buffer[0]=0;
char *ptr = buffer;
int recvn_return;
do
{
recvn_return = recv(socket_fd,ptr,buffer_size - (ptr-buffer), 0);
if(recvn_return > 0)
{
ptr += recvn_return;
}
if(buffer_size - (ptr-buffer) < 4096)
{
buffer_size += 8192;
buffer = (char *) realloc(buffer,buffer_size);
}
}
while(recvn_return > 0) ;
if(xml2msg(buffer) > 0)
{
dl_closesocket(socket_fd);
socket_fd=0;
return get_address();
}
dl_closesocket(socket_fd);
socket_fd =0;
return 0;
}
--- NEW FILE: httpnml.hh ---
#ifndef HTTPNML_HH
#define HTTPNML_HH
#include "nml.hh"
#include "rcs_defs.hh" /* EXTERN_C_STD_HEADERS */
#include "cms.hh" /* class CMS */
#include "rem_msg.hh" // REMOTE_CMS_REQUEST_TYPE
#include "sokintrf.h" // hostent, sockaddr_in
class HttpXmlNml : protected NML
{
public:
HttpXmlNml(NML_FORMAT_PTR f_ptr, const char *url);
NMLmsg *readMsg();
protected:
char *hostname;
int hostname_len;
char *get_msg;
int get_msg_len;
#ifndef VXWORKS
struct hostent *server_host_entry;
#endif
struct sockaddr_in server_socket_address;
int tcp_port_number;
int socket_fd;
char *buffer;
size_t buffer_size;
};
#endif
//HTTPNML_HH
|