void HttpUtility::SendJsonBody(HttpResponse& response, const Value& val) { response.AddHeader("Content-Type", "application/json"); String body = JsonEncode(val); response.WriteBody(body.CStr(), body.GetLength()); }
size_t CurlHttpClient::WriteHeader(char* ptr, size_t size, size_t nmemb, void* userdata) { if (ptr) { AWS_LOGSTREAM_TRACE(CURL_HTTP_CLIENT_TAG, ptr); HttpResponse* response = (HttpResponse*) userdata; Aws::String headerLine(ptr); Aws::Vector<Aws::String> keyValuePair = StringUtils::Split(headerLine, ':'); if (keyValuePair.size() > 1) { Aws::String headerName = keyValuePair[0]; headerName = StringUtils::Trim(headerName.c_str()); Aws::String headerValue = headerLine.substr(headerName.length() + 1).c_str(); headerValue = StringUtils::Trim(headerValue.c_str()); response->AddHeader(headerName, headerValue); } return size * nmemb; } return 0; }
bool InfoHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params) { if (request.RequestUrl->GetPath().size() > 2) return false; if (request.RequestMethod != "GET") return false; if (request.RequestUrl->GetPath().empty()) { response.SetStatus(302, "Found"); response.AddHeader("Location", "/v1"); return true; } if (request.RequestUrl->GetPath()[0] != "v1" || request.RequestUrl->GetPath().size() != 1) return false; response.SetStatus(200, "OK"); std::vector<String> permInfo; Array::Ptr permissions = user->GetPermissions(); if (permissions) { ObjectLock olock(permissions); BOOST_FOREACH(const Value& permission, permissions) { String name; bool hasFilter = false; if (permission.IsObjectType<Dictionary>()) { Dictionary::Ptr dpermission = permission; name = dpermission->Get("permission"); hasFilter = dpermission->Contains("filter"); } else name = permission; if (hasFilter) name += " (filtered)"; permInfo.push_back(name); } }
bool EventsHandler::HandleRequest(const ApiUser::Ptr& user, HttpRequest& request, HttpResponse& response, const Dictionary::Ptr& params) { if (request.RequestUrl->GetPath().size() != 2) return false; if (request.RequestMethod != "POST") return false; if (request.ProtocolVersion == HttpVersion10) { HttpUtility::SendJsonError(response, 400, "HTTP/1.0 not supported for event streams."); return true; } Array::Ptr types = params->Get("types"); if (!types) { HttpUtility::SendJsonError(response, 400, "'types' query parameter is required."); return true; } { ObjectLock olock(types); for (const String& type : types) { FilterUtility::CheckPermission(user, "events/" + type); } } String queueName = HttpUtility::GetLastParameter(params, "queue"); if (queueName.IsEmpty()) { HttpUtility::SendJsonError(response, 400, "'queue' query parameter is required."); return true; } String filter = HttpUtility::GetLastParameter(params, "filter"); Expression *ufilter = NULL; if (!filter.IsEmpty()) ufilter = ConfigCompiler::CompileText("<API query>", filter); /* create a new queue or update an existing one */ EventQueue::Ptr queue = EventQueue::GetByName(queueName); if (!queue) { queue = new EventQueue(queueName); EventQueue::Register(queueName, queue); } queue->SetTypes(types->ToSet<String>()); queue->SetFilter(ufilter); queue->AddClient(&request); response.SetStatus(200, "OK"); response.AddHeader("Content-Type", "application/json"); for (;;) { Dictionary::Ptr result = queue->WaitForEvent(&request); if (!response.IsPeerConnected()) { queue->RemoveClient(&request); EventQueue::UnregisterIfUnused(queueName, queue); return true; } if (!result) continue; String body = JsonEncode(result); boost::algorithm::replace_all(body, "\n", ""); try { response.WriteBody(body.CStr(), body.GetLength()); response.WriteBody("\n", 1); } catch (const std::exception&) { queue->RemoveClient(&request); EventQueue::UnregisterIfUnused(queueName, queue); throw; } } }