Improve soap handler
This commit is contained in:
parent
5497650e81
commit
112d9c00e0
@ -4,8 +4,6 @@
|
|||||||
|
|
||||||
/* */
|
/* */
|
||||||
#define SOAP_PROTOCOL_CONNECT_TIMEOUT 10000
|
#define SOAP_PROTOCOL_CONNECT_TIMEOUT 10000
|
||||||
#define SOAP_PROTOCOL_REQUEST_TIMEOUT 10000
|
|
||||||
#define SOAP_PROTOCOL_RESPONSE_TIMEOUT 10000
|
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
#define HTTP_RESPONSE_STATUS_CODE 0
|
#define HTTP_RESPONSE_STATUS_CODE 0
|
||||||
@ -216,7 +214,7 @@ static int ac_soapclient_send_http(struct ac_http_soap_request* httprequest, cha
|
|||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
result = 0;
|
result = 0;
|
||||||
} else {
|
} else {
|
||||||
if (capwap_socket_send_timeout(httprequest->sock, buffer, result, SOAP_PROTOCOL_REQUEST_TIMEOUT) == result) {
|
if (capwap_socket_send_timeout(httprequest->sock, buffer, result, httprequest->requesttimeout) == result) {
|
||||||
result = 1;
|
result = 1;
|
||||||
} else {
|
} else {
|
||||||
result = 0;
|
result = 0;
|
||||||
@ -239,7 +237,7 @@ static int ac_soapclient_xml_io_read(void* ctx, char* buffer, int len) {
|
|||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
/* Receive packet into temporaly buffer */
|
/* Receive packet into temporaly buffer */
|
||||||
if (capwap_socket_recv_timeout(httprequest->sock, &respbuffer[respbufferlength], 1, SOAP_PROTOCOL_RESPONSE_TIMEOUT) != 1) {
|
if (capwap_socket_recv_timeout(httprequest->sock, &respbuffer[respbufferlength], 1, httprequest->responsetimeout) != 1) {
|
||||||
httprequest->httpstate = HTTP_RESPONSE_ERROR;
|
httprequest->httpstate = HTTP_RESPONSE_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -333,7 +331,7 @@ static int ac_soapclient_xml_io_read(void* ctx, char* buffer, int len) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Receive body directly into XML buffer */
|
/* Receive body directly into XML buffer */
|
||||||
result = capwap_socket_recv_timeout(httprequest->sock, buffer, len, SOAP_PROTOCOL_RESPONSE_TIMEOUT);
|
result = capwap_socket_recv_timeout(httprequest->sock, buffer, len, httprequest->responsetimeout);
|
||||||
if (result > 0) {
|
if (result > 0) {
|
||||||
httprequest->contentlength -= result;
|
httprequest->contentlength -= result;
|
||||||
}
|
}
|
||||||
@ -431,7 +429,7 @@ struct ac_soap_request* ac_soapclient_create_request(char* method, char* uriname
|
|||||||
xmlNewProp(request->xmlRoot, BAD_CAST "xmlns:SOAP-ENC", BAD_CAST "http://schemas.xmlsoap.org/soap/encoding/");
|
xmlNewProp(request->xmlRoot, BAD_CAST "xmlns:SOAP-ENC", BAD_CAST "http://schemas.xmlsoap.org/soap/encoding/");
|
||||||
xmlNewProp(request->xmlRoot, BAD_CAST "SOAP-ENV:encodingStyle", BAD_CAST "http://schemas.xmlsoap.org/soap/encoding/");
|
xmlNewProp(request->xmlRoot, BAD_CAST "SOAP-ENV:encodingStyle", BAD_CAST "http://schemas.xmlsoap.org/soap/encoding/");
|
||||||
xmlNewProp(request->xmlRoot, BAD_CAST "xmlns:SOAP-ENV", BAD_CAST "http://schemas.xmlsoap.org/soap/envelope/");
|
xmlNewProp(request->xmlRoot, BAD_CAST "xmlns:SOAP-ENV", BAD_CAST "http://schemas.xmlsoap.org/soap/envelope/");
|
||||||
xmlNewProp(request->xmlRequest, BAD_CAST "xmlns:tns", BAD_CAST urinamespace);
|
xmlNewProp(request->xmlRoot, BAD_CAST "xmlns:tns", BAD_CAST urinamespace);
|
||||||
xmlDocSetRootElement(request->xmlDocument, request->xmlRoot);
|
xmlDocSetRootElement(request->xmlDocument, request->xmlRoot);
|
||||||
|
|
||||||
xmlNewChild(request->xmlRoot, NULL, BAD_CAST "SOAP-ENV:Header", NULL);
|
xmlNewChild(request->xmlRoot, NULL, BAD_CAST "SOAP-ENV:Header", NULL);
|
||||||
@ -534,6 +532,8 @@ struct ac_http_soap_request* ac_soapclient_prepare_request(struct ac_soap_reques
|
|||||||
memset(httprequest, 0, sizeof(struct ac_http_soap_request));
|
memset(httprequest, 0, sizeof(struct ac_http_soap_request));
|
||||||
httprequest->request = request;
|
httprequest->request = request;
|
||||||
httprequest->server = server;
|
httprequest->server = server;
|
||||||
|
httprequest->requesttimeout = SOAP_PROTOCOL_REQUEST_TIMEOUT;
|
||||||
|
httprequest->responsetimeout = SOAP_PROTOCOL_RESPONSE_TIMEOUT;
|
||||||
|
|
||||||
/* Create socket */
|
/* Create socket */
|
||||||
httprequest->sock = socket(httprequest->server->address.ss_family, SOCK_STREAM, 0);
|
httprequest->sock = socket(httprequest->server->address.ss_family, SOCK_STREAM, 0);
|
||||||
@ -585,6 +585,16 @@ int ac_soapclient_send_request(struct ac_http_soap_request* httprequest, char* s
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* */
|
||||||
|
void ac_soapclient_shutdown_request(struct ac_http_soap_request* httprequest) {
|
||||||
|
ASSERT(httprequest != NULL);
|
||||||
|
|
||||||
|
if (httprequest->sock >= 0) {
|
||||||
|
capwap_socket_nonblocking(httprequest->sock, 0);
|
||||||
|
shutdown(httprequest->sock, SHUT_RDWR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
void ac_soapclient_close_request(struct ac_http_soap_request* httprequest, int closerequest) {
|
void ac_soapclient_close_request(struct ac_http_soap_request* httprequest, int closerequest) {
|
||||||
ASSERT(httprequest != NULL);
|
ASSERT(httprequest != NULL);
|
||||||
@ -596,8 +606,7 @@ void ac_soapclient_close_request(struct ac_http_soap_request* httprequest, int c
|
|||||||
|
|
||||||
/* Close socket */
|
/* Close socket */
|
||||||
if (httprequest->sock >= 0) {
|
if (httprequest->sock >= 0) {
|
||||||
capwap_socket_nonblocking(httprequest->sock, 0);
|
ac_soapclient_shutdown_request(httprequest);
|
||||||
shutdown(httprequest->sock, SHUT_RDWR);
|
|
||||||
close(httprequest->sock);
|
close(httprequest->sock);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -657,12 +666,8 @@ struct ac_soap_response* ac_soapclient_recv_response(struct ac_http_soap_request
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Retrieve Return response */
|
/* Retrieve optional return response */
|
||||||
response->xmlResponseReturn = ac_xml_search_child(response->xmlResponse, NULL, "return");
|
response->xmlResponseReturn = ac_xml_search_child(response->xmlResponse, NULL, "return");
|
||||||
if (!response->xmlResponseReturn) {
|
|
||||||
ac_soapclient_free_response(response);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,9 @@
|
|||||||
#define SOAP_HTTP_PORT 80
|
#define SOAP_HTTP_PORT 80
|
||||||
#define SOAP_HTTPS_PORT 443
|
#define SOAP_HTTPS_PORT 443
|
||||||
|
|
||||||
|
#define SOAP_PROTOCOL_REQUEST_TIMEOUT 10000
|
||||||
|
#define SOAP_PROTOCOL_RESPONSE_TIMEOUT 10000
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
struct ac_http_soap_server {
|
struct ac_http_soap_server {
|
||||||
int protocol;
|
int protocol;
|
||||||
@ -36,6 +39,8 @@ struct ac_http_soap_request {
|
|||||||
struct ac_soap_request* request;
|
struct ac_soap_request* request;
|
||||||
|
|
||||||
int sock;
|
int sock;
|
||||||
|
int requesttimeout;
|
||||||
|
int responsetimeout;
|
||||||
|
|
||||||
/* Information for SOAP Response */
|
/* Information for SOAP Response */
|
||||||
int httpstate;
|
int httpstate;
|
||||||
@ -71,6 +76,7 @@ struct ac_http_soap_request* ac_soapclient_prepare_request(struct ac_soap_reques
|
|||||||
int ac_soapclient_send_request(struct ac_http_soap_request* httprequest, char* soapaction);
|
int ac_soapclient_send_request(struct ac_http_soap_request* httprequest, char* soapaction);
|
||||||
struct ac_soap_response* ac_soapclient_recv_response(struct ac_http_soap_request* httprequest);
|
struct ac_soap_response* ac_soapclient_recv_response(struct ac_http_soap_request* httprequest);
|
||||||
|
|
||||||
|
void ac_soapclient_shutdown_request(struct ac_http_soap_request* httprequest);
|
||||||
void ac_soapclient_close_request(struct ac_http_soap_request* httprequest, int closerequest);
|
void ac_soapclient_close_request(struct ac_http_soap_request* httprequest, int closerequest);
|
||||||
|
|
||||||
/* Response */
|
/* Response */
|
||||||
|
Loading…
Reference in New Issue
Block a user