/*---------------------------------------------------------------------- | NPT_UrlQuery::Parse +---------------------------------------------------------------------*/ NPT_Result NPT_UrlQuery::Parse(const char* query) { const char* cursor = query; NPT_String name; NPT_String value; bool in_name = true; do { if (*cursor == '\0' || *cursor == '&') { if (!name.IsEmpty() && !value.IsEmpty()) { AddField(name, value, true); } name.SetLength(0); value.SetLength(0); in_name = true; } else if (*cursor == '=' && in_name) { in_name = false; } else { if (in_name) { name += *cursor; } else { value += *cursor; } } } while (*cursor++); return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_HttpHelper::ParseBody +---------------------------------------------------------------------*/ NPT_Result PLT_HttpHelper::ParseBody(const NPT_HttpMessage& message, NPT_XmlElementNode*& tree) { // reset tree tree = NULL; // read body NPT_String body; NPT_CHECK_WARNING(GetBody(message, body)); // parse body NPT_XmlParser parser; NPT_XmlNode* node; NPT_Result result = parser.Parse(body, node); if (NPT_FAILED(result)) { NPT_LOG_FINEST_1("Failed to parse %s", body.IsEmpty()?"(empty string)":body.GetChars()); NPT_CHECK_WARNING(result); } tree = node->AsElementNode(); if (!tree) { delete node; return NPT_FAILURE; } return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | CUPnPRenderer::ProcessHttpRequest +---------------------------------------------------------------------*/ NPT_Result CUPnPRenderer::ProcessHttpGetRequest(NPT_HttpRequest& request, const NPT_HttpRequestContext& context, NPT_HttpResponse& response) { // get the address of who sent us some data back NPT_String ip_address = context.GetRemoteAddress().GetIpAddress().ToString(); NPT_String method = request.GetMethod(); NPT_String protocol = request.GetProtocol(); NPT_HttpUrl url = request.GetUrl(); if (url.GetPath() == "/thumb") { NPT_HttpUrlQuery query(url.GetQuery()); NPT_String filepath = query.GetField("path"); if (!filepath.IsEmpty()) { NPT_HttpEntity* entity = response.GetEntity(); if (entity == NULL) return NPT_ERROR_INVALID_STATE; // check the method if (request.GetMethod() != NPT_HTTP_METHOD_GET && request.GetMethod() != NPT_HTTP_METHOD_HEAD) { response.SetStatus(405, "Method Not Allowed"); return NPT_SUCCESS; } // prevent hackers from accessing files outside of our root if ((filepath.Find("/..") >= 0) || (filepath.Find("\\..") >=0)) { return NPT_FAILURE; } #if 1 std::string path; //url #else // open the file CStdString path = CURL::Decode((const char*) filepath); #endif NPT_File file(path.c_str()); NPT_Result result = file.Open(NPT_FILE_OPEN_MODE_READ); if (NPT_FAILED(result)) { response.SetStatus(404, "Not Found"); return NPT_SUCCESS; } NPT_InputStreamReference stream; file.GetInputStream(stream); entity->SetContentType(GetMimeType(filepath)); entity->SetInputStream(stream, true); return NPT_SUCCESS; } } return PLT_MediaRenderer::ProcessHttpGetRequest(request, context, response); }
/*---------------------------------------------------------------------- | PLT_PersonRoles::ToDidl +---------------------------------------------------------------------*/ NPT_Result PLT_PersonRoles::ToDidl(NPT_String& didl, const NPT_String& tag) { NPT_String tmp; for (NPT_List<PLT_PersonRole>::Iterator it = NPT_List<PLT_PersonRole>::GetFirstItem(); it; it++) { // if there's an empty artist, allow it only if there's nothing else if (it->name.IsEmpty() && m_ItemCount>1 && !tmp.IsEmpty()) continue; tmp += "<upnp:" + tag; if (!it->role.IsEmpty()) { tmp += " role=\""; PLT_Didl::AppendXmlEscape(tmp, it->role); tmp += "\""; } tmp += ">"; PLT_Didl::AppendXmlEscape(tmp, it->name); tmp += "</upnp:" + tag + ">"; } didl += tmp; return NPT_SUCCESS; }
/*---------------------------------------------------------------------- | PLT_MediaServer::OnSearch +---------------------------------------------------------------------*/ NPT_Result PLT_MediaServer::OnSearch(PLT_ActionReference& action, const PLT_HttpRequestContext& context) { NPT_COMPILER_UNUSED(context); NPT_Result res; NPT_String container_id; NPT_String search; NPT_String filter; NPT_String start; NPT_String count; NPT_String sort; NPT_List<NPT_String> sort_list; if (NPT_FAILED(action->GetArgumentValue("ContainerId", container_id)) || NPT_FAILED(action->GetArgumentValue("SearchCriteria", search)) || NPT_FAILED(action->GetArgumentValue("Filter", filter)) || NPT_FAILED(action->GetArgumentValue("StartingIndex", start)) || NPT_FAILED(action->GetArgumentValue("RequestedCount", count)) || NPT_FAILED(action->GetArgumentValue("SortCriteria", sort))) { NPT_LOG_WARNING("Missing arguments"); action->SetError(402, "Invalid args"); return NPT_SUCCESS; } /* convert index and counts to int */ NPT_UInt32 starting_index, requested_count; if (NPT_FAILED(start.ToInteger(starting_index)) || NPT_FAILED(count.ToInteger(requested_count))) { NPT_LOG_WARNING_2("Invalid arguments (%s, %s)", start.GetChars(), count.GetChars()); action->SetError(402, "Invalid args"); return NPT_FAILURE; } /* parse sort criteria */ if (NPT_FAILED(ParseSort(sort, sort_list))) { NPT_LOG_WARNING_1("Unsupported or invalid sort criteria error (%s)", sort.GetChars()); action->SetError(709, "Unsupported or invalid sort criteria error"); return NPT_FAILURE; } NPT_LOG_INFO_5("Processing Search from %s with id=\"%s\", search=\"%s\", start=%d, count=%d", (const char*)context.GetRemoteAddress().GetIpAddress().ToString(), (const char*)container_id, (const char*)search, starting_index, requested_count); if (search.IsEmpty() || search == "*") { res = OnBrowseDirectChildren( action, container_id, filter, starting_index, requested_count, sort, context); } else { res = OnSearchContainer( action, container_id, search, filter, starting_index, requested_count, sort, context); } if (NPT_FAILED(res) && (action->GetErrorCode() == 0)) { action->SetError(800, "Internal error"); } return res; }