Program Listing for File http_internal.hpp

Return to documentation for file (/workspace/amdinfer/src/amdinfer/clients/http_internal.hpp)

// Copyright 2022 Xilinx, Inc.
// Copyright 2022 Advanced Micro Devices, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef GUARD_AMDINFER_CLIENTS_HTTP_INTERNAL
#define GUARD_AMDINFER_CLIENTS_HTTP_INTERNAL

#include <drogon/HttpRequest.h>   // for HttpRequestPtr
#include <drogon/HttpResponse.h>  // for HttpResponsePtr
#include <json/value.h>           // for Value

#include <cstddef>     // for size_t
#include <exception>   // for invalid_argument
#include <functional>  // for function
#include <memory>      // for shared_ptr
#include <string>      // for string
#include <vector>      // for vector

#include "amdinfer/build_options.hpp"   // for AMDINFER_ENABLE_TRACING
#include "amdinfer/core/interface.hpp"  // for Interface
#include "amdinfer/core/predict_api_internal.hpp"  // for InferenceRequestBui...
#include "amdinfer/declarations.hpp"               // for BufferRawPtrs, Infe...

namespace amdinfer {

RequestParametersPtr mapJsonToParameters(Json::Value json);
Json::Value mapParametersToJson(RequestParameters *parameters);

InferenceResponse mapJsonToResponse(Json::Value *json);
Json::Value mapRequestToJson(const InferenceRequest &request);

// class InferenceRequestOutputBuilder {
//  public:
//   static InferenceRequestOutput fromJson(
//     std::shared_ptr<Json::Value> const &req);
// };

template <>
class InferenceRequestBuilder<std::shared_ptr<Json::Value>> {
 public:
  static InferenceRequestPtr build(const std::shared_ptr<Json::Value> &req,
                                   const BufferRawPtrs &input_buffers,
                                   std::vector<size_t> &input_offsets,
                                   const BufferRawPtrs &output_buffers,
                                   std::vector<size_t> &output_offsets);
};

using RequestBuilder = InferenceRequestBuilder<std::shared_ptr<Json::Value>>;

#ifdef AMDINFER_ENABLE_TRACING
void propagate(drogon::HttpResponse *resp, const StringMap &context);
#endif

using DrogonCallback = std::function<void(const drogon::HttpResponsePtr &)>;

class DrogonHttp : public Interface {
 public:
  DrogonHttp(const drogon::HttpRequestPtr &req, DrogonCallback callback);

  std::shared_ptr<InferenceRequest> getRequest(
    const BufferRawPtrs &input_buffers, std::vector<size_t> &input_offsets,
    const BufferRawPtrs &output_buffers,
    std::vector<size_t> &output_offsets) override;

  size_t getInputSize() override;
  void errorHandler(const std::exception &e) override;

 private:
  drogon::HttpRequestPtr req_;
  DrogonCallback callback_;
  std::shared_ptr<Json::Value> json_;
};

drogon::HttpResponsePtr errorHttpResponse(const std::string &error,
                                          int status_code);

Json::Value modelMetadataToJson(const ModelMetadata &metadata);
ModelMetadata mapJsonToModelMetadata(const Json::Value *json);

}  // namespace amdinfer

#endif  // GUARD_AMDINFER_CLIENTS_HTTP_INTERNAL