static rc_t CC _HttpStreamCloseInternals_ZHR ( const struct XFSHttpStream * self ) { struct XFSHttpStream * Stream = ( struct XFSHttpStream * ) self; if ( Stream == 0 ) { return 0; } if ( Stream -> str != NULL ) { KStreamRelease ( Stream -> str ); Stream -> str = NULL; } if ( Stream -> res != NULL ) { KClientHttpResultRelease ( Stream -> res ); Stream -> res = NULL; } if ( Stream -> req != NULL ) { KClientHttpRequestRelease ( Stream -> req ); Stream -> req = NULL; } if ( Stream -> http != NULL ) { KClientHttpRelease ( Stream -> http ); Stream -> http = NULL; } return 0; } /* _HttpStreamCloseInternals_ZHR () */
rc_t perform_cgi_request( struct cgi_request * request, struct KStream ** reply_stream, uint32_t * rslt_code ) { rc_t rc; if ( request == NULL || reply_stream == NULL || rslt_code == NULL ) rc = RC( rcVDB, rcNoTarg, rcConstructing, rcParam, rcNull ); else { ver_t http_vers = 0x01010000; KClientHttpRequest * kns_req; *reply_stream = NULL; rc = KNSManagerMakeClientRequest( request->kns_mgr, &kns_req, http_vers, NULL, "%s", request->url ); if ( rc != 0 ) ErrMsg( "KNSManagerMakeClientRequest( '%s' ) -> %R", request->url, rc ); else { uint32_t count; rc = VNameListCount( request->params, &count ); if ( rc != 0 ) ErrMsg( "VNameListCount() -> %R", rc ); else { uint32_t idx; for ( idx = 0; idx < count && rc == 0; ++idx ) { const char * s; rc = VNameListGet( request->params, idx, &s ); if ( rc != 0 ) ErrMsg( "VNameListGet( #%d ) -> %R", idx, rc ); else { rc = KClientHttpRequestAddPostParam( kns_req, "%s", s ); if ( rc != 0 ) ErrMsg( "KClientHttpRequestAddPostParam( '%s' ) -> %R", s, rc ); } } if ( rc == 0 ) { KClientHttpResult * kns_rslt; rc = KClientHttpRequestPOST( kns_req, &kns_rslt ); if ( rc != 0 ) ErrMsg( "KClientHttpRequestPOST() -> %R", rc ); else { rc = KClientHttpResultStatus( kns_rslt, rslt_code, NULL, 0, NULL ); if ( rc != 0 ) ErrMsg( "KClientHttpResultStatus() -> %R", rc ); else { rc = KClientHttpResultGetInputStream( kns_rslt, reply_stream ); if ( rc != 0 ) ErrMsg( "KClientHttpResultGetInputStream() -> %R", rc ); } KClientHttpResultRelease( kns_rslt ); } } } KClientHttpRequestRelease( kns_req ); } } return rc; }