From d7c4593ff2b4c55fdc33676e20ecafff1c87e62c Mon Sep 17 00:00:00 2001 From: snowdrop Date: Wed, 27 Jul 2005 07:45:40 +0000 Subject: Changes of Menzo nanohttp/nanohttp-client.c and nanohttp/nanohttp-client.h added httpc_close_free, a variant of httpc_free which explicitly asks to close the socket. Otherwise after a number of client/server interactions we get socket error 24 (Too many open files). libcsoap/soap-client.c call httpc_close_free instead of httpc_free nanohttp/nanohttp-socket.c in hsocket_close call shutdown with SHUT_RDWR instead of 1 (SHUT_WR). Otherwise after a number of client/server interactions the shutdown call doesn't return anymore. --- libcsoap/soap-client.c | 22 +++++++++++----------- nanohttp/nanohttp-client.c | 15 ++++++++++++++- nanohttp/nanohttp-client.h | 7 ++++++- nanohttp/nanohttp-socket.c | 4 ++-- 4 files changed, 33 insertions(+), 15 deletions(-) diff --git a/libcsoap/soap-client.c b/libcsoap/soap-client.c index e12317c..b015a9c 100644 --- a/libcsoap/soap-client.c +++ b/libcsoap/soap-client.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-client.c,v 1.16 2005/05/27 19:28:14 snowdrop Exp $ +* $Id: soap-client.c,v 1.17 2005/07/27 07:45:40 snowdrop Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -121,21 +121,21 @@ soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const cha status = httpc_post_begin(conn, url); if (status != H_OK) { - httpc_free(conn); + httpc_close_free(conn); xmlBufferFree(buffer); return status; } status = http_output_stream_write_string(conn->out, content); if (status != H_OK) { - httpc_free(conn); + httpc_close_free(conn); xmlBufferFree(buffer); return status; } status = httpc_post_end(conn, &res); if (status != H_OK) { - httpc_free(conn); + httpc_close_free(conn); xmlBufferFree(buffer); return status; } @@ -149,21 +149,21 @@ soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const cha sprintf(start_id, "289247829121218%d", counter++); status = httpc_mime_begin(conn, url, start_id, "", "text/xml"); if (status != H_OK) { - httpc_free(conn); + httpc_close_free(conn); xmlBufferFree(buffer); return status; } status = httpc_mime_next(conn, start_id, "text/xml", "binary"); if (status != H_OK) { - httpc_free(conn); + httpc_close_free(conn); xmlBufferFree(buffer); return status; } status = http_output_stream_write(conn->out, content, strlen(content)); if (status != H_OK) { - httpc_free(conn); + httpc_close_free(conn); xmlBufferFree(buffer); return status; } @@ -175,7 +175,7 @@ soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const cha part->content_type, part->transfer_encoding, part->filename); if (status != H_OK) { log_error2("Send file failed. Status:%d", status); - httpc_free(conn); + httpc_close_free(conn); xmlBufferFree(buffer); return status; } @@ -184,7 +184,7 @@ soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const cha status = httpc_mime_end(conn, &res); if (status != H_OK) { - httpc_free(conn); + httpc_close_free(conn); xmlBufferFree(buffer); return status; } @@ -197,7 +197,7 @@ soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const cha status = _soap_client_build_result(res, &res_env); if (status != H_OK) { hresponse_free(res); - httpc_free(conn); + httpc_close_free(conn); return status; } @@ -221,7 +221,7 @@ soap_client_invoke(SoapCtx *call, SoapCtx** response, const char *url, const cha hresponse_free(res); - httpc_free(conn); + httpc_close_free(conn); return H_OK; } diff --git a/nanohttp/nanohttp-client.c b/nanohttp/nanohttp-client.c index b1d101f..fc1d8f5 100644 --- a/nanohttp/nanohttp-client.c +++ b/nanohttp/nanohttp-client.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-client.c,v 1.27 2005/05/27 19:28:15 snowdrop Exp $ +* $Id: nanohttp-client.c,v 1.28 2005/07/27 07:45:56 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -92,6 +92,19 @@ httpc_new() return res; } +/*-------------------------------------------------- +FUNCTION: httpc_close_free +DESC: Close and free the given http client object. +----------------------------------------------------*/ +void +httpc_close_free(httpc_conn_t * conn) +{ + if (conn == NULL) + return; + + hsocket_close(conn->sock); + httpc_free(conn); +} /*-------------------------------------------------- FUNCTION: httpc_free diff --git a/nanohttp/nanohttp-client.h b/nanohttp/nanohttp-client.h index 06c0fcd..020f7e3 100644 --- a/nanohttp/nanohttp-client.h +++ b/nanohttp/nanohttp-client.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: nanohttp-client.h,v 1.14 2004/11/02 23:09:26 snowdrop Exp $ + * $Id: nanohttp-client.h,v 1.15 2005/07/27 07:45:57 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -70,6 +70,11 @@ void httpc_destroy(); */ httpc_conn_t* httpc_new(); +/** + Close and release a connection +*/ +void httpc_close_free(httpc_conn_t* conn); + /** Release a connections */ diff --git a/nanohttp/nanohttp-socket.c b/nanohttp/nanohttp-socket.c index 468f3b9..69b17f3 100644 --- a/nanohttp/nanohttp-socket.c +++ b/nanohttp/nanohttp-socket.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: nanohttp-socket.c,v 1.33 2005/05/27 19:28:16 snowdrop Exp $ +* $Id: nanohttp-socket.c,v 1.34 2005/07/27 07:45:57 snowdrop Exp $ * * CSOAP Project: A http client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -322,7 +322,7 @@ hsocket_close (hsocket_t sock) closesocket(sock); #else - shutdown(sock, 1); + shutdown(sock, SHUT_RDWR); while (recv(sock, junk, sizeof(junk), 0)>0) { }; close (sock); #endif -- cgit v1.1-32-gdbae