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; }
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"); }
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"); }
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"); }