Exemplo n.º 1
0
mUpnpSoapResponse *mupnp_soap_request_post(mUpnpSoapRequest *soapReq, const char *ipaddr, int port)
{
	mUpnpHttpResponse *httpRes;
	char *content;
	size_t contentLen;
	mUpnpXmlParser *xmlParser;
	mUpnpHttpHeader *header = NULL;
	
	mupnp_log_debug_l4("Entering...\n");

	httpRes = mupnp_http_request_post(soapReq->httpReq, ipaddr, port);
	
	/* Check for HTTP response 405 Method Not Allowed */
	if (mupnp_http_response_getstatuscode(httpRes) == MUPNP_HTTP_STATUS_METHOD_NOT_ALLOWED)
	{
		/* Status code implies that we need to use M-POST */
		mupnp_http_request_setmethod(soapReq->httpReq, MUPNP_HTTP_MPOST);
		
		/* Add MAN header */
		header = mupnp_http_header_new();
		mupnp_http_header_setname(header, MUPNP_HTTP_MAN);
		mupnp_http_header_setvalue(header, MUPNP_HTTP_SOAP_MAN_VALUE);
		mupnp_http_packet_addheader((mUpnpHttpPacket*)soapReq->httpReq, header);
		
		/* Change soapaction header name to include namespace */
		header = mupnp_http_packet_getheader((mUpnpHttpPacket*)soapReq->httpReq, 
						  MUPNP_HTTP_SOAP_ACTION);
		if (header != NULL)
		{
			mupnp_http_header_setname(header, MUPNP_HTTP_SOAP_ACTION_WITH_NS);
		}
		
		/* New attempt */
		httpRes = mupnp_http_request_post(soapReq->httpReq, ipaddr, port);
	}
	
	mupnp_soap_response_sethttpresponse(soapReq->soapRes,httpRes);

	content = mupnp_http_response_getcontent(httpRes);
	contentLen = mupnp_http_response_getcontentlength(httpRes);
	if (content == NULL || contentLen <= 0)
		return soapReq->soapRes;

	xmlParser = mupnp_xml_parser_new();
	mupnp_xml_parse(xmlParser, soapReq->soapRes->rootNodeList, content, contentLen);
	mupnp_xml_parser_delete(xmlParser);

	mupnp_log_debug_l4("Leaving...\n");
	
	return soapReq->soapRes;
}
Exemplo n.º 2
0
void mupnp_http_headerlist_set(mUpnpHttpHeaderList *headerList, const char *name, const char *value)
{
	mUpnpHttpHeader *header;
	
	mupnp_log_debug_l4("Entering...\n");

	header = mupnp_http_headerlist_get(headerList, name);
	if (header == NULL) {
		header = mupnp_http_header_new();
		mupnp_http_headerlist_add(headerList, header);
		mupnp_http_header_setname(header, name);
	}
	
	mupnp_http_header_setvalue(header, value);

	mupnp_log_debug_l4("Leaving...\n");
}
Exemplo n.º 3
0
void mupnp_ssdp_packet_setheader(mUpnpSSDPPacket *ssdpPkt, char *ssdpMsg)
{
	mUpnpStringTokenizer *ssdpTok;
	mUpnpStringTokenizer *ssdpLineTok;
	mUpnpHttpHeader *header;
	char *lineMsg;
	char *name;
	char *value;
		
	mupnp_log_debug_l4("Entering...\n");

	ssdpTok = mupnp_string_tokenizer_new(ssdpMsg, MUPNP_HTTP_CRLF);

	/**** skip the first line ****/	
	if (mupnp_string_tokenizer_hasmoretoken(ssdpTok) == false)
		return;
	lineMsg = mupnp_string_tokenizer_nexttoken(ssdpTok);
	
	while (mupnp_string_tokenizer_hasmoretoken(ssdpTok) == true) {
		lineMsg = mupnp_string_tokenizer_nexttoken(ssdpTok);
		name = NULL;
		value = NULL;
		ssdpLineTok = mupnp_string_tokenizer_new(lineMsg, MUPNP_HTTP_HEADERLINE_DELIM);
		if (mupnp_string_tokenizer_hasmoretoken(ssdpLineTok) == true)
			name = mupnp_string_tokenizer_nexttoken(ssdpLineTok);
		if (mupnp_string_tokenizer_hasmoretoken(ssdpLineTok) == true) {
			value = mupnp_string_tokenizer_nextalltoken(ssdpLineTok);
			mupnp_strrtrim(value, MUPNP_HTTP_HEADERLINE_DELIM, mupnp_strlen(MUPNP_HTTP_HEADERLINE_DELIM));
		}
		if (name != NULL) {
			if (value == NULL)
				value = "";
			header = mupnp_http_header_new();
			mupnp_http_header_setname(header, name);
			mupnp_http_header_setvalue(header, value);
			mupnp_http_headerlist_add(ssdpPkt->headerList, header);
		}
		mupnp_string_tokenizer_delete(ssdpLineTok);
	}

	mupnp_string_tokenizer_delete(ssdpTok);

	mupnp_log_debug_l4("Leaving...\n");
}
Exemplo n.º 4
0
void mupnp_ssdp_packet_copy(mUpnpSSDPPacket *dstSsdpPkt, mUpnpSSDPPacket *srcSsdpPkt)
{
	mUpnpHttpHeader *srcHeader;
	mUpnpHttpHeader *destHeader;
	
	mupnp_log_debug_l4("Entering...\n");

	mupnp_socket_datagram_packet_copy(dstSsdpPkt->dgmPkt, srcSsdpPkt->dgmPkt);

	/**** copy headers ****/
	mupnp_ssdp_packet_clear(dstSsdpPkt);
	for (srcHeader = mupnp_ssdp_packet_getheaders(srcSsdpPkt); srcHeader != NULL; srcHeader = mupnp_http_header_next(srcHeader)) {
		destHeader = mupnp_http_header_new();
		mupnp_http_header_setname(destHeader, mupnp_http_header_getname(srcHeader));
		mupnp_http_header_setvalue(destHeader, mupnp_http_header_getvalue(srcHeader));
		mupnp_ssdp_packet_addheader(dstSsdpPkt, destHeader);
	}
	
	/* Set timestamp */
	mupnp_ssdp_packet_settimestamp(dstSsdpPkt, mupnp_getcurrentsystemtime());

	mupnp_log_debug_l4("Leaving...\n");
}