Переглянути джерело

Init commit

Signed-off-by: haowei.yao <haowei.yao@alibaba-inc.com>
haowei.yao 8 роки тому
коміт
f6db1a27e4
100 змінених файлів з 6240 додано та 0 видалено
  1. 50 0
      3rdparty/CMakeLists.txt
  2. 52 0
      CMakeLists.txt
  3. 336 0
      Doxyfile
  4. 13 0
      LICENSE
  5. 1 0
      README.md
  6. 1 0
      VERSION
  7. 25 0
      core-tests/CMakeLists.txt
  8. 33 0
      core-tests/httpmessage.cc
  9. 18 0
      core-tests/main.cc
  10. 31 0
      core-tests/signer.cc
  11. 63 0
      core-tests/url.cc
  12. 181 0
      core/CMakeLists.txt
  13. 1 0
      core/include/alibabacloud/core/.gitignore
  14. 29 0
      core/include/alibabacloud/core/AlibabaCloud.h
  15. 38 0
      core/include/alibabacloud/core/AsyncCallerContext.h
  16. 49 0
      core/include/alibabacloud/core/ClientConfiguration.h
  17. 65 0
      core/include/alibabacloud/core/CommonClient.h
  18. 59 0
      core/include/alibabacloud/core/CommonRequest.h
  19. 38 0
      core/include/alibabacloud/core/CommonResponse.h
  20. 55 0
      core/include/alibabacloud/core/CoreClient.h
  21. 32 0
      core/include/alibabacloud/core/CoreExport.h
  22. 47 0
      core/include/alibabacloud/core/Credentials.h
  23. 36 0
      core/include/alibabacloud/core/CredentialsProvider.h
  24. 40 0
      core/include/alibabacloud/core/EcsInstanceProfileConfigLoader.h
  25. 51 0
      core/include/alibabacloud/core/EndpointProvider.h
  26. 48 0
      core/include/alibabacloud/core/Error.h
  27. 41 0
      core/include/alibabacloud/core/Global.h
  28. 34 0
      core/include/alibabacloud/core/HmacSha1Signer.h
  29. 43 0
      core/include/alibabacloud/core/HttpClient.h
  30. 82 0
      core/include/alibabacloud/core/HttpMessage.h
  31. 53 0
      core/include/alibabacloud/core/HttpRequest.h
  32. 43 0
      core/include/alibabacloud/core/HttpResponse.h
  33. 47 0
      core/include/alibabacloud/core/InstanceProfileConfigLoader.h
  34. 34 0
      core/include/alibabacloud/core/InstanceProfileCredentials.h
  35. 47 0
      core/include/alibabacloud/core/InstanceProfileCredentialsProvider.h
  36. 59 0
      core/include/alibabacloud/core/NetworkProxy.h
  37. 72 0
      core/include/alibabacloud/core/Outcome.h
  38. 52 0
      core/include/alibabacloud/core/Profile.h
  39. 54 0
      core/include/alibabacloud/core/RoaServiceClient.h
  40. 32 0
      core/include/alibabacloud/core/RoaServiceRequest.h
  41. 55 0
      core/include/alibabacloud/core/RpcServiceClient.h
  42. 36 0
      core/include/alibabacloud/core/RpcServiceRequest.h
  43. 35 0
      core/include/alibabacloud/core/Runnable.h
  44. 68 0
      core/include/alibabacloud/core/ServiceRequest.h
  45. 40 0
      core/include/alibabacloud/core/ServiceResult.h
  46. 46 0
      core/include/alibabacloud/core/Signer.h
  47. 37 0
      core/include/alibabacloud/core/SimpleCredentialsProvider.h
  48. 52 0
      core/include/alibabacloud/core/StsAssumeRoleCredentialsProvider.h
  49. 75 0
      core/include/alibabacloud/core/Url.h
  50. 51 0
      core/include/alibabacloud/core/location/LocationClient.h
  51. 38 0
      core/include/alibabacloud/core/location/LocationRequest.h
  52. 46 0
      core/include/alibabacloud/core/location/model/DescribeEndpointsRequest.h
  53. 64 0
      core/include/alibabacloud/core/location/model/DescribeEndpointsResult.h
  54. 60 0
      core/include/alibabacloud/core/sts/StsClient.h
  55. 38 0
      core/include/alibabacloud/core/sts/StsRequest.h
  56. 47 0
      core/include/alibabacloud/core/sts/model/AssumeRoleRequest.h
  57. 59 0
      core/include/alibabacloud/core/sts/model/AssumeRoleResult.h
  58. 41 0
      core/include/alibabacloud/core/sts/model/GetCallerIdentityRequest.h
  59. 49 0
      core/include/alibabacloud/core/sts/model/GetCallerIdentityResult.h
  60. 44 0
      core/src/AlibabaCloud.cc
  61. 44 0
      core/src/AsyncCallerContext.cc
  62. 61 0
      core/src/ClientConfiguration.cc
  63. 313 0
      core/src/CommonClient.cc
  64. 93 0
      core/src/CommonRequest.cc
  65. 38 0
      core/src/CommonResponse.cc
  66. 25 0
      core/src/Config.h.in
  67. 82 0
      core/src/CoreClient.cc
  68. 62 0
      core/src/Credentials.cc
  69. 17 0
      core/src/CredentialsProvider.cc
  70. 134 0
      core/src/CurlHttpClient.cc
  71. 37 0
      core/src/CurlHttpClient.h
  72. 41 0
      core/src/EcsInstanceProfileConfigLoader.cc
  73. 27 0
      core/src/EcsMetadataClient.cc
  74. 32 0
      core/src/EcsMetadataClient.h
  75. 77 0
      core/src/EndpointProvider.cc
  76. 36 0
      core/src/Error.cc
  77. 124 0
      core/src/Executor.cc
  78. 53 0
      core/src/Executor.h
  79. 99 0
      core/src/HmacSha1Signer.cc
  80. 41 0
      core/src/HttpClient.cc
  81. 173 0
      core/src/HttpMessage.cc
  82. 51 0
      core/src/HttpRequest.cc
  83. 57 0
      core/src/HttpResponse.cc
  84. 65 0
      core/src/InstanceProfileConfigLoader.cc
  85. 28 0
      core/src/InstanceProfileCredentials.cc
  86. 78 0
      core/src/InstanceProfileCredentialsProvider.cc
  87. 86 0
      core/src/NetworkProxy.cc
  88. 17 0
      core/src/Outcome.cc
  89. 61 0
      core/src/Profile.cc
  90. 179 0
      core/src/RoaServiceClient.cc
  91. 32 0
      core/src/RoaServiceRequest.cc
  92. 130 0
      core/src/RpcServiceClient.cc
  93. 40 0
      core/src/RpcServiceRequest.cc
  94. 29 0
      core/src/Runnable.cc
  95. 157 0
      core/src/ServiceRequest.cc
  96. 38 0
      core/src/ServiceResult.cc
  97. 45 0
      core/src/Signer.cc
  98. 40 0
      core/src/SimpleCredentialsProvider.cc
  99. 88 0
      core/src/StsAssumeRoleCredentialsProvider.cc
  100. 344 0
      core/src/Url.cc

+ 50 - 0
3rdparty/CMakeLists.txt

@@ -0,0 +1,50 @@
+#
+# Copyright 2009-2017 Alibaba Cloud All rights reserved.
+# 
+# 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.
+#
+
+if(CMAKE_HOST_WIN32)
+	ExternalProject_Add(jsoncpp
+		URL https://github.com/open-source-parsers/jsoncpp/archive/0.10.5.tar.gz
+		CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
+			-DJSONCPP_WITH_TESTS=OFF
+			-DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF
+			-DJSONCPP_WITH_WARNING_AS_ERROR=OFF
+			-DJSONCPP_WITH_PKGCONFIG_SUPPORT=OFF
+			-DJSONCPP_WITH_CMAKE_PACKAGE=OFF
+			-DBUILD_SHARED_LIBS=OFF
+			-DBUILD_STATIC_LIBS=ON
+		)
+
+ExternalProject_Add(curl
+	URL https://github.com/curl/curl/releases/download/curl-7_55_1/curl-7.55.1.tar.gz
+	CMAKE_ARGS -DBUILD_CURL_EXE=OFF
+		-DBUILD_TESTING=OFF
+		-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
+		-DCMAKE_USE_WINSSL=ON
+		-DCURL_STATICLIB=ON
+		-DENABLE_MANUAL=OFF
+		-DHTTP_ONLY=ON
+	)
+endif()
+
+ExternalProject_Add(catch
+	URL https://github.com/catchorg/Catch2/releases/download/v2.0.1/catch.hpp
+	TIMEOUT 10
+	DOWNLOAD_NO_EXTRACT 1
+	CONFIGURE_COMMAND ""
+	BUILD_COMMAND ""
+	INSTALL_COMMAND
+		${CMAKE_COMMAND} -E copy_if_different <DOWNLOADED_FILE> <INSTALL_DIR>
+	)

+ 52 - 0
CMakeLists.txt

@@ -0,0 +1,52 @@
+#
+# Copyright 2009-2017 Alibaba Cloud All rights reserved.
+# 
+# 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.
+#
+
+cmake_minimum_required(VERSION 3.1)
+
+cmake_policy(SET CMP0048 NEW)
+
+file(STRINGS "VERSION" version)
+
+project(alibabacloud-sdk VERSION ${version})
+
+message(STATUS "Project version: ${PROJECT_VERSION}")
+
+set(TARGET_OUTPUT_NAME_PREFIX "alibabacloud-sdk-" CACHE STRING "The target's output name prefix")
+option(BUILD_SHARED_LIBS  "Enable shared library" ON)
+option(BUILD_TESTS "Enable tests" ON)
+
+set(LIB_TYPE STATIC)
+if(BUILD_SHARED_LIBS)
+	set(LIB_TYPE SHARED)
+	add_definitions(-DALIBABACLOUD_SHARED)
+endif()
+
+set_property(GLOBAL
+	PROPERTY
+	USE_FOLDERS ON)
+
+set(CMAKE_CXX_STANDARD 11)
+
+include(ExternalProject)
+include(GNUInstallDirs)
+
+add_subdirectory(3rdparty)
+add_subdirectory(core)
+
+if(BUILD_TESTS)
+	enable_testing()
+	add_subdirectory(core-tests)
+endif()

+ 336 - 0
Doxyfile

@@ -0,0 +1,336 @@
+# Doxyfile 1.8.13
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+DOXYFILE_ENCODING      = UTF-8
+PROJECT_NAME           = "alibabacloud-cpp-sdk"
+PROJECT_NUMBER         = 0.0.1
+PROJECT_BRIEF          = "Alibaba Cloud SDK for C++"
+PROJECT_LOGO           =
+OUTPUT_DIRECTORY       =
+CREATE_SUBDIRS         = NO
+ALLOW_UNICODE_NAMES    = NO
+OUTPUT_LANGUAGE        = English
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = YES
+ABBREVIATE_BRIEF       = "The $name class" \
+                         "The $name widget" \
+                         "The $name file" \
+                         is \
+                         provides \
+                         specifies \
+                         contains \
+                         represents \
+                         a \
+                         an \
+                         the
+ALWAYS_DETAILED_SEC    = NO
+INLINE_INHERITED_MEMB  = NO
+FULL_PATH_NAMES        = YES
+STRIP_FROM_PATH        =
+STRIP_FROM_INC_PATH    =
+SHORT_NAMES            = NO
+JAVADOC_AUTOBRIEF      = NO
+QT_AUTOBRIEF           = NO
+MULTILINE_CPP_IS_BRIEF = NO
+INHERIT_DOCS           = YES
+SEPARATE_MEMBER_PAGES  = NO
+TAB_SIZE               = 4
+ALIASES                =
+TCL_SUBST              =
+OPTIMIZE_OUTPUT_FOR_C  = NO
+OPTIMIZE_OUTPUT_JAVA   = NO
+OPTIMIZE_FOR_FORTRAN   = NO
+OPTIMIZE_OUTPUT_VHDL   = NO
+EXTENSION_MAPPING      =
+MARKDOWN_SUPPORT       = YES
+TOC_INCLUDE_HEADINGS   = 0
+AUTOLINK_SUPPORT       = YES
+BUILTIN_STL_SUPPORT    = YES
+CPP_CLI_SUPPORT        = NO
+SIP_SUPPORT            = NO
+IDL_PROPERTY_SUPPORT   = YES
+DISTRIBUTE_GROUP_DOC   = NO
+GROUP_NESTED_COMPOUNDS = NO
+SUBGROUPING            = YES
+INLINE_GROUPED_CLASSES = NO
+INLINE_SIMPLE_STRUCTS  = NO
+TYPEDEF_HIDES_STRUCT   = NO
+LOOKUP_CACHE_SIZE      = 0
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = NO
+EXTRACT_PRIVATE        = NO
+EXTRACT_PACKAGE        = NO
+EXTRACT_STATIC         = NO
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = NO
+EXTRACT_ANON_NSPACES   = NO
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = NO
+CASE_SENSE_NAMES       = NO
+HIDE_SCOPE_NAMES       = NO
+HIDE_COMPOUND_REFERENCE= NO
+SHOW_INCLUDE_FILES     = YES
+SHOW_GROUPED_MEMB_INC  = NO
+FORCE_LOCAL_INCLUDES   = NO
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = NO
+SORT_MEMBERS_CTORS_1ST = NO
+SORT_GROUP_NAMES       = NO
+SORT_BY_SCOPE_NAME     = NO
+STRICT_PROTO_MATCHING  = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       =
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = NO
+SHOW_FILES             = NO
+SHOW_NAMESPACES        = YES
+FILE_VERSION_FILTER    =
+LAYOUT_FILE            =
+CITE_BIB_FILES         =
+#---------------------------------------------------------------------------
+# Configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_NO_PARAMDOC       = NO
+WARN_AS_ERROR          = NO
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           =
+#---------------------------------------------------------------------------
+# Configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = ./
+INPUT_ENCODING         = UTF-8
+FILE_PATTERNS          = *.cc \
+                         *.h \
+                         *.md
+RECURSIVE              = YES
+EXCLUDE                =
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = */3rdparty/* \
+                         */CMakeFiles/* \
+                         */src/*.h \
+                         */tests/*
+EXCLUDE_SYMBOLS        =
+EXAMPLE_PATH           =
+EXAMPLE_PATTERNS       = *
+EXAMPLE_RECURSIVE      = NO
+IMAGE_PATH             =
+INPUT_FILTER           =
+FILTER_PATTERNS        =
+FILTER_SOURCE_FILES    = NO
+FILTER_SOURCE_PATTERNS =
+USE_MDFILE_AS_MAINPAGE = ./README.md
+#---------------------------------------------------------------------------
+# Configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = NO
+STRIP_CODE_COMMENTS    = YES
+REFERENCED_BY_RELATION = NO
+REFERENCES_RELATION    = NO
+REFERENCES_LINK_SOURCE = YES
+SOURCE_TOOLTIPS        = YES
+USE_HTAGS              = NO
+VERBATIM_HEADERS       = YES
+CLANG_ASSISTED_PARSING = NO
+CLANG_OPTIONS          =
+#---------------------------------------------------------------------------
+# Configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = YES
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          =
+#---------------------------------------------------------------------------
+# Configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            =
+HTML_FOOTER            =
+HTML_STYLESHEET        =
+HTML_EXTRA_STYLESHEET  =
+HTML_EXTRA_FILES       =
+HTML_COLORSTYLE_HUE    = 220
+HTML_COLORSTYLE_SAT    = 100
+HTML_COLORSTYLE_GAMMA  = 80
+HTML_TIMESTAMP         = NO
+HTML_DYNAMIC_SECTIONS  = NO
+HTML_INDEX_NUM_ENTRIES = 100
+GENERATE_DOCSET        = NO
+DOCSET_FEEDNAME        = "Doxygen generated docs"
+DOCSET_BUNDLE_ID       = org.doxygen.Project
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
+DOCSET_PUBLISHER_NAME  = Publisher
+GENERATE_HTMLHELP      = NO
+CHM_FILE               =
+HHC_LOCATION           =
+GENERATE_CHI           = NO
+CHM_INDEX_ENCODING     =
+BINARY_TOC             = NO
+TOC_EXPAND             = NO
+GENERATE_QHP           = NO
+QCH_FILE               =
+QHP_NAMESPACE          = org.doxygen.Project
+QHP_VIRTUAL_FOLDER     = doc
+QHP_CUST_FILTER_NAME   =
+QHP_CUST_FILTER_ATTRS  =
+QHP_SECT_FILTER_ATTRS  =
+QHG_LOCATION           =
+GENERATE_ECLIPSEHELP   = NO
+ECLIPSE_DOC_ID         = org.doxygen.Project
+DISABLE_INDEX          = NO
+GENERATE_TREEVIEW      = NO
+ENUM_VALUES_PER_LINE   = 4
+TREEVIEW_WIDTH         = 250
+EXT_LINKS_IN_WINDOW    = NO
+FORMULA_FONTSIZE       = 10
+FORMULA_TRANSPARENT    = YES
+USE_MATHJAX            = NO
+MATHJAX_FORMAT         = HTML-CSS
+MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
+MATHJAX_EXTENSIONS     =
+MATHJAX_CODEFILE       =
+SEARCHENGINE           = YES
+SERVER_BASED_SEARCH    = NO
+EXTERNAL_SEARCH        = NO
+SEARCHENGINE_URL       =
+SEARCHDATA_FILE        = searchdata.xml
+EXTERNAL_SEARCH_ID     =
+EXTRA_SEARCH_MAPPINGS  =
+#---------------------------------------------------------------------------
+# Configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = YES
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4
+EXTRA_PACKAGES         =
+LATEX_HEADER           =
+LATEX_FOOTER           =
+LATEX_EXTRA_STYLESHEET =
+LATEX_EXTRA_FILES      =
+PDF_HYPERLINKS         = YES
+USE_PDFLATEX           = YES
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+LATEX_SOURCE_CODE      = NO
+LATEX_BIB_STYLE        = plain
+LATEX_TIMESTAMP        = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    =
+RTF_EXTENSIONS_FILE    =
+RTF_SOURCE_CODE        = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_SUBDIR             =
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
+GENERATE_DOCBOOK       = NO
+DOCBOOK_OUTPUT         = docbook
+DOCBOOK_PROGRAMLISTING = NO
+#---------------------------------------------------------------------------
+# Configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# Configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX =
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           =
+INCLUDE_FILE_PATTERNS  =
+PREDEFINED             =
+EXPAND_AS_DEFINED      =
+SKIP_FUNCTION_MACROS   = YES
+#---------------------------------------------------------------------------
+# Configuration options related to external references
+#---------------------------------------------------------------------------
+TAGFILES               =
+GENERATE_TAGFILE       =
+ALLEXTERNALS           = NO
+EXTERNAL_GROUPS        = YES
+EXTERNAL_PAGES         = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+MSCGEN_PATH            =
+DIA_PATH               =
+HIDE_UNDOC_RELATIONS   = YES
+HAVE_DOT               = NO
+DOT_NUM_THREADS        = 0
+DOT_FONTNAME           = Helvetica
+DOT_FONTSIZE           = 10
+DOT_FONTPATH           =
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+GROUP_GRAPHS           = YES
+UML_LOOK               = NO
+UML_LIMIT_NUM_FIELDS   = 10
+TEMPLATE_RELATIONS     = NO
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = NO
+CALLER_GRAPH           = NO
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
+INTERACTIVE_SVG        = NO
+DOT_PATH               =
+DOTFILE_DIRS           =
+MSCFILE_DIRS           =
+DIAFILE_DIRS           =
+PLANTUML_JAR_PATH      =
+PLANTUML_CFG_FILE      =
+PLANTUML_INCLUDE_PATH  =
+DOT_GRAPH_MAX_NODES    = 50
+MAX_DOT_GRAPH_DEPTH    = 0
+DOT_TRANSPARENT        = NO
+DOT_MULTI_TARGETS      = NO
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES

+ 13 - 0
LICENSE

@@ -0,0 +1,13 @@
+Copyright 2009-2017 Alibaba Cloud All rights reserved.
+
+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.

+ 1 - 0
README.md

@@ -0,0 +1 @@
+# Alibaba Cloud SDK for C++

+ 1 - 0
VERSION

@@ -0,0 +1 @@
+0.0.1

+ 25 - 0
core-tests/CMakeLists.txt

@@ -0,0 +1,25 @@
+add_executable(core-tests
+	main.cc
+	httpmessage.cc
+	signer.cc
+	url.cc )
+
+set_target_properties(core-tests
+	PROPERTIES
+	OUTPUT_NAME ${TARGET_OUTPUT_NAME_PREFIX}core-tests
+	RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
+
+target_link_libraries(core-tests
+	core
+	)
+	
+ExternalProject_Get_Property(catch INSTALL_DIR)
+set(catch_install_dir ${INSTALL_DIR})
+add_dependencies(core-tests catch)
+
+target_include_directories(core-tests
+	PRIVATE ${catch_install_dir}
+		${CMAKE_SOURCE_DIR}/core/include
+	)
+
+add_test(NAME core-tests COMMAND core-tests)

+ 33 - 0
core-tests/httpmessage.cc

@@ -0,0 +1,33 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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.
+*/
+
+#include <catch.hpp>
+#include <alibabacloud/core/HttpRequest.h>
+
+using namespace AlibabaCloud;
+
+TEST_CASE("testHttpMessage")
+{
+	const std::string data = "Thu, 19 Oct 2017 04:38:27 GMT";
+	HttpRequest r;
+	r.setHeader("accept", "application/xml");
+	r.setHeader("Accept", "application/json");
+	r.setHeader("Date", data);
+
+	REQUIRE(r.headers().size() == 2);
+	REQUIRE(r.header("accept") == "application/json");
+	REQUIRE(r.header(HttpMessage::KnownHeader::Date) == data);
+}

+ 18 - 0
core-tests/main.cc

@@ -0,0 +1,18 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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.
+*/
+
+#define CATCH_CONFIG_MAIN
+#include <catch.hpp>

+ 31 - 0
core-tests/signer.cc

@@ -0,0 +1,31 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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.
+*/
+
+#include <catch.hpp>
+#include <alibabacloud/core/HmacSha1Signer.h>
+
+using namespace AlibabaCloud;
+
+TEST_CASE("testHmacSha1Signer")
+{
+	HmacSha1Signer sig;
+	std::string sign = sig.generate("GET&%2F&AccessKeyId%3Dtestid%26Action%3DDescribeRegions"
+		"%26Format%3DXML%26RegionId%3Dregion1%26SignatureMethod%3DHMAC-SHA1"
+		"%26SignatureNonce%3DNwDAxvLU6tFE0DVb%26SignatureVersion%3D1.0"
+		"%26TimeStamp%3D2012-12-26T10%253A33%253A56Z%26Version%3D2013-01-10",
+		"testsecret&");
+	REQUIRE("axE3FUHgDyfm9/+Iep0HpZXrRwE=" == sign);
+}

+ 63 - 0
core-tests/url.cc

@@ -0,0 +1,63 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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.
+*/
+
+#include <catch.hpp>
+#include <alibabacloud/core/Url.h>
+
+using namespace AlibabaCloud;
+
+TEST_CASE("testUrl")
+{
+	const std::string src = "abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1";
+	Url url;
+	url.setScheme("abc");
+	url.setUserName("username");
+	url.setPassword("password");
+	url.setHost("example.com");
+	url.setPath("/path/data");
+	url.setPort(123);
+	url.setQuery("key=value&key2=value2");
+	url.setFragment("fragid1");
+	REQUIRE(url.toString() == src);
+	
+	url.clear();
+	url.fromString(src);
+	REQUIRE(url.scheme() == "abc");
+	REQUIRE(url.userName() == "username");
+	REQUIRE(url.password() == "password");
+	REQUIRE(url.host() == "example.com");
+	REQUIRE(url.path() == "/path/data");
+	REQUIRE(url.port() == 123);
+	REQUIRE(url.query() == "key=value&key2=value2");
+	REQUIRE(url.fragment() == "fragid1");
+
+	Url newurl = url;
+	REQUIRE(newurl == url);
+}
+
+TEST_CASE("testUrl2")
+{
+	const std::string src = "http://oss.example.com";
+	Url url(src);
+	REQUIRE(url.scheme() == "http");
+	REQUIRE(url.userName() == "");
+	REQUIRE(url.password() == "");
+	REQUIRE(url.host() == "oss.example.com");
+	REQUIRE(url.path() == "/");
+	REQUIRE(url.port() == -1);
+	REQUIRE(url.query() == "");
+	REQUIRE(url.fragment() == "");
+}

+ 181 - 0
core/CMakeLists.txt

@@ -0,0 +1,181 @@
+#
+# Copyright 2009-2017 Alibaba Cloud All rights reserved.
+# 
+# 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.
+#
+
+configure_file(src/Config.h.in ${CMAKE_CURRENT_SOURCE_DIR}/include/alibabacloud/core/Config.h @ONLY)
+
+set(core_public_header
+	include/alibabacloud/core/AlibabaCloud.h
+	include/alibabacloud/core/AsyncCallerContext.h
+	include/alibabacloud/core/ClientConfiguration.h
+	include/alibabacloud/core/CommonClient.h
+	include/alibabacloud/core/CommonRequest.h
+	include/alibabacloud/core/CommonResponse.h
+	include/alibabacloud/core/Config.h
+	include/alibabacloud/core/CoreClient.h
+	include/alibabacloud/core/CoreExport.h
+	include/alibabacloud/core/Credentials.h
+	include/alibabacloud/core/CredentialsProvider.h
+	include/alibabacloud/core/EcsInstanceProfileConfigLoader.h
+	include/alibabacloud/core/EndpointProvider.h
+	include/alibabacloud/core/Error.h
+	include/alibabacloud/core/Global.h
+	include/alibabacloud/core/HmacSha1Signer.h
+	include/alibabacloud/core/HttpClient.h
+	include/alibabacloud/core/HttpMessage.h
+	include/alibabacloud/core/HttpResponse.h
+	include/alibabacloud/core/HttpRequest.h
+	include/alibabacloud/core/InstanceProfileConfigLoader.h
+	include/alibabacloud/core/InstanceProfileCredentialsProvider.h
+	include/alibabacloud/core/NetworkProxy.h
+	include/alibabacloud/core/Outcome.h
+	include/alibabacloud/core/Profile.h
+	include/alibabacloud/core/Runnable.h
+	include/alibabacloud/core/RoaServiceClient.h
+	include/alibabacloud/core/RoaServiceRequest.h
+	include/alibabacloud/core/RpcServiceClient.h
+	include/alibabacloud/core/RpcServiceRequest.h
+	include/alibabacloud/core/ServiceRequest.h
+	include/alibabacloud/core/ServiceResult.h
+	include/alibabacloud/core/Signer.h
+	include/alibabacloud/core/SimpleCredentialsProvider.h
+	include/alibabacloud/core/StsAssumeRoleCredentialsProvider.h
+	include/alibabacloud/core/Url.h
+	include/alibabacloud/core/location/LocationClient.h
+	include/alibabacloud/core/location/LocationRequest.h
+	include/alibabacloud/core/location/model/DescribeEndpointsRequest.h
+	include/alibabacloud/core/location/model/DescribeEndpointsResult.h
+	include/alibabacloud/core/sts/StsClient.h
+	include/alibabacloud/core/sts/StsRequest.h
+	include/alibabacloud/core/sts/model/AssumeRoleRequest.h
+	include/alibabacloud/core/sts/model/AssumeRoleResult.h
+	include/alibabacloud/core/sts/model/GetCallerIdentityRequest.h
+	include/alibabacloud/core/sts/model/GetCallerIdentityResult.h
+	)
+
+set(core_src
+	src/AlibabaCloud.cc
+	src/AsyncCallerContext.cc
+	src/ClientConfiguration.cc
+	src/CommonClient.cc
+	src/CommonRequest.cc
+	src/CommonResponse.cc
+	src/CoreClient.cc
+	src/Credentials.cc
+	src/CredentialsProvider.cc
+	src/CurlHttpClient.h
+	src/CurlHttpClient.cc
+	src/EcsInstanceProfileConfigLoader.cc
+	src/EcsMetadataClient.h
+	src/EcsMetadataClient.cc
+	src/EndpointProvider.cc
+	src/Error.cc
+	src/Executor.cc
+	src/Executor.h
+	src/HmacSha1Signer.cc
+	src/HttpClient.cc
+	src/HttpMessage.cc
+	src/HttpResponse.cc
+	src/HttpRequest.cc
+	src/InstanceProfileConfigLoader.cc
+	src/InstanceProfileCredentialsProvider.cc
+	src/NetworkProxy.cc
+	src/Outcome.cc
+	src/Profile.cc
+	src/Runnable.cc
+	src/RoaServiceClient.cc
+	src/RoaServiceRequest.cc
+	src/RpcServiceClient.cc
+	src/RpcServiceRequest.cc
+	src/ServiceRequest.cc
+	src/ServiceResult.cc
+	src/Signer.cc
+	src/SimpleCredentialsProvider.cc
+	src/StsAssumeRoleCredentialsProvider.cc
+	src/Url.cc
+	src/Utils.h
+	src/Utils.cc
+	src/location/LocationClient.cc
+	src/location/LocationRequest.cc
+	src/location/model/DescribeEndpointsRequest.cc
+	src/location/model/DescribeEndpointsResult.cc
+	src/sts/StsClient.cc
+	src/sts/StsRequest.cc
+	src/sts/model/AssumeRoleRequest.cc
+	src/sts/model/AssumeRoleResult.cc	
+	src/sts/model/GetCallerIdentityRequest.cc
+	src/sts/model/GetCallerIdentityResult.cc
+	)
+
+add_library(core ${LIB_TYPE} ${core_public_header} ${core_src})
+
+set_target_properties(core
+	PROPERTIES
+	LINKER_LANGUAGE CXX
+	ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
+	LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib
+	RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin
+	OUTPUT_NAME ${TARGET_OUTPUT_NAME_PREFIX}core
+	PUBLIC_HEADER "${core_public_header}"
+	)
+
+if(${LIB_TYPE} STREQUAL "SHARED")
+	set_target_properties(core
+		PROPERTIES
+		DEFINE_SYMBOL ALIBABACLOUD_CORE_LIBRARY)
+endif()
+
+target_include_directories(core
+	PRIVATE include )
+
+if(CMAKE_HOST_WIN32)
+	ExternalProject_Get_Property(curl INSTALL_DIR)
+	set(curl_install_dir ${INSTALL_DIR})
+	ExternalProject_Get_Property(jsoncpp INSTALL_DIR)
+	set(jsoncpp_install_dir ${INSTALL_DIR})
+	add_dependencies(core
+		curl
+		jsoncpp )
+	target_include_directories(core
+		PRIVATE	${curl_install_dir}/include
+			${jsoncpp_install_dir}/include
+			${tinyxml2_install_dir}/include)
+	target_link_libraries(core
+		Crypt32
+		Rpcrt4
+		Ws2_32
+		${jsoncpp_install_dir}/lib/jsoncpp.lib
+		debug ${curl_install_dir}/lib/libcurl-d.lib
+		optimized ${curl_install_dir}/lib/libcurl.lib
+		)
+	target_compile_definitions(core
+		PRIVATE CURL_STATICLIB
+			_CRT_SECURE_NO_WARNINGS)
+else()
+	target_include_directories(core
+		PRIVATE /usr/include/jsoncpp)
+	target_link_libraries(core
+		crypto
+		curl
+		jsoncpp
+		uuid )
+endif()
+
+install(TARGETS core
+	ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+	LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+	RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+	PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/alibabacloud/core
+	)

+ 1 - 0
core/include/alibabacloud/core/.gitignore

@@ -0,0 +1 @@
+Config.h

+ 29 - 0
core/include/alibabacloud/core/AlibabaCloud.h

@@ -0,0 +1,29 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_ALIBABACLOUD_H_
+#define ALIBABACLOUD_CORE_ALIBABACLOUD_H_
+
+#include "CoreExport.h"
+
+namespace AlibabaCloud
+{
+	ALIBABACLOUD_CORE_EXPORT void InitializeSdk();
+	ALIBABACLOUD_CORE_EXPORT bool IsSdkInitialized();
+	ALIBABACLOUD_CORE_EXPORT void ShutdownSdk();
+}
+
+#endif

+ 38 - 0
core/include/alibabacloud/core/AsyncCallerContext.h

@@ -0,0 +1,38 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_ASYNCCALLERCONTEXT_H_
+#define ALIBABACLOUD_CORE_ASYNCCALLERCONTEXT_H_
+
+#include <string>
+#include "CoreExport.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT AsyncCallerContext
+	{
+	public:
+		AsyncCallerContext();
+		explicit AsyncCallerContext(const std::string &uuid);
+		virtual ~AsyncCallerContext();
+		
+		std::string uuid()const;
+		void setUuid(const std::string &uuid);
+	private:
+		std::string uuid_;
+	};
+}
+#endif

+ 49 - 0
core/include/alibabacloud/core/ClientConfiguration.h

@@ -0,0 +1,49 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_CLIENTCONFIGURATION_H_
+#define ALIBABACLOUD_CORE_CLIENTCONFIGURATION_H_
+
+#include <memory>
+#include <string>
+#include "CredentialsProvider.h"
+#include "CoreExport.h"
+#include "NetworkProxy.h"
+#include "Signer.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT ClientConfiguration
+	{
+	public:
+		explicit ClientConfiguration(const std::string &regionId = "cn-hangzhou",
+			const NetworkProxy &proxy = NetworkProxy());
+		~ClientConfiguration();
+
+		std::string endpoint()const;
+		NetworkProxy proxy()const;
+		std::string regionId()const;
+		void setEndpoint(const std::string &endpoint);
+		void setProxy(const NetworkProxy &proxy);
+		void setRegionId(const std::string &regionId);
+	private:
+		std::string endpoint_;
+		NetworkProxy proxy_;
+		std::string regionId_;
+	};
+}
+
+#endif // !ALIBABACLOUD_CORE_CLIENTCONFIGURATION_H_

+ 65 - 0
core/include/alibabacloud/core/CommonClient.h

@@ -0,0 +1,65 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_CORE_COMMONCLIENT_H_
+#define ALIBABACLOUD_CORE_COMMONCLIENT_H_
+
+#include <future>
+#include "ClientConfiguration.h"
+#include "CoreExport.h"
+#include "CoreClient.h"
+#include "CredentialsProvider.h"
+#include "EndpointProvider.h"
+#include "CommonRequest.h"
+#include "CommonResponse.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT CommonClient : public CoreClient
+	{
+	public:
+		typedef Outcome<Error, CommonResponse> CommonResponseOutcome;
+		typedef std::future<CommonResponseOutcome> CommonResponseOutcomeCallable;
+		typedef std::function<void(const CommonClient*, const CommonRequest&, const CommonResponseOutcome&, const std::shared_ptr<const AsyncCallerContext>&)> CommonResponseAsyncHandler;
+		typedef Outcome<Error, std::string> JsonOutcome;
+		
+		CommonClient(const Credentials &credentials, const ClientConfiguration &configuration);
+		CommonClient(const std::shared_ptr<CredentialsProvider> &credentialsProvider, const ClientConfiguration &configuration);
+		CommonClient(const std::string &accessKeyId, const std::string &accessKeySecret, const ClientConfiguration &configuration);
+		~CommonClient();
+
+		CommonResponseOutcome commonResponse(const CommonRequest &request)const;
+		void commonResponseAsync(const CommonRequest& request, const CommonResponseAsyncHandler& handler, const std::shared_ptr<const AsyncCallerContext>& context = nullptr) const;
+		CommonResponseOutcomeCallable commonResponseCallable(const CommonRequest& request) const;
+
+	protected:
+		virtual HttpRequest buildHttpRequest(const std::string & endpoint, const ServiceRequest & msg, HttpRequest::Method method) const override;
+		HttpRequest buildHttpRequest(const std::string & endpoint, const CommonRequest &msg, HttpRequest::Method method) const;
+		HttpRequest buildRoaHttpRequest(const std::string & endpoint, const CommonRequest &msg, HttpRequest::Method method) const;
+		HttpRequest buildRpcHttpRequest(const std::string & endpoint, const CommonRequest &msg, HttpRequest::Method method) const;
+		virtual EndpointOutcome endpoint() const override;
+		JsonOutcome makeRequest(const std::string &endpoint, const CommonRequest &msg, HttpRequest::Method method = HttpRequest::Method::Get)const;
+
+	private:
+		std::string canonicalizedQuery(const std::map <std::string, std::string> &params)const;
+		std::string canonicalizedHeaders(const HttpMessage::HeaderCollection &headers)const;
+
+		std::shared_ptr<CredentialsProvider> credentialsProvider_;
+		std::shared_ptr<EndpointProvider> endpointProvider_;
+		std::shared_ptr<Signer> signer_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_COMMONCLIENT_H_

+ 59 - 0
core/include/alibabacloud/core/CommonRequest.h

@@ -0,0 +1,59 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_CORE_COMMONREQUEST_H_
+#define ALIBABACLOUD_CORE_COMMONREQUEST_H_
+
+#include <string>
+#include "CoreExport.h"
+#include "ServiceRequest.h"
+#include "HttpRequest.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT CommonRequest : public ServiceRequest
+	{
+	public:
+		CommonRequest();
+		~CommonRequest();
+
+		std::string domain()const;
+		ParameterValueType headerParameter(const ParameterNameType &name)const;
+		ParameterCollection headerParameters()const;
+		HttpRequest::Method httpMethod()const;
+		ParameterValueType queryParameter(const ParameterNameType &name)const;
+		ParameterCollection queryParameters()const;
+		using ServiceRequest::setContent;
+		void setDomain(const std::string &domain);
+		void setHeaderParameter(const ParameterNameType &name, const ParameterValueType &value);
+		void setHttpMethod(HttpRequest::Method method);
+		void setQueryParameter(const ParameterNameType &name, const ParameterValueType &value);
+		using ServiceRequest::setResourcePath;
+		void setUriPattern(const std::string &uriPattern);
+		using ServiceRequest::setVersion;
+		std::string uriPattern()const;
+	protected:
+		using ServiceRequest::product;
+
+	private:
+		std::string domain_;
+		std::string uriPattern_;
+		ParameterCollection queryParams_;
+		ParameterCollection headerParams_;
+		HttpRequest::Method httpMethod_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_COMMONREQUEST_H_

+ 38 - 0
core/include/alibabacloud/core/CommonResponse.h

@@ -0,0 +1,38 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_CORE_COMMONRESPONSE_H_
+#define ALIBABACLOUD_CORE_COMMONRESPONSE_H_
+
+#include <string>
+#include "CoreExport.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT CommonResponse
+	{
+	public:
+		CommonResponse();
+		explicit CommonResponse(const std::string &payload);
+		~CommonResponse();
+
+		std::string payload()const;
+	private:
+		std::string payload_;
+
+	};
+}
+#endif // !ALIBABACLOUD_CORE_COMMONRESPONSE_H_

+ 55 - 0
core/include/alibabacloud/core/CoreClient.h

@@ -0,0 +1,55 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_CORECLIENT_H_
+#define ALIBABACLOUD_CORE_CORECLIENT_H_
+
+#include <functional>
+#include <memory>
+#include "ClientConfiguration.h"
+#include "CoreExport.h"
+#include "HttpClient.h"
+#include "HttpResponse.h"
+#include "HttpRequest.h"
+#include "Outcome.h"
+#include "ServiceRequest.h"
+#include "Runnable.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT CoreClient
+	{
+	public:
+		CoreClient(const ClientConfiguration &configuration);
+		virtual ~CoreClient();
+
+		ClientConfiguration configuration()const;
+	protected:
+		typedef Outcome<Error, std::string> EndpointOutcome;
+
+		HttpClient::HttpResponseOutcome AttemptRequest(const std::string & endpoint, const ServiceRequest &request, HttpRequest::Method method)const;
+		Error buildCoreError(const HttpResponse &response)const;
+		bool hasResponseError(const HttpResponse &response)const;
+		virtual HttpRequest buildHttpRequest(const std::string & endpoint, const ServiceRequest &msg, HttpRequest::Method method)const = 0;
+		void asyncExecute(Runnable * r)const;
+		virtual EndpointOutcome endpoint()const = 0;
+	private:
+		ClientConfiguration configuration_;
+		std::shared_ptr<CredentialsProvider> credentialsProvider_;
+		HttpClient *httpClient_;
+	};
+}
+#endif

+ 32 - 0
core/include/alibabacloud/core/CoreExport.h

@@ -0,0 +1,32 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_COREEXPORT_H_
+#define ALIBABACLOUD_CORE_COREEXPORT_H_
+
+#include "Global.h"
+
+#if defined(ALIBABACLOUD_SHARED)
+#	if defined(ALIBABACLOUD_CORE_LIBRARY)
+#		define ALIBABACLOUD_CORE_EXPORT ALIBABACLOUD_DECL_EXPORT
+#	else
+#		define ALIBABACLOUD_CORE_EXPORT ALIBABACLOUD_DECL_IMPORT
+#	endif
+#else
+#	define ALIBABACLOUD_CORE_EXPORT
+#endif
+
+#endif // !ALIBABACLOUD_CORE_COREEXPORT_H_

+ 47 - 0
core/include/alibabacloud/core/Credentials.h

@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_CREDENTIAL_H_
+#define ALIBABACLOUD_CORE_CREDENTIAL_H_
+
+#include <string>
+#include "CoreExport.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT Credentials
+	{
+		public:
+			Credentials(const std::string &accessKeyId,
+					const std::string &accessKeySecret,
+					const std::string &sessionToken="");
+			~Credentials();
+
+			std::string accessKeyId () const;
+			std::string accessKeySecret () const;
+			void setAccessKeyId(const std::string &accessKeyId);
+			void setAccessKeySecret(const std::string &accessKeySecret);
+			void setSessionToken (const std::string &sessionToken);
+			std::string sessionToken () const;
+
+		private:
+			std::string accessKeyId_;
+			std::string accessKeySecret_;
+			std::string sessionToken_;
+	};
+}
+
+#endif // !ALIBABACLOUD_CORE_CREDENTIAL_H_

+ 36 - 0
core/include/alibabacloud/core/CredentialsProvider.h

@@ -0,0 +1,36 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_CREDENTIALSPROVIDER_H_
+#define ALIBABACLOUD_CORE_CREDENTIALSPROVIDER_H_
+
+#include "CoreExport.h"
+#include "Credentials.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT CredentialsProvider
+	{
+	public:
+		CredentialsProvider() = default;
+		virtual	~CredentialsProvider() = default;
+
+		virtual Credentials getCredentials() = 0;
+	private:
+
+	};
+}
+#endif

+ 40 - 0
core/include/alibabacloud/core/EcsInstanceProfileConfigLoader.h

@@ -0,0 +1,40 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_ECSINSTANCEPROFILECONFIGLOADER_H_
+#define ALIBABACLOUD_CORE_ECSINSTANCEPROFILECONFIGLOADER_H_
+
+#include <memory>
+#include "InstanceProfileConfigLoader.h"
+
+namespace AlibabaCloud
+{
+	class EcsMetadataClient;
+	class EcsInstanceProfileConfigLoader : public InstanceProfileConfigLoader
+	{
+	public:
+		EcsInstanceProfileConfigLoader();
+		EcsInstanceProfileConfigLoader(const std::shared_ptr<EcsMetadataClient>& metadataClient);
+		~EcsInstanceProfileConfigLoader();
+		 
+	protected:
+		virtual bool loadInternal() override;
+
+	private:
+		std::shared_ptr<EcsMetadataClient> metadataClient_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_ECSINSTANCEPROFILECONFIGLOADER_H_

+ 51 - 0
core/include/alibabacloud/core/EndpointProvider.h

@@ -0,0 +1,51 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_CORE_ENDPOINTPROVIDER_H_
+#define ALIBABACLOUD_CORE_ENDPOINTPROVIDER_H_
+
+#include <string>
+#include <chrono>
+#include <mutex>
+#include <alibabacloud/core/location/LocationClient.h>
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT EndpointProvider
+	{
+	public:
+		EndpointProvider(const std::shared_ptr<Location::LocationClient>& locationClient,
+			const std::string regionId,
+			const std::string serviceCode,
+			int durationSeconds = 3600);
+		~EndpointProvider();
+
+		std::string getEndpoint();
+
+	private:
+		void loadEndpoint();
+		bool checkExpiry()const;
+
+		std::mutex cachedMutex_;
+		std::string cachedEndpoint_;
+		std::shared_ptr<Location::LocationClient> locationClient_;
+		int durationSeconds_;
+		std::chrono::system_clock::time_point expiry_;
+		std::string regionId_;
+		std::string serviceCode_;
+	};
+}
+#endif

+ 48 - 0
core/include/alibabacloud/core/Error.h

@@ -0,0 +1,48 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_ERROR_H_
+#define ALIBABACLOUD_CORE_ERROR_H_
+
+#include <string>
+#include "CoreExport.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT Error
+	{
+	public:
+		Error() = default;
+		Error(std::string code, const std::string message);
+		~Error() = default;
+
+		std::string errorCode()const;
+		std::string errorMessage() const;
+		std::string host() const;
+		std::string requestId() const;
+		void setErrorCode(const std::string &code);
+		void setErrorMessage(const std::string& message);
+		void setHost(const std::string& host);
+		void setRequestId(const std::string& request);
+	private:
+		std::string errorCode_;
+		std::string message_;
+		std::string host_;
+		std::string requestId_;
+	};
+}
+
+#endif // !ALIBABACLOUD_CORE_ERROR_H_

+ 41 - 0
core/include/alibabacloud/core/Global.h

@@ -0,0 +1,41 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_GLOBAL_H_
+#define ALIBABACLOUD_CORE_GLOBAL_H_
+
+#include "Config.h"
+
+#if defined(_WIN32)
+#	ifdef _MSC_VER
+#		pragma warning(disable : 4251)
+#	endif // _MSC_VER
+#	define ALIBABACLOUD_DECL_EXPORT __declspec(dllexport)
+#	define ALIBABACLOUD_DECL_IMPORT __declspec(dllimport)
+#elif defined(__linux__)
+#	define ALIBABACLOUD_DECL_EXPORT __attribute__((visibility("default")))
+#	define ALIBABACLOUD_DECL_IMPORT __attribute__((visibility("default")))
+#endif
+
+#if !defined(ALIBABACLOUD_DECL_EXPORT)
+#	define ALIBABACLOUD_DECL_EXPORT
+#endif
+
+#if !defined(ALIBABACLOUD_DECL_IMPORT)
+#	define ALIBABACLOUD_DECL_IMPORT
+#endif
+
+#endif // !ALIBABACLOUD_CORE_GLOBAL_H_

+ 34 - 0
core/include/alibabacloud/core/HmacSha1Signer.h

@@ -0,0 +1,34 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_HMACSHA1SIGNER_H_
+#define ALIBABACLOUD_CORE_HMACSHA1SIGNER_H_
+
+#include "Signer.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT HmacSha1Signer : public Signer
+	{
+	public:
+		HmacSha1Signer();
+		~HmacSha1Signer();
+		
+		virtual std::string generate(const std::string &src, const std::string &secret)const override;
+	};
+}
+
+#endif // !ALIBABACLOUD_CORE_HMACSHA1SIGNER_H_

+ 43 - 0
core/include/alibabacloud/core/HttpClient.h

@@ -0,0 +1,43 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_HTTPCLIENT_H_
+#define ALIBABACLOUD_CORE_HTTPCLIENT_H_
+
+#include <alibabacloud/core/HttpRequest.h>
+#include <alibabacloud/core/HttpResponse.h>
+#include <alibabacloud/core/NetworkProxy.h>
+#include <alibabacloud/core/Outcome.h>
+#include <alibabacloud/core/Error.h>
+
+namespace AlibabaCloud
+{
+	class HttpClient
+	{
+	public:
+		typedef Outcome<Error, HttpResponse> HttpResponseOutcome;
+
+		HttpClient();
+		virtual ~HttpClient();
+
+		virtual HttpResponseOutcome makeRequest(const HttpRequest &request) = 0;
+		NetworkProxy proxy()const;
+		void setProxy(const NetworkProxy &proxy);
+	private:
+		NetworkProxy proxy_;
+	};
+}
+#endif

+ 82 - 0
core/include/alibabacloud/core/HttpMessage.h

@@ -0,0 +1,82 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_HTTPMESSAGE_H_
+#define ALIBABACLOUD_CORE_HTTPMESSAGE_H_
+
+#include <map>
+#include <string>
+#include "CoreExport.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT HttpMessage
+	{
+	private:
+		struct ALIBABACLOUD_CORE_EXPORT nocaseLess
+		{
+			bool operator() (const std::string & s1, const std::string & s2) const;
+		};
+	public:
+		enum KnownHeader
+		{
+			Accept,
+			AcceptCharset,
+			AcceptEncoding,
+			AcceptLanguage,
+			Authorization,
+			Connection,
+			ContentLength,
+			ContentMD5,
+			ContentType,
+			Date,
+			Host,
+			Server,
+			UserAgent
+		};
+
+		typedef std::string HeaderNameType;
+		typedef std::string HeaderValueType;
+		typedef std::map<HeaderNameType, HeaderValueType, nocaseLess> HeaderCollection;
+
+		HttpMessage(const HttpMessage &other);
+		HttpMessage(HttpMessage &&other);
+		HttpMessage& operator=(const HttpMessage &other);
+		HttpMessage& operator=(HttpMessage &&other);
+		virtual ~HttpMessage();
+
+		void addHeader(const HeaderNameType &name, const HeaderValueType &value);
+		void addHeader(KnownHeader header, const HeaderValueType &value);
+		const char* body()const;
+		size_t bodySize()const;
+		bool hasBody()const;
+		HeaderValueType header(const HeaderNameType &name)const;
+		HeaderValueType header(KnownHeader header)const;
+		HeaderCollection headers()const;
+		void removeHeader(const HeaderNameType &name);
+		void removeHeader(KnownHeader header);
+		void setBody(const char *data, size_t size);
+		void setHeader(const HeaderNameType &name, const HeaderValueType &value);
+		void setHeader(KnownHeader header, const std::string &value);
+	protected:
+		HttpMessage();
+	private:
+		char *body_;
+		size_t bodySize_;
+		HeaderCollection headers_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_HTTPMESSAGE_H_

+ 53 - 0
core/include/alibabacloud/core/HttpRequest.h

@@ -0,0 +1,53 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_HTTPREQUEST_H_
+#define ALIBABACLOUD_CORE_HTTPREQUEST_H_
+
+#include <string>
+#include "HttpMessage.h"
+#include "Url.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT HttpRequest : public HttpMessage
+	{
+		public:
+			enum Method
+			{
+				Get,
+				Head,
+				Post,
+				Put,
+				Delete,
+				Connect,
+				Options,
+				Patch,
+				Trace
+			};
+			explicit HttpRequest(const Url &url = Url(), Method method = Get);
+			~HttpRequest();
+
+			Method method()const;
+			void setMethod(Method method);
+			void setUrl(const Url &url);
+			Url url()const;
+		private:
+			Method method_;
+			Url url_;
+	};
+}
+#endif

+ 43 - 0
core/include/alibabacloud/core/HttpResponse.h

@@ -0,0 +1,43 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_HTTPRESPONSE_H_
+#define ALIBABACLOUD_CORE_HTTPRESPONSE_H_
+
+#include <string>
+#include "CoreExport.h"
+#include "HttpMessage.h"
+#include "HttpRequest.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT HttpResponse : public HttpMessage
+	{
+		public:
+			HttpResponse();
+			explicit HttpResponse(const HttpRequest & request);
+			~HttpResponse();
+
+			HttpRequest request()const;
+			void setStatusCode(int code);
+			int statusCode()const;
+		private:
+			int statusCode_;
+			HttpRequest request_;
+	};
+}
+
+#endif // !ALIBABACLOUD_CORE_HTTPRESPONSE_H_

+ 47 - 0
core/include/alibabacloud/core/InstanceProfileConfigLoader.h

@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_INSTANCEPROFILECONFIGLOADER_H_
+#define ALIBABACLOUD_CORE_INSTANCEPROFILECONFIGLOADER_H_
+
+#include <chrono>
+#include <map>
+#include <string>
+#include "Profile.h"
+
+namespace AlibabaCloud
+{
+	class InstanceProfileConfigLoader
+	{
+	public:
+		InstanceProfileConfigLoader();
+		virtual ~InstanceProfileConfigLoader();
+
+		bool load();
+		bool persistProfiles(const std::map<std::string, Profile>& profiles);
+		
+		std::map<std::string, Profile> allProfiles() const;
+		std::chrono::system_clock::time_point lastLoadTime() const;
+
+	protected:
+		virtual bool loadInternal() = 0;
+		virtual bool persistInternal(const std::map<std::string, Profile>&);
+
+		std::map<std::string, Profile> profiles_;
+		std::chrono::system_clock::time_point lastLoadTime_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_INSTANCEPROFILECONFIGLOADER_H_

+ 34 - 0
core/include/alibabacloud/core/InstanceProfileCredentials.h

@@ -0,0 +1,34 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_INSTANCEPROFILECREDENTIALS_H_
+#define ALIBABACLOUD_CORE_INSTANCEPROFILECREDENTIALS_H_
+
+#include "BasicSessionCredentials.h"
+
+namespace AlibabaCloud
+{
+	class InstanceProfileCredentials : public BasicSessionCredentials
+	{
+	public:
+		InstanceProfileCredentials();
+		~InstanceProfileCredentials();
+
+	private:
+
+	};
+}
+#endif // !ALIBABACLOUD_CORE_INSTANCEPROFILECREDENTIALS_H_

+ 47 - 0
core/include/alibabacloud/core/InstanceProfileCredentialsProvider.h

@@ -0,0 +1,47 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_INSTANCEPROFILECREDENTIALSPROVIDER_H_
+#define ALIBABACLOUD_CORE_INSTANCEPROFILECREDENTIALSPROVIDER_H_
+
+#include <chrono>
+#include <mutex>
+#include <memory>
+#include "CredentialsProvider.h"
+#include "Credentials.h"
+
+namespace AlibabaCloud
+{	
+	class EcsInstanceProfileConfigLoader;
+	class InstanceProfileConfigLoader;
+	class ALIBABACLOUD_CORE_EXPORT InstanceProfileCredentialsProvider : public CredentialsProvider
+	{
+	public:
+		InstanceProfileCredentialsProvider(size_t refreshRateMs = (1000 * 60 * 10));
+		InstanceProfileCredentialsProvider(const std::shared_ptr<EcsInstanceProfileConfigLoader>&, size_t refreshRateMs = (1000 * 60 * 10));
+
+		virtual Credentials getCredentials() override;
+	private:
+		void refreshIfExpired();
+		virtual bool isTimeToRefresh(long reloadFrequency);
+		 
+		std::chrono::system_clock::time_point lastLoaded_;
+		std::shared_ptr<InstanceProfileConfigLoader> metadataConfigLoader_;
+		size_t loadFrequencyMs_;
+		mutable std::mutex m_reloadMutex;
+	};
+}
+#endif

+ 59 - 0
core/include/alibabacloud/core/NetworkProxy.h

@@ -0,0 +1,59 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_NETWORKPROXY_H_
+#define ALIBABACLOUD_CORE_NETWORKPROXY_H_
+
+#include <string>
+#include "CoreExport.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT NetworkProxy
+	{
+		public:
+			enum Type
+			{
+				None = 0,
+				Http,	
+				Socks5
+			};
+			NetworkProxy(Type type = None,
+					const std::string &hostName = "",
+					uint16_t port = 0,
+					const std::string &user = "",	
+					const std::string &password = "");
+			~NetworkProxy();
+
+			std::string	hostName() const;
+			std::string	password() const;
+			uint16_t port() const;
+			void setHostName(const std::string &hostName);
+			void setPassword(const std::string &password);
+			void setPort(uint16_t port);
+			void setType(Type type);
+			void setUser(const std::string &user);
+			Type type() const;
+			std::string	user() const;
+		private:
+			std::string hostName_;
+			std::string password_;
+			uint16_t port_;
+			Type type_;
+			std::string user_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_NETWORKPROXY_H_

+ 72 - 0
core/include/alibabacloud/core/Outcome.h

@@ -0,0 +1,72 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_OUTCOME_H_
+#define ALIBABACLOUD_CORE_OUTCOME_H_
+
+#include <utility>
+
+namespace AlibabaCloud
+{
+	template<typename E, typename R>
+	class Outcome
+	{
+	public:
+		Outcome() :
+			success_(true), e_(), r_() { }
+		explicit Outcome(const E &e) :
+			e_(e), success_(false), r_() { }
+		explicit Outcome(const R &r) :
+			r_(r), success_(true), e_() { }
+		Outcome(const Outcome &other) :
+			success_(other.success_),
+			e_(other.e_),
+			r_(other.r_)
+		{ }
+		Outcome(Outcome &&other)
+		{
+			*this = std::move(other);
+		}
+		Outcome & operator=(const Outcome &other)
+		{
+			if (this != &other) {
+				success_ = other.success_;
+				e_ = other.e_;
+				r_ = other.r_;
+			}
+			return *this;
+		}
+		Outcome & operator=(Outcome &&other)
+		{
+			if (this != &other)
+			{
+				success_ = other.success_;
+				r_ = other.r_;
+				e_ = other.e_;
+			}
+			return *this;
+		}
+
+		bool isSuccess()const { return success_; }
+		E error()const { return e_; }
+		R result()const { return r_; }
+	private:
+		bool success_;
+		E e_;
+		R r_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_OUTCOME_H_

+ 52 - 0
core/include/alibabacloud/core/Profile.h

@@ -0,0 +1,52 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_PROFILE_H_
+#define ALIBABACLOUD_CORE_PROFILE_H_
+
+#include <string>
+#include <map>
+#include <alibabacloud/core/Credentials.h>
+
+namespace AlibabaCloud
+{
+	class Profile
+	{
+	public:
+		std::string name() const;
+		void setName(const std::string& value);
+		Credentials credentials() const;
+		void setCredentials(const Credentials& value);
+		std::string region() const;
+		void setRegion(const std::string& value);
+		std::string roleArn() const;
+		void setRoleArn(const std::string& value);
+		std::string sourceProfile() const;
+		void setSourceProfile(const std::string& value);
+		void setAllKeyValPairs(const std::map<std::string, std::string>& map);
+		std::string value(const std::string& key);
+
+	private:
+		std::string name_;
+		std::string region_;
+		Credentials credentials_;
+		std::string roleArn_;
+		std::string sourceProfile_;
+		std::map<std::string, std::string> allKeyValPairs_;
+	};
+
+}
+#endif // !ALIBABACLOUD_CORE_PROFILE_H_

+ 54 - 0
core/include/alibabacloud/core/RoaServiceClient.h

@@ -0,0 +1,54 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_ROASERVICECLIENT_H_
+#define ALIBABACLOUD_CORE_ROASERVICECLIENT_H_
+
+#include <map>
+#include <memory>
+#include <string>
+#include "CoreClient.h"
+#include "CredentialsProvider.h"
+#include "HmacSha1Signer.h"
+#include "HttpRequest.h"
+#include "RoaServiceRequest.h"
+
+namespace AlibabaCloud
+{
+	class RoaErrorMarshaller;
+	class ALIBABACLOUD_CORE_EXPORT RoaServiceClient : public CoreClient
+	{
+	public:
+		typedef Outcome<Error, std::string> JsonOutcome;
+
+		RoaServiceClient(const std::shared_ptr<CredentialsProvider> &credentialsProvider,
+			const ClientConfiguration &configuration,
+			const std::shared_ptr<Signer> &signer = std::make_shared<HmacSha1Signer>());
+		virtual ~RoaServiceClient();
+
+	protected:
+		JsonOutcome makeRequest(const std::string &endpoint, const RoaServiceRequest &msg, HttpRequest::Method method = HttpRequest::Method::Get)const;
+		virtual HttpRequest buildHttpRequest(const std::string & endpoint, const ServiceRequest &msg, HttpRequest::Method method)const override;
+		HttpRequest buildHttpRequest(const std::string & endpoint, const RoaServiceRequest &msg, HttpRequest::Method method)const;
+	private:
+		std::string canonicalizedHeaders(const HttpMessage::HeaderCollection &headers)const;
+		std::string canonicalizedResource(const std::string &path, std::map <std::string, std::string> &params)const;
+		
+		std::shared_ptr<CredentialsProvider> credentialsProvider_;
+		std::shared_ptr<Signer> signer_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_ROASERVICECLIENT_H_

+ 32 - 0
core/include/alibabacloud/core/RoaServiceRequest.h

@@ -0,0 +1,32 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_ROASERVICEREQUEST_H_
+#define ALIBABACLOUD_CORE_ROASERVICEREQUEST_H_
+
+#include "ServiceRequest.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT RoaServiceRequest : public ServiceRequest
+	{
+	public:
+		RoaServiceRequest(const std::string &product, const std::string &version);
+		virtual ~RoaServiceRequest();
+
+	};
+}
+#endif // !ALIBABACLOUD_CORE_ROASERVICEREQUEST_H_

+ 55 - 0
core/include/alibabacloud/core/RpcServiceClient.h

@@ -0,0 +1,55 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_RPCSERVICECLIENT_H_
+#define ALIBABACLOUD_CORE_RPCSERVICECLIENT_H_
+
+#include <map>
+#include <memory>
+#include <string>
+#include "CoreClient.h"
+#include "CredentialsProvider.h"
+#include "HmacSha1Signer.h"
+#include "HttpRequest.h"
+#include "RpcServiceRequest.h"
+#include "Outcome.h"
+
+namespace AlibabaCloud
+{
+	class RpcErrorMarshaller;
+	class RpcServiceRequest;
+	class ALIBABACLOUD_CORE_EXPORT RpcServiceClient : public CoreClient
+	{
+	public:
+		typedef Outcome<Error, std::string> JsonOutcome;
+
+		RpcServiceClient(const std::shared_ptr<CredentialsProvider> &credentialsProvider,
+			const ClientConfiguration &configuration,
+			const std::shared_ptr<Signer> &signer = std::make_shared<HmacSha1Signer>());
+		virtual ~RpcServiceClient();
+		
+	protected:
+		JsonOutcome makeRequest(const std::string &endpoint, const RpcServiceRequest &msg, HttpRequest::Method method = HttpRequest::Method::Get)const;
+		virtual HttpRequest buildHttpRequest(const std::string & endpoint, const ServiceRequest &msg, HttpRequest::Method method)const override;
+		HttpRequest buildHttpRequest(const std::string & endpoint, const RpcServiceRequest &msg, HttpRequest::Method method)const;
+	private:
+		std::string canonicalizedQuery(const std::map <std::string, std::string> &params)const;
+		
+		std::shared_ptr<CredentialsProvider> credentialsProvider_;
+		std::shared_ptr<Signer> signer_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_RPCSERVICECLIENT_H_

+ 36 - 0
core/include/alibabacloud/core/RpcServiceRequest.h

@@ -0,0 +1,36 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_RPCSERVICEREQUEST_H_
+#define ALIBABACLOUD_CORE_RPCSERVICEREQUEST_H_
+
+#include "ServiceRequest.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT RpcServiceRequest : public ServiceRequest
+	{
+	public:
+		RpcServiceRequest(const std::string &product, const std::string &version, const std::string & action);
+		virtual ~RpcServiceRequest();
+
+		std::string actionName()const;
+	protected:
+		void setActionName(const std::string &name);
+
+	};
+}
+#endif // !ALIBABACLOUD_CORE_RPCSERVICEREQUEST_H_

+ 35 - 0
core/include/alibabacloud/core/Runnable.h

@@ -0,0 +1,35 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_CORE_RUNNABLE_H_
+#define ALIBABACLOUD_CORE_RUNNABLE_H_
+
+#include <functional>
+#include "CoreExport.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT Runnable
+	{
+	public:
+		explicit Runnable(const std::function<void()> f);
+		void run()const;
+
+	private:
+		std::function<void()> f_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_RUNNABLE_H_

+ 68 - 0
core/include/alibabacloud/core/ServiceRequest.h

@@ -0,0 +1,68 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_SERVICEREQUEST_H_
+#define ALIBABACLOUD_CORE_SERVICEREQUEST_H_
+
+#include <map>
+#include "CoreExport.h"
+#include "Url.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT ServiceRequest
+	{
+	public:
+		typedef std::string ParameterNameType;
+		typedef std::string ParameterValueType;
+		typedef std::map<ParameterNameType, ParameterValueType> ParameterCollection;
+
+		virtual ~ServiceRequest();
+
+		const char* content()const;
+		size_t contentSize()const;
+		bool hasContent()const;
+		ParameterCollection parameters()const;
+		std::string product()const;
+		std::string resourcePath()const;
+		std::string version()const;
+	protected:
+		ServiceRequest(const std::string &product, const std::string &version);
+		ServiceRequest(const ServiceRequest &other);
+		ServiceRequest(ServiceRequest &&other);
+		ServiceRequest& operator=(const ServiceRequest &other);
+		ServiceRequest& operator=(ServiceRequest &&other);
+
+		void addParameter(const ParameterNameType &name, const ParameterValueType &value);
+		ParameterValueType parameter(const ParameterNameType &name)const;
+		void removeParameter(const ParameterNameType &name);
+		void setContent(const char *data, size_t size);
+		void setParameter(const ParameterNameType &name, const ParameterValueType &value);
+		void setParameters(const ParameterCollection &params);
+		void setResourcePath(const std::string &path);
+		void setProduct(const std::string &product);
+		void setVersion(const std::string &version);
+	private:
+		char *content_;
+		size_t contentSize_;
+		ParameterCollection params_;
+		std::string product_;
+		std::string resourcePath_;
+		std::string version_;
+	};
+}
+
+#endif // !ALIBABACLOUD_CORE_SERVICEREQUEST_H_

+ 40 - 0
core/include/alibabacloud/core/ServiceResult.h

@@ -0,0 +1,40 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_SERVICERESULT_H_
+#define ALIBABACLOUD_CORE_SERVICERESULT_H_
+
+#include <string>
+#include "CoreExport.h"
+
+namespace AlibabaCloud
+{
+	class PayloadReader;
+	class ALIBABACLOUD_CORE_EXPORT ServiceResult
+	{
+	public:
+		ServiceResult();
+		virtual ~ServiceResult();
+
+		std::string requestId()const;
+	protected:
+		void setRequestId(const std::string &requestId);
+	private:
+		std::string requestId_;
+	};
+}
+
+#endif // !ALIBABACLOUD_CORE_SERVICERESULT_H_

+ 46 - 0
core/include/alibabacloud/core/Signer.h

@@ -0,0 +1,46 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_SIGNER_H_
+#define ALIBABACLOUD_CORE_SIGNER_H_
+
+#include <string>
+#include "CoreExport.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT Signer
+	{
+	public:
+		enum Type
+		{
+			HmacSha1,
+		};
+		virtual ~Signer();
+
+		virtual std::string generate(const std::string &src, const std::string &secret)const = 0;
+		std::string name()const;
+		Type type() const;
+		std::string version()const;
+	protected:
+		Signer(Type type, const std::string &name, const std::string &version = "1.0");
+	private:
+		std::string name_;
+		std::string version_;
+		Type type_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_SIGNER_H_

+ 37 - 0
core/include/alibabacloud/core/SimpleCredentialsProvider.h

@@ -0,0 +1,37 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_SIMPLECREDENTIALSPROVIDER_H_
+#define ALIBABACLOUD_CORE_SIMPLECREDENTIALSPROVIDER_H_
+
+#include "CredentialsProvider.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT SimpleCredentialsProvider : public CredentialsProvider
+	{
+	public:
+		SimpleCredentialsProvider(const Credentials &credentials);
+		SimpleCredentialsProvider(const std::string &accessKeyId,
+			const std::string &accessKeySecret);
+		~SimpleCredentialsProvider();
+
+		virtual Credentials getCredentials() override;
+	private:
+		Credentials credentials_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_SIMPLECREDENTIALSPROVIDER_H_

+ 52 - 0
core/include/alibabacloud/core/StsAssumeRoleCredentialsProvider.h

@@ -0,0 +1,52 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_STS_STSASSUMEROLECREDENTIALSPROVIDER_H_
+#define ALIBABACLOUD_STS_STSASSUMEROLECREDENTIALSPROVIDER_H_
+
+#include <chrono>
+#include <mutex>
+#include <alibabacloud/core/CredentialsProvider.h>
+#include <alibabacloud/core/sts/StsClient.h>
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT StsAssumeRoleCredentialsProvider : public CredentialsProvider
+	{
+	public:
+		StsAssumeRoleCredentialsProvider(const std::shared_ptr<Sts::StsClient>& stsClient,
+			const std::string &roleArn,
+			const std::string &roleSessionName,
+			const std::string &policy = "",
+			int durationSeconds = 3600);
+		~StsAssumeRoleCredentialsProvider();
+
+		virtual Credentials getCredentials() override;
+	private:
+		void loadCredentials();
+		bool checkExpiry()const;
+
+		std::mutex cachedMutex_;
+		Credentials cachedCredentials_;
+		std::shared_ptr<Sts::StsClient> stsClient_;
+		int durationSeconds_;
+		std::chrono::system_clock::time_point expiry_;
+		std::string policy_;
+		std::string roleArn_;
+		std::string roleSessionName_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_STSASSUMEROLECREDENTIALSPROVIDER_H_

+ 75 - 0
core/include/alibabacloud/core/Url.h

@@ -0,0 +1,75 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_URL_H_
+#define ALIBABACLOUD_CORE_URL_H_
+
+#include <string>
+#include "CoreExport.h"
+
+namespace AlibabaCloud
+{
+	class ALIBABACLOUD_CORE_EXPORT Url
+	{
+	public:
+		explicit Url(const std::string &url = "");
+		Url(const Url &other) = default;
+		Url(Url &&other) = default;
+		~Url();
+		Url & operator=(const Url &url) = default;
+		Url & operator=(Url &&other) = default;
+		bool operator==(const Url &url) const;
+		bool operator!=(const Url &url) const;
+
+		std::string authority() const;
+		void clear();
+		std::string fragment() const;
+		void fromString(const std::string &url);
+		bool hasFragment() const;
+		bool hasQuery() const;
+		std::string host()const;
+		bool isEmpty() const;
+		bool isValid() const;
+		int port()const;
+		std::string	password() const;
+		std::string path() const;
+		std::string query() const;
+		std::string scheme() const;
+		void setAuthority(const std::string &authority);
+		void setFragment(const std::string &fragment);
+		void setHost(const std::string &host);
+		void setPassword(const std::string &password);
+		void setPath(const std::string &path);
+		void setPort(int port);
+		void setQuery(const std::string &query);
+		void setScheme(const std::string &scheme);
+		void setUserInfo(const std::string &userInfo);
+		void setUserName(const std::string &userName);
+		std::string toString()const;
+		std::string userInfo() const;
+		std::string	userName() const;
+	private:
+		std::string scheme_;
+		std::string userName_;
+		std::string password_;
+		std::string host_;
+		std::string path_;
+		int port_;
+		std::string query_;
+		std::string fragment_;
+	};
+}
+#endif // !ALIBABACLOUD_CORE_URL_H_

+ 51 - 0
core/include/alibabacloud/core/location/LocationClient.h

@@ -0,0 +1,51 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ *
+ * 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 ALIBABACLOUD_CORE_LOCATION_LOCATIONCLIENT_H_
+#define ALIBABACLOUD_CORE_LOCATION_LOCATIONCLIENT_H_
+
+#include <future>
+#include <alibabacloud/core/AsyncCallerContext.h>
+#include <alibabacloud/core/RpcServiceClient.h>
+#include "model/DescribeEndpointsRequest.h"
+#include "model/DescribeEndpointsResult.h"
+
+namespace AlibabaCloud
+{
+	namespace Location
+	{
+		class ALIBABACLOUD_CORE_EXPORT LocationClient : public RpcServiceClient
+		{
+		public:
+			typedef Outcome<Error, Model::DescribeEndpointsResult> DescribeEndpointsOutcome;
+			typedef std::future<DescribeEndpointsOutcome> DescribeEndpointsOutcomeCallable;
+			typedef std::function<void(const LocationClient*, const Model::DescribeEndpointsRequest&, const DescribeEndpointsOutcome&, const std::shared_ptr<const AsyncCallerContext>&)> DescribeEndpointsAsyncHandler;
+
+			LocationClient(const Credentials &credentials, const ClientConfiguration &configuration);
+			LocationClient(const std::shared_ptr<CredentialsProvider> &credentialsProvider, const ClientConfiguration &configuration);
+			LocationClient(const std::string &accessKeyId, const std::string &accessKeySecret, const ClientConfiguration &configuration);
+			~LocationClient();
+
+			DescribeEndpointsOutcome describeEndpoints(const Model::DescribeEndpointsRequest &request)const;
+			void describeEndpointsAsync(const Model::DescribeEndpointsRequest& request, const DescribeEndpointsAsyncHandler& handler, const std::shared_ptr<const AsyncCallerContext>& context = nullptr) const;
+			DescribeEndpointsOutcomeCallable describeEndpointsCallable(const Model::DescribeEndpointsRequest& request) const;
+		private:
+			virtual EndpointOutcome endpoint()const override;
+		};
+	}
+}
+
+#endif // !ALIBABACLOUD_CORE_LOCATION_LOCATIONCLIENT_H_

+ 38 - 0
core/include/alibabacloud/core/location/LocationRequest.h

@@ -0,0 +1,38 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ *
+ * 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 ALIBABACLOUD_CORE_LOCATION_LOCATIONREQUEST_H_
+#define ALIBABACLOUD_CORE_LOCATION_LOCATIONREQUEST_H_
+
+#include <alibabacloud/core/RpcServiceRequest.h>
+
+namespace AlibabaCloud
+{
+	namespace Location
+	{
+		class ALIBABACLOUD_CORE_EXPORT LocationRequest : public RpcServiceRequest
+		{
+		public:
+			explicit LocationRequest(const std::string & action);
+			virtual ~LocationRequest();
+
+		private:
+
+		};
+	}
+}
+
+#endif // !ALIBABACLOUD_CORE_LOCATION_LOCATIONREQUEST_H_

+ 46 - 0
core/include/alibabacloud/core/location/model/DescribeEndpointsRequest.h

@@ -0,0 +1,46 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ *
+ * 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 ALIBABACLOUD_CORE_LOCATION_MODEL_DESCRIBEENDPOINTSREQUEST_H_
+#define ALIBABACLOUD_CORE_LOCATION_MODEL_DESCRIBEENDPOINTSREQUEST_H_
+
+#include <string>
+#include <alibabacloud/core/location/LocationRequest.h>
+
+namespace AlibabaCloud
+{
+	namespace Location
+	{
+		namespace Model
+		{
+			class ALIBABACLOUD_CORE_EXPORT DescribeEndpointsRequest : public LocationRequest
+			{
+			public:
+				DescribeEndpointsRequest();
+				~DescribeEndpointsRequest();
+
+				std::string serviceCode()const;
+				void setServiceCode(const std::string& serviceCode);
+				std::string id()const;
+				void setId(const std::string& id);
+				std::string type()const;
+				void setType(const std::string& type);
+
+			};
+		}
+	}
+}
+#endif // !ALIBABACLOUD_CORE_LOCATION_MODEL_DESCRIBEENDPOINTSREQUEST_H_

+ 64 - 0
core/include/alibabacloud/core/location/model/DescribeEndpointsResult.h

@@ -0,0 +1,64 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ *
+ * 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 ALIBABACLOUD_CORE_LOCATION_MODEL_DESCRIBEENDPOINTSRESULT_H_
+#define ALIBABACLOUD_CORE_LOCATION_MODEL_DESCRIBEENDPOINTSRESULT_H_
+
+#include <string>
+#include <vector>
+#include <utility>
+#include <alibabacloud/core/ServiceResult.h>
+
+namespace AlibabaCloud
+{
+	namespace Location
+	{
+		namespace Model
+		{
+			class ALIBABACLOUD_CORE_EXPORT DescribeEndpointsResult : public ServiceResult
+			{
+			public:
+				struct Endpoint
+				{
+					std::string endpoint;
+					std::string id;
+					std::string namespace_;
+					std::string serivceCode;
+					std::string type;
+					std::vector<std::string> protocols;
+				};
+
+				DescribeEndpointsResult();
+				explicit DescribeEndpointsResult(const std::string &payload);
+				~DescribeEndpointsResult();
+
+				std::vector<Endpoint> endpoints()const;
+				void setEndpoints(const std::vector<Endpoint> &endpoints);
+
+				bool success()const;
+				void setSuccess(const bool &success);
+
+			protected:
+				void parse(const std::string &payload);
+			private:
+				std::vector<Endpoint> endpoints_;
+				bool success_;
+
+			};
+		}
+	}
+}
+#endif // !ALIBABACLOUD_CORE_LOCATION_MODEL_DESCRIBEENDPOINTSRESULT_H_

+ 60 - 0
core/include/alibabacloud/core/sts/StsClient.h

@@ -0,0 +1,60 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_CORE_STS_STSCLIENT_H_
+#define ALIBABACLOUD_CORE_STS_STSCLIENT_H_
+
+#include <future>
+#include <alibabacloud/core/AsyncCallerContext.h>
+#include <alibabacloud/core/RpcServiceClient.h>
+#include "model/AssumeRoleRequest.h"
+#include "model/AssumeRoleResult.h"
+#include "model/GetCallerIdentityRequest.h"
+#include "model/GetCallerIdentityResult.h"
+
+namespace AlibabaCloud
+{
+	namespace Sts
+	{
+		class ALIBABACLOUD_CORE_EXPORT StsClient : public RpcServiceClient
+		{
+		public:
+			typedef Outcome<Error, Model::AssumeRoleResult> AssumeRoleOutcome;
+			typedef std::future<AssumeRoleOutcome> AssumeRoleOutcomeCallable;
+			typedef std::function<void(const StsClient*, const Model::AssumeRoleRequest&, const AssumeRoleOutcome&, const std::shared_ptr<const AsyncCallerContext>&)> AssumeRoleAsyncHandler;
+
+			typedef Outcome<Error, Model::GetCallerIdentityResult> GetCallerIdentityOutcome;
+			typedef std::future<GetCallerIdentityOutcome> GetCallerIdentityOutcomeCallable;
+			typedef std::function<void(const StsClient*, const Model::GetCallerIdentityRequest&, const GetCallerIdentityOutcome&, const std::shared_ptr<const AsyncCallerContext>&)> GetCallerIdentityAsyncHandler;
+			
+			StsClient(const Credentials &credentials, const ClientConfiguration &configuration);
+			StsClient(const std::shared_ptr<CredentialsProvider> &credentialsProvider, const ClientConfiguration &configuration);
+			StsClient(const std::string &accessKeyId, const std::string &accessKeySecret, const ClientConfiguration &configuration);
+			~StsClient();
+
+			AssumeRoleOutcome assumeRole(const Model::AssumeRoleRequest &request)const;
+			void assumeRoleAsync(const Model::AssumeRoleRequest& request, const AssumeRoleAsyncHandler& handler, const std::shared_ptr<const AsyncCallerContext>& context = nullptr) const;
+			AssumeRoleOutcomeCallable assumeRoleCallable(const Model::AssumeRoleRequest& request) const;
+			GetCallerIdentityOutcome getCallerIdentity(const Model::GetCallerIdentityRequest &request)const;
+			void getCallerIdentityAsync(const Model::GetCallerIdentityRequest& request, const GetCallerIdentityAsyncHandler& handler, const std::shared_ptr<const AsyncCallerContext>& context = nullptr) const;
+			GetCallerIdentityOutcomeCallable getCallerIdentityCallable(const Model::GetCallerIdentityRequest& request) const;
+		private:
+			virtual EndpointOutcome endpoint()const override;
+		};
+	}
+}
+
+#endif // !ALIBABACLOUD_CORE_STS_STSCLIENT_H_

+ 38 - 0
core/include/alibabacloud/core/sts/StsRequest.h

@@ -0,0 +1,38 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_CORE_STS_STSSERVICEREQUEST_H_
+#define ALIBABACLOUD_CORE_STS_STSSERVICEREQUEST_H_
+
+#include <alibabacloud/core/RpcServiceRequest.h>
+
+namespace AlibabaCloud
+{
+	namespace Sts
+	{
+		class ALIBABACLOUD_CORE_EXPORT StsRequest : public RpcServiceRequest
+		{
+		public:
+			explicit StsRequest(const std::string & action);
+			virtual ~StsRequest();
+
+		private:
+
+		};
+	}
+}
+
+#endif // !ALIBABACLOUD_CORE_STS_STSSERVICEREQUEST_H_

+ 47 - 0
core/include/alibabacloud/core/sts/model/AssumeRoleRequest.h

@@ -0,0 +1,47 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_CORE_STS_MODEL_ASSUMEROLEREQUEST_H_
+#define ALIBABACLOUD_CORE_STS_MODEL_ASSUMEROLEREQUEST_H_
+
+#include <string>
+#include <alibabacloud/core/sts/StsRequest.h>
+
+namespace AlibabaCloud
+{
+	namespace Sts
+	{
+		namespace Model
+		{
+			class ALIBABACLOUD_CORE_EXPORT AssumeRoleRequest : public StsRequest
+			{
+			public:
+				AssumeRoleRequest();
+				~AssumeRoleRequest();
+
+				int durationSeconds()const;
+				std::string policy()const;
+				std::string roleArn()const;
+				std::string roleSessionName()const;
+				void setDurationSeconds(int durationSeconds);
+				void setPolicy(const std::string &policy);
+				void setRoleArn(const std::string & roleArn);
+				void setRoleSessionName(const std::string & roleSessionName);
+			};
+		}
+	}
+}
+#endif // !ALIBABACLOUD_CORE_STS_MODEL_ASSUMEROLEREQUEST_H_

+ 59 - 0
core/include/alibabacloud/core/sts/model/AssumeRoleResult.h

@@ -0,0 +1,59 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_CORE_STS_MODEL_ASSUMEROLERESULT_H_
+#define ALIBABACLOUD_CORE_STS_MODEL_ASSUMEROLERESULT_H_
+
+#include <alibabacloud/core/ServiceResult.h>
+
+namespace AlibabaCloud
+{
+	namespace Sts
+	{
+		namespace Model
+		{
+			class ALIBABACLOUD_CORE_EXPORT AssumeRoleResult : public ServiceResult
+			{
+			public:
+				struct AssumedRoleUser
+				{
+					std::string arn;
+					std::string assumedRoleId;
+				};
+				struct Credentials
+				{
+					std::string accessKeyId;
+					std::string accessKeySecret;
+					std::string expiration;
+					std::string securityToken;
+				};
+
+				AssumeRoleResult();
+				explicit AssumeRoleResult(const std::string &payload);
+				~AssumeRoleResult();
+
+				AssumedRoleUser assumedRoleUser()const;
+				Credentials credentials()const;
+			private:
+				void parse(const std::string &payload);
+
+				AssumedRoleUser assumedRoleUser_;
+				Credentials credentials_;
+			};
+		}
+	}
+}
+#endif // !ALIBABACLOUD_CORE_STS_MODEL_ASSUMEROLERESULT_H_

+ 41 - 0
core/include/alibabacloud/core/sts/model/GetCallerIdentityRequest.h

@@ -0,0 +1,41 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_CORE_STS_MODEL_GETCALLERIDENTITYREQUEST_H_
+#define ALIBABACLOUD_CORE_STS_MODEL_GETCALLERIDENTITYREQUEST_H_
+
+#include <string>
+#include <alibabacloud/core/sts/StsRequest.h>
+
+namespace AlibabaCloud
+{
+	namespace Sts
+	{
+		namespace Model
+		{
+			class ALIBABACLOUD_CORE_EXPORT GetCallerIdentityRequest : public StsRequest
+			{
+			public:
+				GetCallerIdentityRequest();
+				~GetCallerIdentityRequest();
+
+			private:
+
+			};
+		}
+	}
+}
+#endif // !ALIBABACLOUD_CORE_STS_MODEL_GETCALLERIDENTITYREQUEST_H_

+ 49 - 0
core/include/alibabacloud/core/sts/model/GetCallerIdentityResult.h

@@ -0,0 +1,49 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_CORE_STS_MODEL_GETCALLERIDENTITYRESULT_H_
+#define ALIBABACLOUD_CORE_STS_MODEL_GETCALLERIDENTITYRESULT_H_
+
+#include <alibabacloud/core/ServiceResult.h>
+
+namespace AlibabaCloud
+{
+	namespace Sts
+	{
+		namespace Model
+		{
+			class ALIBABACLOUD_CORE_EXPORT GetCallerIdentityResult : public ServiceResult
+			{
+			public:
+				GetCallerIdentityResult();
+				explicit GetCallerIdentityResult(const std::string &payload);
+				~GetCallerIdentityResult();
+
+				std::string accountId();
+				std::string arn()const;
+				std::string userId()const;
+			private:
+				void parse(const std::string &payload);
+
+				std::string accountId_;
+				std::string arn_;
+				std::string userId_;
+			};
+		}
+	}
+}
+
+#endif // !ALIBABACLOUD_CORE_STS_MODEL_GETCALLERIDENTITYRESULT_H_

+ 44 - 0
core/src/AlibabaCloud.cc

@@ -0,0 +1,44 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/AlibabaCloud.h>
+#include "Executor.h"
+
+static AlibabaCloud::Executor * executor = nullptr;
+ 
+void AlibabaCloud::InitializeSdk()
+{
+	if (IsSdkInitialized())
+		return;
+
+	executor = new Executor;
+	executor->start();
+}
+
+bool AlibabaCloud::IsSdkInitialized()
+{
+	return executor != nullptr;
+}
+
+void AlibabaCloud::ShutdownSdk()
+{
+	if (!IsSdkInitialized())
+		return;
+	
+	executor->shutdown();
+	delete executor;
+	executor = nullptr;
+}

+ 44 - 0
core/src/AsyncCallerContext.cc

@@ -0,0 +1,44 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/AsyncCallerContext.h>
+#include "Utils.h"
+
+using namespace AlibabaCloud;
+
+AsyncCallerContext::AsyncCallerContext() :
+	uuid_(GenerateUuid())
+{
+}
+
+AsyncCallerContext::AsyncCallerContext(const std::string &uuid) :
+	uuid_(uuid)
+{
+}
+
+AsyncCallerContext::~AsyncCallerContext()
+{
+}
+
+std::string AsyncCallerContext::uuid()const
+{
+	return uuid_;
+}
+
+void AsyncCallerContext::setUuid(const std::string &uuid)
+{
+	uuid_ = uuid;
+}

+ 61 - 0
core/src/ClientConfiguration.cc

@@ -0,0 +1,61 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/ClientConfiguration.h>
+
+using namespace AlibabaCloud;
+
+ClientConfiguration::ClientConfiguration(const std::string &regionId,
+	const NetworkProxy &proxy):
+	regionId_(regionId),
+	proxy_(proxy),
+	endpoint_()
+{
+}
+
+ClientConfiguration::~ClientConfiguration()
+{
+}
+
+std::string ClientConfiguration::endpoint() const
+{
+	return endpoint_;
+}
+
+NetworkProxy ClientConfiguration::proxy()const
+{
+	return proxy_;
+}
+
+std::string ClientConfiguration::regionId()const
+{
+	return regionId_;
+}
+
+void ClientConfiguration::setEndpoint(const std::string & endpoint)
+{
+	endpoint_ = endpoint;
+}
+
+void ClientConfiguration::setProxy(const NetworkProxy &proxy)
+{
+	proxy_ = proxy;
+}
+
+void ClientConfiguration::setRegionId(const std::string &regionId)
+{
+	regionId_ = regionId;
+}

+ 313 - 0
core/src/CommonClient.cc

@@ -0,0 +1,313 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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.
+*/
+
+#include <alibabacloud/core/CommonClient.h>
+#include <ctime>
+#include <iomanip>
+#include <sstream>
+#include <alibabacloud/core/location/LocationClient.h>
+#include <alibabacloud/core/SimpleCredentialsProvider.h>
+#include "Utils.h"
+
+using namespace AlibabaCloud;
+using namespace Location;
+
+namespace
+{
+#if defined(WIN32) && defined(_MSC_VER)
+#	define strcasecmp _stricmp
+#	define strncasecmp _strnicmp
+#else
+#	include <strings.h>
+#endif
+}
+
+CommonClient::CommonClient(const Credentials &credentials, const ClientConfiguration &configuration) :
+	CoreClient(configuration),
+	credentialsProvider_(std::make_shared<SimpleCredentialsProvider>(credentials))
+{
+	auto locationClient = std::make_shared<LocationClient>(credentials, configuration);
+	endpointProvider_ = std::make_shared<EndpointProvider>(locationClient, configuration.regionId(), "ecs");
+}
+
+CommonClient::CommonClient(const std::shared_ptr<CredentialsProvider>& credentialsProvider, const ClientConfiguration & configuration) :
+	CoreClient(configuration),
+	signer_(std::make_shared<HmacSha1Signer>())
+{
+	credentialsProvider_ = credentialsProvider;
+	auto locationClient = std::make_shared<LocationClient>(credentialsProvider, configuration);
+	endpointProvider_ = std::make_shared<EndpointProvider>(locationClient, configuration.regionId(), "ecs");
+}
+
+CommonClient::CommonClient(const std::string & accessKeyId, const std::string & accessKeySecret, const ClientConfiguration & configuration) :
+	CoreClient(configuration),
+	signer_(std::make_shared<HmacSha1Signer>())
+{
+	credentialsProvider_ = std::make_shared<SimpleCredentialsProvider>(accessKeyId, accessKeySecret);
+
+	auto locationClient = std::make_shared<LocationClient>(accessKeyId, accessKeySecret, configuration);
+	endpointProvider_ = std::make_shared<EndpointProvider>(locationClient, configuration.regionId(), "ecs");
+}
+
+CommonClient::~CommonClient()
+{
+}
+
+CommonClient::JsonOutcome CommonClient::makeRequest(const std::string &endpoint, const CommonRequest &msg, HttpRequest::Method method)const
+{
+	auto outcome = AttemptRequest(endpoint, msg, method);
+	if (outcome.isSuccess())
+		return JsonOutcome(std::string(outcome.result().body(),
+			outcome.result().bodySize()));
+	else
+		return JsonOutcome(outcome.error());
+}
+
+CommonClient::CommonResponseOutcome CommonClient::commonResponse(const CommonRequest & request) const
+{
+	auto outcome = makeRequest(request.domain(), request, request.httpMethod());
+
+	if (outcome.isSuccess())
+		return CommonResponseOutcome(CommonResponse(outcome.result()));
+	else
+		return CommonResponseOutcome(Error(outcome.error()));
+}
+
+void CommonClient::commonResponseAsync(const CommonRequest & request, const CommonResponseAsyncHandler & handler, const std::shared_ptr<const AsyncCallerContext>& context) const
+{
+	auto fn = [this, request, handler, context]()
+	{
+		handler(this, request, commonResponse(request), context);
+	};
+
+	asyncExecute(new Runnable(fn));
+}
+
+CommonClient::CommonResponseOutcomeCallable CommonClient::commonResponseCallable(const CommonRequest & request) const
+{
+	auto task = std::make_shared<std::packaged_task<CommonResponseOutcome()>>(
+		[this, request]()
+	{
+		return this->commonResponse(request);
+	});
+
+	asyncExecute(new Runnable([task]() { (*task)(); }));
+	return task->get_future();
+}
+
+CoreClient::EndpointOutcome CommonClient::endpoint() const
+{
+	return EndpointOutcome();
+}
+
+HttpRequest CommonClient::buildHttpRequest(const std::string & endpoint, const ServiceRequest & msg, HttpRequest::Method method) const
+{
+	return buildHttpRequest(endpoint, dynamic_cast<const CommonRequest& >(msg), method);
+}
+
+HttpRequest CommonClient::buildHttpRequest(const std::string & endpoint, const CommonRequest &msg, HttpRequest::Method method) const
+{
+	if (msg.uriPattern().empty() ||
+		(strcasecmp(msg.uriPattern().c_str(),"rpc") == 0))
+		return buildRpcHttpRequest(endpoint, msg, method);
+	else
+		return buildRoaHttpRequest(endpoint, msg, method);
+}
+
+std::string CommonClient::canonicalizedHeaders(const HttpMessage::HeaderCollection &headers)const
+{
+	std::map <std::string, std::string> materials;
+	for (const auto &p : headers)
+	{
+		std::string key = p.first;
+		std::transform(key.begin(), key.end(), key.begin(), ::tolower);
+		if (key.find("x-acs-") != 0)
+			continue;
+
+		std::string value = p.second;
+		StringReplace(value, "\t", " ");
+		StringReplace(value, "\n", " ");
+		StringReplace(value, "\r", " ");
+		StringReplace(value, "\f", " ");
+		materials[key] = value;
+	}
+
+	if (materials.empty())
+		return std::string();
+	std::stringstream ss;
+	for (const auto &p : materials)
+		ss << p.first << ":" << p.second << "\n";
+
+	return ss.str();
+}
+
+HttpRequest CommonClient::buildRoaHttpRequest(const std::string & endpoint, const CommonRequest &msg, HttpRequest::Method method) const
+{
+	const Credentials credentials = credentialsProvider_->getCredentials();
+
+	Url url;
+	url.setScheme("https");
+	url.setHost(endpoint);
+	url.setPath(msg.resourcePath());
+
+	auto params = msg.headerParameters();
+	std::map <std::string, std::string> queryParams;
+	for (const auto &p : params) {
+		if (!p.second.empty())
+			queryParams[p.first] = p.second;
+	}
+
+	if (!queryParams.empty()) {
+		std::stringstream queryString;
+		for (const auto &p : queryParams)
+		{
+			if (p.second.empty())
+				queryString << "&" << p.first;
+			else
+				queryString << "&" << p.first << "=" << p.second;
+		}
+		url.setQuery(queryString.str().substr(1));
+	}
+
+	HttpRequest request(url);
+	request.setMethod(method);
+	request.setHeader("Accept", "application/json");
+	if (msg.hasContent()) {
+		std::stringstream ss;
+		ss << msg.contentSize();
+		request.setHeader("Content-Length", ss.str());
+		request.setHeader("Content-Type", "application/octet-stream");
+		request.setHeader("Content-MD5", ComputeContentMD5(msg.content(), msg.contentSize()));
+	}
+
+	std::time_t t = std::time(nullptr);
+	std::stringstream date;
+#if defined(__GNUG__) && __GNUC__ < 5
+	char tmbuff[26];
+	strftime(tmbuff, 26, "%a, %d %b %Y %T", std::gmtime(&t));
+	date << tmbuff << " GMT";
+#else
+	date << std::put_time(std::gmtime(&t), "%a, %d %b %Y %T GMT");
+#endif
+	request.setHeader("Date", date.str());
+	request.setHeader("Host", url.host());
+	request.setHeader("x-sdk-client", std::string("CPP/").append(ALIBABACLOUD_VERSION_STR));
+	request.setHeader("x-acs-region-id", configuration().regionId());
+	request.setHeader("x-acs-security-token", credentials.sessionToken());
+	request.setHeader("x-acs-signature-method", signer_->name());
+	request.setHeader("x-acs-signature-nonce", GenerateUuid());
+	request.setHeader("x-acs-signature-version", signer_->version());
+	request.setHeader("x-acs-version", msg.version());
+
+	std::stringstream plaintext;
+	plaintext << HttpMethodToString(method) << "\n"
+		<< request.header("Accept") << "\n"
+		<< request.header("Content-MD5") << "\n"
+		<< request.header("Content-Type") << "\n"
+		<< request.header("Date") << "\n"
+		<< canonicalizedHeaders(request.headers());
+	if (!url.hasQuery())
+		plaintext << url.path();
+	else
+		plaintext << url.path() << "?" << url.query();
+
+	std::stringstream sign;
+	sign << "acs "
+		<< credentials.accessKeyId()
+		<< ":"
+		<< signer_->generate(plaintext.str(), credentials.accessKeySecret());
+	request.setHeader("Authorization", sign.str());
+
+	return request;
+}
+
+
+std::string CommonClient::canonicalizedQuery(const std::map<std::string, std::string>& params) const
+{
+	if (params.empty())
+		return std::string();
+
+	std::stringstream ss;
+	for (const auto &p : params)
+	{
+		std::string key = UrlEncode(p.first);
+		StringReplace(key, "+", "%20");
+		StringReplace(key, "*", "%2A");
+		StringReplace(key, "%7E", "~");
+		std::string value = UrlEncode(p.second);
+		StringReplace(value, "+", "%20");
+		StringReplace(value, "*", "%2A");
+		StringReplace(value, "%7E", "~");
+		ss << "&" << key << "=" << value;
+	}
+	return ss.str().substr(1);
+}
+
+HttpRequest CommonClient::buildRpcHttpRequest(const std::string & endpoint, const CommonRequest &msg, HttpRequest::Method method) const
+{
+	const Credentials credentials = credentialsProvider_->getCredentials();
+
+	Url url;
+	url.setScheme("https");
+	url.setHost(endpoint);
+	url.setPath(msg.resourcePath());
+
+	auto params = msg.queryParameters();
+	std::map <std::string, std::string> queryParams;
+	for (const auto &p : params) {
+		if (!p.second.empty())
+			queryParams[p.first] = p.second;
+	}
+
+	queryParams["AccessKeyId"] = credentials.accessKeyId();
+	queryParams["Format"] = "JSON";
+	queryParams["RegionId"] = configuration().regionId();
+	queryParams["SecurityToken"] = credentials.sessionToken();
+	queryParams["SignatureMethod"] = signer_->name();
+	queryParams["SignatureNonce"] = GenerateUuid();
+	queryParams["SignatureVersion"] = signer_->version();
+	std::time_t t = std::time(nullptr);
+	std::stringstream ss;
+#if defined(__GNUG__) && __GNUC__ < 5
+	char tmbuff[26];
+	strftime(tmbuff, 26, "%FT%TZ", std::gmtime(&t));
+	ss << tmbuff;
+#else
+	ss << std::put_time(std::gmtime(&t), "%FT%TZ");
+#endif
+	queryParams["Timestamp"] = ss.str();
+	queryParams["Version"] = msg.version();
+
+	std::stringstream plaintext;
+	plaintext << HttpMethodToString(method)
+		<< "&"
+		<< UrlEncode(url.path())
+		<< "&"
+		<< UrlEncode(canonicalizedQuery(queryParams));
+
+	queryParams["Signature"] = signer_->generate(plaintext.str(), credentials.accessKeySecret() + "&");
+
+	std::stringstream queryString;
+	for (const auto &p : queryParams)
+		queryString << "&" << p.first << "=" << UrlEncode(p.second);
+	url.setQuery(queryString.str().substr(1));
+
+	HttpRequest request(url);
+	request.setMethod(method);
+	request.setHeader("Host", url.host());
+	request.setHeader("x-sdk-client", std::string("CPP/").append(ALIBABACLOUD_VERSION_STR));
+	return request;
+}

+ 93 - 0
core/src/CommonRequest.cc

@@ -0,0 +1,93 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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.
+*/
+
+#include <alibabacloud/core/CommonRequest.h>
+
+using namespace AlibabaCloud;
+
+CommonRequest::CommonRequest():
+	ServiceRequest("",""),
+	domain_(),
+	queryParams_(),
+	httpMethod_(HttpRequest::Get),
+	uriPattern_("rpc")
+{
+}
+
+CommonRequest::~CommonRequest()
+{}
+
+std::string CommonRequest::domain()const
+{
+	return domain_;
+}
+
+void CommonRequest::setDomain(const std::string &domain)
+{
+	domain_ = domain;
+}
+
+std::string CommonRequest::uriPattern() const
+{
+	return uriPattern_;
+}
+
+void CommonRequest::setUriPattern(const std::string & uriPattern)
+{
+	uriPattern_ = uriPattern;
+}
+
+void CommonRequest::setHttpMethod(HttpRequest::Method method)
+{
+	httpMethod_ = method;
+}
+
+HttpRequest::Method CommonRequest::httpMethod() const
+{
+	return httpMethod_;
+}
+
+CommonRequest::ParameterValueType CommonRequest::queryParameter(const ParameterNameType &name)const
+{
+	return queryParams_.at(name);
+}
+
+
+CommonRequest::ParameterCollection CommonRequest::queryParameters() const
+{
+	return queryParams_;
+}
+
+void CommonRequest::setQueryParameter(const ParameterNameType &name, const ParameterValueType &value)
+{
+	queryParams_[name] = value;
+}
+ 
+CommonRequest::ParameterValueType CommonRequest::headerParameter(const ParameterNameType &name)const
+{
+	return headerParams_.at(name);
+}
+
+CommonRequest::ParameterCollection CommonRequest::headerParameters() const
+{
+	return headerParams_;
+}
+
+void CommonRequest::setHeaderParameter(const ParameterNameType &name, const ParameterValueType &value)
+{
+	headerParams_[name] = value;
+}
+ 

+ 38 - 0
core/src/CommonResponse.cc

@@ -0,0 +1,38 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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.
+*/
+
+#include <alibabacloud/core/CommonResponse.h>
+
+using namespace AlibabaCloud;
+
+CommonResponse::CommonResponse() :
+	payload_()
+{
+}
+
+CommonResponse::CommonResponse(const std::string &payload) :
+	payload_(payload)
+{
+}
+
+CommonResponse::~CommonResponse()
+{
+}
+
+std::string CommonResponse::payload() const
+{
+	return payload_;
+}

+ 25 - 0
core/src/Config.h.in

@@ -0,0 +1,25 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_CONFIG_H_
+#define ALIBABACLOUD_CORE_CONFIG_H_
+
+// version = (major << 16) + (minor << 8) + patch
+#define ALIBABACLOUD_VERSION ((@PROJECT_VERSION_MAJOR@ << 16) + (@PROJECT_VERSION_MINOR@ << 8) + @PROJECT_VERSION_PATCH@)
+
+#define ALIBABACLOUD_VERSION_STR "@PROJECT_VERSION_MAJOR@.@PROJECT_VERSION_MINOR@.@PROJECT_VERSION_PATCH@"
+
+#endif // !ALIBABACLOUD_CORE_CONFIG_H_

+ 82 - 0
core/src/CoreClient.cc

@@ -0,0 +1,82 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/CoreClient.h>
+#include <json/json.h>
+#include <alibabacloud/core/Signer.h>
+#include "CurlHttpClient.h"
+#include "Executor.h"
+
+/*!
+ * \class AlibabaCloud::CoreClient CoreClient.h <alibabacloud/core/CoreClient.h>
+ *
+ */
+
+using namespace AlibabaCloud;
+
+CoreClient::CoreClient(const ClientConfiguration &configuration) :
+	configuration_(configuration),
+	httpClient_(new CurlHttpClient)
+{
+	httpClient_->setProxy(configuration.proxy());
+}
+
+CoreClient::~CoreClient()
+{
+	delete httpClient_;
+}
+
+ClientConfiguration CoreClient::configuration()const
+{
+	return configuration_;
+}
+
+void CoreClient::asyncExecute(Runnable * r)const
+{
+	Executor::instance()->execute(r);
+}
+
+HttpClient::HttpResponseOutcome CoreClient::AttemptRequest(const std::string & endpoint, const ServiceRequest & request, HttpRequest::Method method) const
+{
+	auto r = buildHttpRequest(endpoint, request, method);
+	auto outcome = httpClient_->makeRequest(r);	
+	if (!outcome.isSuccess())
+		return outcome;
+	if(hasResponseError(outcome.result()))
+		return HttpClient::HttpResponseOutcome(buildCoreError(outcome.result()));
+	else
+		return outcome;
+}
+
+Error CoreClient::buildCoreError(const HttpResponse &response)const
+{
+	Json::Reader reader;
+	Json::Value value;
+	if (!reader.parse(std::string(response.body(), response.bodySize()), value))
+		return Error("InvalidResponse", "");
+
+	Error error;
+	error.setErrorCode(value["Code"].asString());
+	error.setErrorMessage(value["Message"].asString());
+	error.setHost(value["HostId"].asString());
+	error.setRequestId(value["RequestId"].asString());
+	return error;
+}
+
+bool CoreClient::hasResponseError(const HttpResponse &response)const
+{
+	return response.statusCode() < 200 || response.statusCode() > 299;
+}

+ 62 - 0
core/src/Credentials.cc

@@ -0,0 +1,62 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/Credentials.h>
+
+using namespace AlibabaCloud;
+
+Credentials::Credentials(const std::string &accessKeyId,
+		const std::string &accessKeySecret,
+		const std::string &sessionToken) :
+	accessKeyId_(accessKeyId),
+	accessKeySecret_(accessKeySecret),
+	sessionToken_(sessionToken)
+{
+}
+
+Credentials::~Credentials()
+{
+}
+
+std::string Credentials::accessKeyId () const
+{
+	return accessKeyId_;
+}
+
+std::string Credentials::accessKeySecret () const
+{
+	return accessKeySecret_;
+}
+
+void Credentials::setAccessKeyId(const std::string &accessKeyId)
+{
+	accessKeyId_ = accessKeyId;
+}
+
+void Credentials::setAccessKeySecret(const std::string &accessKeySecret)
+{
+	accessKeySecret_ = accessKeySecret;
+}
+
+void Credentials::setSessionToken (const std::string &sessionToken)
+{
+	sessionToken_ = sessionToken;
+}
+
+std::string Credentials::sessionToken () const
+{
+	return sessionToken_;
+}

+ 17 - 0
core/src/CredentialsProvider.cc

@@ -0,0 +1,17 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/CredentialsProvider.h>

+ 134 - 0
core/src/CurlHttpClient.cc

@@ -0,0 +1,134 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include "CurlHttpClient.h"
+#include <cassert>
+#include <sstream>
+#include <vector>
+
+using namespace AlibabaCloud;
+
+namespace
+{
+	size_t recvBody(char *ptr, size_t size, size_t nmemb, void *userdata)
+	{
+		HttpResponse *response = static_cast<HttpResponse*>(userdata);
+		response->setBody(ptr, nmemb);
+		return nmemb * size;
+	}
+
+	size_t recvHeaders(char *buffer, size_t size, size_t nitems, void *userdata)
+	{
+		HttpResponse *response = static_cast<HttpResponse*>(userdata);
+		std::string line(buffer);
+		auto pos = line.find(':');
+		if (pos != line.npos)
+		{
+			std::string name = line.substr(0, pos);
+			std::string value = line.substr(pos + 2);
+			size_t p = 0;
+			if ((p = value.rfind('\r')) != value.npos)
+				value[p] = '\0';
+			response->setHeader(name, value);
+		}
+		return nitems * size;
+	}
+
+	void setCUrlProxy(CURL *curlHandle, const NetworkProxy &proxy)
+	{
+		if (proxy.type() == NetworkProxy::Type::None)
+			return;
+
+		long type;
+		switch (proxy.type())
+		{
+		case NetworkProxy::Type::Socks5:
+			type = CURLPROXY_SOCKS5;
+			break;
+		case NetworkProxy::Type::Http:
+		default:
+			type = CURLPROXY_HTTP;
+			break;
+		}
+		curl_easy_setopt(curlHandle, CURLOPT_PROXYTYPE, type);
+
+		std::ostringstream out;
+		out << proxy.hostName() << ":" << proxy.port();
+		curl_easy_setopt(curlHandle, CURLOPT_PROXY, out.str().c_str());
+
+		if (!proxy.user().empty()) {
+			out.clear();
+			out << proxy.user() << ":" << proxy.password();
+			curl_easy_setopt(curlHandle, CURLOPT_PROXYUSERPWD, out.str().c_str());
+		}
+	}
+}
+
+CurlHttpClient::CurlHttpClient() :
+	HttpClient(),
+	curlHandle_(curl_easy_init())
+{
+}
+
+CurlHttpClient::~CurlHttpClient()
+{
+	curl_easy_cleanup(curlHandle_);
+}
+
+HttpClient::HttpResponseOutcome CurlHttpClient::makeRequest(const HttpRequest &request)
+{
+	curl_easy_reset(curlHandle_);
+	HttpResponse response(request);
+	std::string url = request.url().toString();
+	switch (request.method())
+	{
+	case HttpRequest::Method::Get:
+		break;
+	case HttpRequest::Method::Put:
+		curl_easy_setopt(curlHandle_, CURLOPT_UPLOAD, 1L);
+		break;
+	default:
+		break;
+	}
+	curl_easy_setopt(curlHandle_, CURLOPT_URL, url.c_str());
+	curl_easy_setopt(curlHandle_, CURLOPT_SSL_VERIFYPEER, 1L);
+	curl_easy_setopt(curlHandle_, CURLOPT_SSL_VERIFYHOST, 2L);
+	curl_easy_setopt(curlHandle_, CURLOPT_HEADERDATA, &response);
+	curl_easy_setopt(curlHandle_, CURLOPT_HEADERFUNCTION, recvHeaders);
+
+	curl_slist *list = nullptr;
+	auto headers = request.headers();
+	for (const auto &p : headers)
+	{
+		std::string str = p.first;
+		str.append(": ").append(p.second);
+		list = curl_slist_append(list, str.c_str());
+	}
+	curl_easy_setopt(curlHandle_, CURLOPT_HTTPHEADER, list);
+	curl_easy_setopt(curlHandle_, CURLOPT_WRITEDATA, &response);
+	curl_easy_setopt(curlHandle_, CURLOPT_WRITEFUNCTION, recvBody);
+	setCUrlProxy(curlHandle_, proxy());
+
+	CURLcode res = curl_easy_perform(curlHandle_);
+	if (res == CURLE_OK) {
+		long response_code;
+		curl_easy_getinfo(curlHandle_, CURLINFO_RESPONSE_CODE, &response_code);
+		response.setStatusCode(response_code);
+		return HttpResponseOutcome(response);
+	}
+	
+	return HttpResponseOutcome(Error("NetworkError", ""));
+}

+ 37 - 0
core/src/CurlHttpClient.h

@@ -0,0 +1,37 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_CURLHTTPCLIENT_H_
+#define ALIBABACLOUD_CORE_CURLHTTPCLIENT_H_
+
+#include <alibabacloud/core/HttpClient.h>
+#include <curl/curl.h>
+
+namespace AlibabaCloud
+{
+	class CurlHttpClient : public HttpClient
+	{
+	public:
+		CurlHttpClient();
+		~CurlHttpClient();
+
+		virtual HttpResponseOutcome makeRequest(const HttpRequest &request) override;
+	private:
+		CURL *curlHandle_;
+	};
+}
+
+#endif // !ALIBABACLOUD_CORE_CURLHTTPCLIENT_H_

+ 41 - 0
core/src/EcsInstanceProfileConfigLoader.cc

@@ -0,0 +1,41 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/EcsInstanceProfileConfigLoader.h>
+#include "EcsMetadataClient.h"
+
+using namespace AlibabaCloud;
+
+EcsInstanceProfileConfigLoader::EcsInstanceProfileConfigLoader() :
+	metadataClient_(std::make_shared<EcsMetadataClient>())
+{
+}
+
+EcsInstanceProfileConfigLoader::EcsInstanceProfileConfigLoader(const std::shared_ptr<EcsMetadataClient>& client) : 
+	metadataClient_(client)
+{
+}
+
+EcsInstanceProfileConfigLoader::~EcsInstanceProfileConfigLoader()
+{
+}
+
+bool EcsInstanceProfileConfigLoader::loadInternal()
+{
+	//TODO(fenglc): load form remote server
+
+	return false;
+}

+ 27 - 0
core/src/EcsMetadataClient.cc

@@ -0,0 +1,27 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include "EcsMetadataClient.h"
+
+using namespace AlibabaCloud;
+
+EcsMetadataClient::EcsMetadataClient()
+{
+}
+
+EcsMetadataClient::~EcsMetadataClient()
+{
+}

+ 32 - 0
core/src/EcsMetadataClient.h

@@ -0,0 +1,32 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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 ALIBABACLOUD_CORE_ECSMETADATACLIENT_H_
+#define ALIBABACLOUD_CORE_ECSMETADATACLIENT_H_
+
+namespace AlibabaCloud
+{
+	class EcsMetadataClient
+	{
+	public:
+		EcsMetadataClient();
+		~EcsMetadataClient();
+
+	private:
+
+	};
+}
+#endif // !ALIBABACLOUD_CORE_ECSMETADATACLIENT_H_

+ 77 - 0
core/src/EndpointProvider.cc

@@ -0,0 +1,77 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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.
+*/
+
+#include <alibabacloud/core/EndpointProvider.h>
+#include <iomanip>
+#include <sstream>
+
+using namespace AlibabaCloud;
+using namespace AlibabaCloud::Location;
+
+EndpointProvider::EndpointProvider(const std::shared_ptr<Location::LocationClient>& locationClient, const std::string regionId, const std::string serviceCode, int durationSeconds) :
+	locationClient_(locationClient),
+	regionId_(regionId),
+	serviceCode_(serviceCode),
+	durationSeconds_(durationSeconds),
+	cachedMutex_(),
+	cachedEndpoint_(),
+	expiry_()
+{
+}
+
+EndpointProvider::~EndpointProvider()
+{
+}
+
+bool EndpointProvider::checkExpiry()const
+{
+	auto now = std::chrono::system_clock::now();
+	auto diff = std::chrono::duration_cast<std::chrono::seconds>(now - expiry_).count();
+
+	return (diff > 0 - 60);
+}
+
+std::string EndpointProvider::getEndpoint()
+{
+	loadEndpoint();
+	std::lock_guard<std::mutex> locker(cachedMutex_);
+	return cachedEndpoint_;
+}
+
+void EndpointProvider::loadEndpoint()
+{
+	if (checkExpiry())
+	{
+		std::lock_guard<std::mutex> locker(cachedMutex_);
+		if (checkExpiry())
+		{
+			Model::DescribeEndpointsRequest request;
+			request.setId(regionId_);
+			request.setServiceCode(serviceCode_);
+			request.setType("openAPI");
+			auto outcome = locationClient_->describeEndpoints(request);
+			if (outcome.isSuccess())
+			{
+				auto all = outcome.result().endpoints();
+				if (all.size() > 0)
+					cachedEndpoint_ = all.front().endpoint;
+
+				std::time_t t = std::time(nullptr) + durationSeconds_;
+				expiry_ = std::chrono::system_clock::from_time_t(t);
+			}
+		}
+	}
+}

+ 36 - 0
core/src/Error.cc

@@ -0,0 +1,36 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/Error.h>
+
+using namespace AlibabaCloud;
+
+Error::Error(std::string code, const std::string message) :
+	errorCode_(code),
+	message_(message),
+	host_(),
+	requestId_()
+{
+}
+
+std::string Error::errorCode()const { return errorCode_; }
+std::string Error::errorMessage() const { return message_; }
+std::string Error::host() const { return host_; }
+std::string Error::requestId() const { return requestId_; }
+void Error::setErrorCode(const std::string &code) { errorCode_ = code; }
+void Error::setErrorMessage(const std::string& message) { message_ = message; }
+void Error::setHost(const std::string& host) { host_ = host; }
+void Error::setRequestId(const std::string& request) { requestId_ = request; }

+ 124 - 0
core/src/Executor.cc

@@ -0,0 +1,124 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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.
+*/
+
+#include "Executor.h"
+#include <alibabacloud/core/Runnable.h>
+
+using namespace AlibabaCloud;
+
+Executor *Executor::self_ = nullptr;
+
+Executor::Executor() :
+	cvMutex_(),
+	shutdown_(true),
+	tasksQueue_(),
+	tasksQueueMutex_(),
+	thread_()
+{
+	self_ = this;
+}
+
+Executor::~Executor()
+{
+	self_ = nullptr;
+	shutdown();
+}
+
+Executor * Executor::instance()
+{
+	return self_;
+}
+
+bool Executor::start()
+{
+	if (!isShutdown())
+		return true;
+
+	auto threadMain = [this]()
+	{
+		while (!shutdown_)
+		{
+			while (!tasksQueue_.empty())
+			{
+				Runnable *task = nullptr;
+				{
+					std::lock_guard<std::mutex> lock(tasksQueueMutex_);
+					if (!tasksQueue_.empty())
+					{
+						task = tasksQueue_.front();
+						tasksQueue_.pop();
+					}
+				}
+
+				if (task) {
+					task->run();
+					delete task;
+				}
+			}
+
+			if (!shutdown_) {
+				std::unique_lock<std::mutex> lk(cvMutex_);
+				cv_.wait(lk);
+			}
+		}
+	};
+
+	shutdown_ = false;
+	thread_ = std::thread(threadMain);
+	return true;
+}
+
+bool Executor::isShutdown()const
+{
+	return shutdown_;
+}
+
+void Executor::execute(Runnable* task)
+{
+	if (isShutdown())
+		return;
+
+	std::lock_guard<std::mutex> locker(tasksQueueMutex_);
+	tasksQueue_.push(task);
+	wakeUp();
+}
+
+void Executor::wakeUp()
+{
+	std::unique_lock<std::mutex> lk(cvMutex_);
+	cv_.notify_one();
+}
+
+void Executor::shutdown()
+{
+	if (isShutdown())
+		return;
+	
+	{
+		std::lock_guard<std::mutex> locker(tasksQueueMutex_);
+		while (tasksQueue_.size() > 0) {
+			auto task = tasksQueue_.front();
+			delete task;
+			tasksQueue_.pop();
+		}
+	}
+
+	shutdown_ = true;
+	wakeUp();
+
+	if (thread_.joinable())
+		thread_.join();
+}

+ 53 - 0
core/src/Executor.h

@@ -0,0 +1,53 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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 ALIBABACLOUD_CORE_EXECUTOR_H_
+#define ALIBABACLOUD_CORE_EXECUTOR_H_
+
+#include <atomic>
+#include <condition_variable>
+#include <queue>
+#include <vector>
+#include <thread>
+#include <mutex>
+
+namespace AlibabaCloud
+{
+	class Runnable;
+	class Executor
+	{
+	public:
+		Executor();
+		~Executor();
+		 
+		static Executor * instance();
+		void execute(Runnable* task);
+		bool isShutdown()const;
+		bool start();
+		void shutdown();
+		void wakeUp();
+	private:
+		static Executor *self_;
+		std::atomic<bool> shutdown_;
+		std::queue<Runnable*> tasksQueue_;
+		std::mutex tasksQueueMutex_;
+		std::thread thread_;
+		std::condition_variable cv_;
+		std::mutex cvMutex_;
+	};
+}
+
+#endif // !ALIBABACLOUD_CORE_EXECUTOR_H_

+ 99 - 0
core/src/HmacSha1Signer.cc

@@ -0,0 +1,99 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/HmacSha1Signer.h>
+#ifdef _WIN32
+#include <windows.h>
+#include <wincrypt.h>
+#else
+#include <openssl/hmac.h>
+#endif
+
+using namespace AlibabaCloud;
+
+HmacSha1Signer::HmacSha1Signer() :
+	Signer(HmacSha1, "HMAC-SHA1", "1.0")
+{
+}
+
+HmacSha1Signer::~HmacSha1Signer()
+{
+}
+
+std::string HmacSha1Signer::generate(const std::string & src, const std::string & secret) const
+{
+	if (src.empty())
+		return std::string();
+
+#ifdef _WIN32
+	typedef struct _my_blob {
+		BLOBHEADER hdr;
+		DWORD dwKeySize;
+		BYTE rgbKeyData[];
+	}my_blob;
+
+	DWORD kbLen = sizeof(my_blob) + secret.size();
+	my_blob * kb = (my_blob *)LocalAlloc(LPTR, kbLen);
+	kb->hdr.bType = PLAINTEXTKEYBLOB;
+	kb->hdr.bVersion = CUR_BLOB_VERSION;
+	kb->hdr.reserved = 0;
+	kb->hdr.aiKeyAlg = CALG_RC2;
+	kb->dwKeySize = secret.size();
+	memcpy(&kb->rgbKeyData, secret.c_str(), secret.size());
+
+	HCRYPTPROV hProv = 0;
+	HCRYPTKEY hKey = 0;
+	HCRYPTHASH hHmacHash = 0;
+	BYTE pbHash[32];
+	DWORD dwDataLen = 32;
+	HMAC_INFO HmacInfo;
+	ZeroMemory(&HmacInfo, sizeof(HmacInfo));
+	HmacInfo.HashAlgid = CALG_SHA1;
+
+	CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_NEWKEYSET);
+	CryptImportKey(hProv, (BYTE*)kb, kbLen, 0, CRYPT_IPSEC_HMAC_KEY, &hKey);
+	CryptCreateHash(hProv, CALG_HMAC, hKey, 0, &hHmacHash);
+	CryptSetHashParam(hHmacHash, HP_HMAC_INFO, (BYTE*)&HmacInfo, 0);
+	CryptHashData(hHmacHash, (BYTE*)(src.c_str()), src.size(), 0);
+	CryptGetHashParam(hHmacHash, HP_HASHVAL, pbHash, &dwDataLen, 0);
+
+	LocalFree(kb);
+	CryptDestroyHash(hHmacHash);
+	CryptDestroyKey(hKey);
+	CryptReleaseContext(hProv, 0);
+
+	DWORD dlen = 0;
+	CryptBinaryToString(pbHash, dwDataLen, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, NULL, &dlen);
+	char* dest = new char[dlen];
+	CryptBinaryToString(pbHash, dwDataLen, CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF, dest, &dlen);
+
+	std::string ret = std::string(dest, dlen);
+	delete dest;
+	return ret;
+#else
+	unsigned char md[EVP_MAX_BLOCK_LENGTH];
+	unsigned int mdLen = EVP_MAX_BLOCK_LENGTH;
+
+	if (HMAC(EVP_sha1(), secret.c_str(), secret.size(),
+		reinterpret_cast<const unsigned char*>(src.c_str()), src.size(),
+		md, &mdLen) == nullptr)
+		return std::string();
+
+	char encodedData[100];
+	EVP_EncodeBlock(reinterpret_cast<unsigned char*>(encodedData), md, mdLen);
+	return encodedData;
+#endif
+}

+ 41 - 0
core/src/HttpClient.cc

@@ -0,0 +1,41 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/HttpClient.h>
+#include <cassert>
+#include <vector>
+#include <sstream>
+
+using namespace AlibabaCloud;
+
+HttpClient::HttpClient() :
+	proxy_()
+{
+}
+
+HttpClient::~HttpClient()
+{
+}
+
+NetworkProxy HttpClient::proxy()const
+{
+	return proxy_;
+}
+
+void HttpClient::setProxy(const NetworkProxy &proxy)
+{
+	proxy_ = proxy;
+}

+ 173 - 0
core/src/HttpMessage.cc

@@ -0,0 +1,173 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/HttpMessage.h>
+#include <algorithm>
+
+using namespace AlibabaCloud;
+
+namespace
+{
+#if defined(WIN32) && defined(_MSC_VER)
+#	define strcasecmp _stricmp
+#	define strncasecmp _strnicmp
+#else
+#	include <strings.h>
+#endif
+
+	std::string KnownHeaderMapper[]
+	{
+		"Accept",
+		"Accept-Charset",
+		"Accept-Encoding",
+		"Accept-Language",
+		"Authorization",
+		"Connection",
+		"Content-Length",
+		"Content-MD5",
+		"Content-Type",
+		"Date",
+		"Host",
+		"Server",
+		"User-Agent"
+	};
+}
+
+HttpMessage::HttpMessage() :
+	body_(nullptr),
+	bodySize_(0),
+	headers_()
+{
+}
+
+HttpMessage::HttpMessage(const HttpMessage &other) :
+	body_(nullptr),
+	bodySize_(other.bodySize_),
+	headers_(other.headers_)
+{
+	setBody(other.body_, other.bodySize_);
+}
+
+HttpMessage::HttpMessage(HttpMessage &&other)
+{
+	*this = std::move(other);
+}
+
+HttpMessage& HttpMessage::operator=(const HttpMessage &other)
+{
+	if (this != &other) {
+		body_ = nullptr;
+		bodySize_ = 0;
+		headers_ = other.headers_;
+		setBody(other.body_, other.bodySize_);
+	}
+	return *this;
+}
+
+HttpMessage& HttpMessage::operator=(HttpMessage &&other)
+{
+	if (this != &other)
+		*this = std::move(other);
+	return *this;
+}
+
+void HttpMessage::addHeader(const HeaderNameType & name, const HeaderValueType & value)
+{
+	setHeader(name, value);
+}
+
+void HttpMessage::addHeader(KnownHeader header, const HeaderValueType & value)
+{
+	setHeader(header, value);
+}
+
+HttpMessage::HeaderValueType HttpMessage::header(const HeaderNameType & name) const
+{
+	auto it = headers_.find(name);
+	if (it != headers_.end())
+		return it->second;
+	else	
+		return std::string();
+}
+
+HttpMessage::HeaderCollection HttpMessage::headers() const
+{
+	return headers_;
+}
+
+void HttpMessage::removeHeader(const HeaderNameType & name)
+{
+	headers_.erase(name);
+}
+
+void HttpMessage::removeHeader(KnownHeader header)
+{
+	removeHeader(KnownHeaderMapper[header]);
+}
+
+void HttpMessage::setHeader(const HeaderNameType & name, const HeaderValueType & value)
+{
+	headers_[name] = value;
+}
+
+void HttpMessage::setHeader(KnownHeader header, const std::string & value)
+{
+	setHeader(KnownHeaderMapper[header], value);
+}
+
+HttpMessage::~HttpMessage()
+{
+	setBody(nullptr, 0);
+}
+
+const char* HttpMessage::body()const
+{
+	return body_;
+}
+
+size_t HttpMessage::bodySize()const
+{
+	return bodySize_;
+}
+
+bool HttpMessage::hasBody() const
+{
+	return (bodySize_ != 0);
+}
+
+HttpMessage::HeaderValueType HttpMessage::header(KnownHeader header)const
+{
+	return this->header(KnownHeaderMapper[header]);
+}
+
+void HttpMessage::setBody(const char *data, size_t size)
+{
+	if (body_)
+		delete body_;
+	body_ = nullptr;
+	bodySize_ = 0;
+	if (size) {
+		bodySize_ = size;
+		body_ = new char[size];
+		std::copy(data, data + size, body_);
+	}
+}
+
+bool HttpMessage::nocaseLess::operator()(const std::string & s1,
+	const std::string & s2) const
+{
+	return strcasecmp(s1.c_str(), s2.c_str()) < 0;
+}

+ 51 - 0
core/src/HttpRequest.cc

@@ -0,0 +1,51 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/HttpRequest.h>
+
+using namespace AlibabaCloud;
+
+HttpRequest::HttpRequest(const Url &url, Method method) :
+	HttpMessage(),
+	url_(url),
+	method_(method)
+{
+}
+
+HttpRequest::~HttpRequest()
+{
+}
+
+HttpRequest::Method HttpRequest::method() const
+{
+	return method_;
+}
+
+
+void HttpRequest::setMethod(Method method)
+{
+	method_ = method;
+}
+
+void HttpRequest::setUrl(const Url &url)
+{
+	url_ = url;
+}
+
+Url HttpRequest::url()const
+{
+	return url_;
+}

+ 57 - 0
core/src/HttpResponse.cc

@@ -0,0 +1,57 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/HttpResponse.h>
+
+namespace
+{
+	#define INVALID_STATUS_CODE -1
+}
+
+using namespace AlibabaCloud;
+
+HttpResponse::HttpResponse() :
+	HttpMessage(),
+	request_(),
+	statusCode_(INVALID_STATUS_CODE)
+{
+}
+
+HttpResponse::HttpResponse(const HttpRequest & request) :
+	HttpMessage(),
+	request_(request),
+	statusCode_(INVALID_STATUS_CODE)
+{
+}
+
+HttpResponse::~HttpResponse()
+{
+}
+
+HttpRequest HttpResponse::request() const
+{
+	return request_;
+}
+
+void HttpResponse::setStatusCode(int code)
+{
+	statusCode_ = code;
+}
+
+int HttpResponse::statusCode() const
+{
+	return statusCode_;
+}

+ 65 - 0
core/src/InstanceProfileConfigLoader.cc

@@ -0,0 +1,65 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/InstanceProfileConfigLoader.h>
+
+using namespace AlibabaCloud;
+
+InstanceProfileConfigLoader::InstanceProfileConfigLoader()
+{
+}
+
+InstanceProfileConfigLoader::~InstanceProfileConfigLoader()
+{
+}
+
+std::map<std::string, Profile> InstanceProfileConfigLoader::allProfiles() const
+{
+	return profiles_; 
+}
+
+std::chrono::system_clock::time_point InstanceProfileConfigLoader::lastLoadTime() const 
+{
+	return lastLoadTime_; 
+}
+
+bool InstanceProfileConfigLoader::persistInternal(const std::map<std::string, Profile>&) 
+{ 
+	return false;
+}
+
+bool InstanceProfileConfigLoader::load()
+{
+	if (loadInternal())
+	{
+		lastLoadTime_ = std::chrono::system_clock::now();
+		return true;
+	}
+
+	return false;
+}
+
+bool InstanceProfileConfigLoader::persistProfiles(const std::map<std::string, Profile>& profiles)
+{
+	if (persistInternal(profiles))
+	{
+		profiles_ = profiles;
+		lastLoadTime_ = std::chrono::system_clock::now();
+		return true;
+	}
+
+	return false;
+}

+ 28 - 0
core/src/InstanceProfileCredentials.cc

@@ -0,0 +1,28 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/InstanceProfileCredentials.h>
+
+using namespace AlibabaCloud;
+
+InstanceProfileCredentials::InstanceProfileCredentials() :
+	BasicSessionCredentials(Credentials::InstanceProfile)
+{
+}
+
+InstanceProfileCredentials::~InstanceProfileCredentials()
+{
+}

+ 78 - 0
core/src/InstanceProfileCredentialsProvider.cc

@@ -0,0 +1,78 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/InstanceProfileCredentialsProvider.h>
+#include <alibabacloud/core/EcsInstanceProfileConfigLoader.h>
+#include <alibabacloud/core/Profile.h>
+#include <chrono>
+#include <iomanip>
+#include <chrono>
+#include <mutex>
+
+using namespace AlibabaCloud;
+
+namespace
+{
+	const char* const INSTANCE_PROFILE_KEY = "InstanceProfile";
+}
+
+InstanceProfileCredentialsProvider::InstanceProfileCredentialsProvider(size_t refreshRateMs) :
+	metadataConfigLoader_(std::make_shared<EcsInstanceProfileConfigLoader>()),
+	loadFrequencyMs_(refreshRateMs),
+	lastLoaded_()
+{
+}
+
+InstanceProfileCredentialsProvider::InstanceProfileCredentialsProvider(const std::shared_ptr<EcsInstanceProfileConfigLoader>& loader, size_t refreshRateMs) :
+	metadataConfigLoader_(loader),
+	loadFrequencyMs_(refreshRateMs),
+	lastLoaded_()
+{
+}
+
+Credentials InstanceProfileCredentialsProvider::getCredentials()
+{
+	refreshIfExpired();
+
+	auto profileIter = metadataConfigLoader_->allProfiles().find(INSTANCE_PROFILE_KEY);
+	if (profileIter != metadataConfigLoader_->allProfiles().end())
+	{
+		return profileIter->second.credentials();
+	}
+
+	return Credentials("","");
+}
+
+bool InstanceProfileCredentialsProvider::isTimeToRefresh(long reloadFrequency)
+{
+	auto now = std::chrono::system_clock::now();
+	auto diff = std::chrono::duration_cast<std::chrono::seconds>(now - lastLoaded_).count();
+	
+	if(diff > reloadFrequency)
+	{
+		lastLoaded_ = now;
+		return true;
+	}
+
+	return false;
+}
+
+void InstanceProfileCredentialsProvider::refreshIfExpired()
+{
+	std::lock_guard<std::mutex> locker(m_reloadMutex);
+	if (isTimeToRefresh(loadFrequencyMs_))
+		metadataConfigLoader_->load();	
+}

+ 86 - 0
core/src/NetworkProxy.cc

@@ -0,0 +1,86 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/NetworkProxy.h>
+
+using namespace AlibabaCloud;
+
+NetworkProxy::NetworkProxy(Type type,
+		const std::string &hostName,
+		uint16_t port,
+		const std::string &user,
+		const std::string &password)
+: hostName_(hostName),
+	password_(password),
+	port_(port),
+	type_(type),
+	user_(user)
+{
+}
+
+NetworkProxy::~NetworkProxy()
+{
+}
+
+std::string NetworkProxy::hostName() const
+{
+	return hostName_;
+}
+
+std::string NetworkProxy::password() const
+{
+	return password_;
+}
+
+uint16_t NetworkProxy::port() const
+{
+	return port_;
+}
+
+void NetworkProxy::setHostName(const std::string &hostName)
+{
+	hostName_ = hostName;
+}
+
+void NetworkProxy::setPassword(const std::string &password)
+{
+	password_ = password;
+}
+
+void NetworkProxy::setPort(uint16_t port)
+{
+	port_ = port;
+}
+
+void NetworkProxy::setType(NetworkProxy::Type type)
+{
+	type_ = type;
+}
+
+void NetworkProxy::setUser(const std::string &user)
+{
+	user_ = user;
+}
+
+NetworkProxy::Type NetworkProxy::type() const
+{
+	return type_;
+}
+
+std::string NetworkProxy::user() const
+{
+	return user_;
+}

+ 17 - 0
core/src/Outcome.cc

@@ -0,0 +1,17 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/Outcome.h>

+ 61 - 0
core/src/Profile.cc

@@ -0,0 +1,61 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/Profile.h>
+
+using namespace AlibabaCloud;
+
+std::string Profile::name() const
+{ return name_; }
+
+void Profile::setName(const std::string& value) 
+{ name_ = value; }
+
+Credentials Profile::credentials() const 
+{ return credentials_; }
+
+void Profile::setCredentials(const Credentials& value) 
+{ credentials_ = value; }
+
+std::string Profile::region() const 
+{ return region_; }
+
+void Profile::setRegion(const std::string& value) 
+{ region_ = value; }
+
+std::string Profile::roleArn() const 
+{ return roleArn_; }
+
+void Profile::setRoleArn(const std::string& value) 
+{ roleArn_ = value; }
+
+std::string Profile::sourceProfile() const 
+{ return sourceProfile_; }
+
+void Profile::setSourceProfile(const std::string& value) 
+{ sourceProfile_ = value; }
+
+void Profile::setAllKeyValPairs(const std::map<std::string, std::string>& map)
+{
+	allKeyValPairs_ = map;
+}
+
+std::string Profile::value(const std::string& key)
+{
+	auto iter = allKeyValPairs_.find(key);
+	if (iter == allKeyValPairs_.end()) return "";
+	return iter->second;
+}

+ 179 - 0
core/src/RoaServiceClient.cc

@@ -0,0 +1,179 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/RoaServiceClient.h>
+#include <algorithm>
+#include <iomanip>
+#include <sstream>
+#include <alibabacloud/core/HmacSha1Signer.h>
+//#include <alibabacloud/core/RoaErrorMarshaller.h>
+#include "Utils.h"
+
+using namespace AlibabaCloud;
+
+RoaServiceClient::RoaServiceClient(const std::shared_ptr<CredentialsProvider> &credentialsProvider,
+	const ClientConfiguration &configuration,
+	const std::shared_ptr<Signer> &signer) :
+	CoreClient(configuration),
+	credentialsProvider_(credentialsProvider),
+	signer_(signer)
+{
+}
+
+RoaServiceClient::~RoaServiceClient()
+{
+}
+
+std::string RoaServiceClient::canonicalizedResource(const std::string &path, std::map <std::string, std::string> &params)const
+{
+	if (params.empty())
+		return path;
+
+	std::stringstream ss;
+	for (const auto &p : params)
+	{
+		if (p.second.empty())
+			ss << "&" << p.first;
+		else
+			ss << "&" << p.first << "=" << p.second;
+	}
+
+	std::string str = path;
+	str.append("?").append(ss.str().substr(1));
+	return str;
+}
+
+std::string RoaServiceClient::canonicalizedHeaders(const HttpMessage::HeaderCollection &headers)const
+{
+	std::map <std::string, std::string> materials;
+	for (const auto &p : headers)
+	{
+		std::string key = p.first;
+		std::transform(key.begin(), key.end(), key.begin(), ::tolower);
+		if (key.find("x-acs-") != 0)
+			continue;
+
+		std::string value = p.second;
+		StringReplace(value, "\t", " ");
+		StringReplace(value, "\n", " ");
+		StringReplace(value, "\r", " ");
+		StringReplace(value, "\f", " ");
+		materials[key] = value;
+	}
+
+	if (materials.empty())
+		return std::string();
+	std::stringstream ss;
+	for (const auto &p : materials)
+		ss << p.first << ":" << p.second << "\n";
+
+	return ss.str();
+}
+
+RoaServiceClient::JsonOutcome RoaServiceClient::makeRequest(const std::string &endpoint, const RoaServiceRequest &msg, HttpRequest::Method method)const
+{
+	auto outcome = AttemptRequest(endpoint, msg, method);
+	if (outcome.isSuccess())
+		return JsonOutcome(std::string(outcome.result().body(),
+			outcome.result().bodySize()));
+	else
+		return JsonOutcome(outcome.error());
+}
+
+HttpRequest RoaServiceClient::buildHttpRequest(const std::string & endpoint, const ServiceRequest &msg, HttpRequest::Method method)const
+{
+	return buildHttpRequest(endpoint, dynamic_cast<const RoaServiceRequest& >(msg), method);
+}
+
+HttpRequest RoaServiceClient::buildHttpRequest(const std::string & endpoint, const RoaServiceRequest &msg, HttpRequest::Method method) const
+{
+	const Credentials credentials = credentialsProvider_->getCredentials();
+
+	Url url;
+	url.setScheme("https");
+	url.setHost(endpoint);
+	url.setPath(msg.resourcePath());
+
+	auto params = msg.parameters();
+	std::map <std::string, std::string> queryParams;
+	for (const auto &p : params){
+		if (!p.second.empty())
+			queryParams[p.first] = p.second;
+	}
+
+	if (!queryParams.empty()) {
+		std::stringstream queryString;
+		for (const auto &p : queryParams)
+		{
+			if (p.second.empty())
+				queryString << "&" << p.first;
+			else
+				queryString << "&" << p.first << "=" << p.second;
+		}
+		url.setQuery(queryString.str().substr(1));
+	}
+
+	HttpRequest request(url);
+	request.setMethod(method);
+	request.setHeader("Accept", "application/json");
+	if (msg.hasContent()) {
+		std::stringstream ss;
+		ss << msg.contentSize();
+		request.setHeader("Content-Length", ss.str());
+		request.setHeader("Content-Type", "application/octet-stream");		
+		request.setHeader("Content-MD5", ComputeContentMD5(msg.content(),msg.contentSize()));
+	}
+
+	std::time_t t = std::time(nullptr);
+	std::stringstream date;
+#if defined(__GNUG__) && __GNUC__ < 5
+	char tmbuff[26];
+	strftime(tmbuff, 26, "%a, %d %b %Y %T", std::gmtime(&t));
+	date << tmbuff << " GMT";
+#else
+	date << std::put_time(std::gmtime(&t), "%a, %d %b %Y %T GMT");
+#endif
+	request.setHeader("Date", date.str());
+	request.setHeader("Host", url.host());
+	request.setHeader("x-sdk-client", std::string("CPP/").append(ALIBABACLOUD_VERSION_STR));
+	request.setHeader("x-acs-region-id", configuration().regionId());
+	request.setHeader("x-acs-security-token", credentials.sessionToken());
+	request.setHeader("x-acs-signature-method", signer_->name());
+	request.setHeader("x-acs-signature-nonce", GenerateUuid());
+	request.setHeader("x-acs-signature-version", signer_->version());
+	request.setHeader("x-acs-version", msg.version());
+
+	std::stringstream plaintext;
+	plaintext << HttpMethodToString(method) << "\n"
+		<< request.header("Accept") << "\n"
+		<< request.header("Content-MD5") << "\n"
+		<< request.header("Content-Type") << "\n"
+		<< request.header("Date") << "\n"
+		<< canonicalizedHeaders(request.headers());
+	if (!url.hasQuery())
+		plaintext << url.path();
+	else
+		plaintext << url.path() << "?" << url.query();
+
+	std::stringstream sign;
+	sign << "acs "
+		<< credentials.accessKeyId()
+		<< ":"
+		<< signer_->generate(plaintext.str(), credentials.accessKeySecret());
+	request.setHeader("Authorization", sign.str());
+
+	return request;
+}

+ 32 - 0
core/src/RoaServiceRequest.cc

@@ -0,0 +1,32 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/RoaServiceRequest.h>
+#include <algorithm>
+#include <iomanip>
+#include <sstream>
+#include "Utils.h"
+
+using namespace AlibabaCloud;
+
+RoaServiceRequest::RoaServiceRequest(const std::string & product, const std::string & version) :
+	ServiceRequest(product, version)
+{
+}
+
+RoaServiceRequest::~RoaServiceRequest()
+{
+}

+ 130 - 0
core/src/RpcServiceClient.cc

@@ -0,0 +1,130 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/RpcServiceClient.h>
+#include <algorithm>
+#include <iomanip>
+#include <sstream>
+#include <alibabacloud/core/HmacSha1Signer.h>
+#include "Utils.h"
+//#include <alibabacloud/core/RpcErrorMarshaller.h>
+
+using namespace AlibabaCloud;
+
+RpcServiceClient::RpcServiceClient(const std::shared_ptr<CredentialsProvider> &credentialsProvider,
+	const ClientConfiguration &configuration,
+	const std::shared_ptr<Signer> &signer) :
+	CoreClient(configuration),
+	credentialsProvider_(credentialsProvider),
+	signer_(signer)
+{
+}
+
+RpcServiceClient::~RpcServiceClient()
+{
+}
+
+std::string RpcServiceClient::canonicalizedQuery(const std::map<std::string, std::string>& params) const
+{
+	if (params.empty())
+		return std::string();
+
+	std::stringstream ss;
+	for (const auto &p : params)
+	{
+		std::string key = UrlEncode(p.first);
+		StringReplace(key, "+", "%20");
+		StringReplace(key, "*", "%2A");
+		StringReplace(key, "%7E", "~");
+		std::string value = UrlEncode(p.second);
+		StringReplace(value, "+", "%20");
+		StringReplace(value, "*", "%2A");
+		StringReplace(value, "%7E", "~");
+		ss << "&" << key << "=" << value;
+	}
+	return ss.str().substr(1);
+}
+
+RpcServiceClient::JsonOutcome RpcServiceClient::makeRequest(const std::string &endpoint, const RpcServiceRequest &msg, HttpRequest::Method method)const
+{
+	auto outcome = AttemptRequest(endpoint, msg, method);
+	if (outcome.isSuccess())
+		return JsonOutcome(std::string(outcome.result().body(),
+			outcome.result().bodySize()));
+	else
+		return JsonOutcome(outcome.error());
+}
+
+HttpRequest RpcServiceClient::buildHttpRequest(const std::string & endpoint, const ServiceRequest &msg, HttpRequest::Method method )const
+{
+	return buildHttpRequest(endpoint, dynamic_cast<const RpcServiceRequest& >(msg), method);
+}
+
+HttpRequest RpcServiceClient::buildHttpRequest(const std::string & endpoint, const RpcServiceRequest &msg, HttpRequest::Method method) const
+{
+	const Credentials credentials = credentialsProvider_->getCredentials();
+
+	Url url;
+	url.setScheme("https");
+	url.setHost(endpoint);
+	url.setPath(msg.resourcePath());
+
+	auto params = msg.parameters();
+	std::map <std::string, std::string> queryParams;
+	for (const auto &p : params) {
+		if (!p.second.empty())
+			queryParams[p.first] = p.second;
+	}
+
+	queryParams["AccessKeyId"] = credentials.accessKeyId();
+	queryParams["Format"] = "JSON";
+	queryParams["RegionId"] = configuration().regionId();
+	queryParams["SecurityToken"] = credentials.sessionToken();
+	queryParams["SignatureMethod"] = signer_->name();
+	queryParams["SignatureNonce"] = GenerateUuid();
+	queryParams["SignatureVersion"] = signer_->version();
+	std::time_t t = std::time(nullptr);
+	std::stringstream ss;
+#if defined(__GNUG__) && __GNUC__ < 5
+	char tmbuff[26];
+	strftime(tmbuff, 26, "%FT%TZ" , std::gmtime(&t));
+	ss << tmbuff;
+#else
+	ss << std::put_time(std::gmtime(&t), "%FT%TZ");
+#endif
+	queryParams["Timestamp"] = ss.str();
+	queryParams["Version"] = msg.version();
+
+	std::stringstream plaintext;
+	plaintext << HttpMethodToString(method)
+		<< "&"
+		<< UrlEncode(url.path())
+		<< "&"
+		<< UrlEncode(canonicalizedQuery(queryParams));
+
+	queryParams["Signature"] = signer_->generate(plaintext.str(), credentials.accessKeySecret() + "&");
+
+	std::stringstream queryString;
+	for (const auto &p : queryParams)
+		queryString << "&" << p.first << "=" << UrlEncode(p.second);
+	url.setQuery(queryString.str().substr(1));
+
+	HttpRequest request(url);
+	request.setMethod(method);
+	request.setHeader("Host", url.host());
+	request.setHeader("x-sdk-client", std::string("CPP/").append(ALIBABACLOUD_VERSION_STR));
+	return request;
+}

+ 40 - 0
core/src/RpcServiceRequest.cc

@@ -0,0 +1,40 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/RpcServiceRequest.h>
+
+using namespace AlibabaCloud;
+
+RpcServiceRequest::RpcServiceRequest(const std::string & product, const std::string & version, const std::string & action) :
+	ServiceRequest(product, version)
+{
+	setActionName(action);
+}
+
+RpcServiceRequest::~RpcServiceRequest()
+{
+}
+
+std::string RpcServiceRequest::actionName()const
+{
+	return parameter("Action");
+}
+
+
+void RpcServiceRequest::setActionName(const std::string & name)
+{
+	setParameter("Action", name);
+}

+ 29 - 0
core/src/Runnable.cc

@@ -0,0 +1,29 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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.
+*/
+
+#include <alibabacloud/core/Runnable.h>
+
+using namespace AlibabaCloud;
+
+Runnable::Runnable(const std::function<void()> f) :
+	f_(f)
+{
+}
+
+void Runnable::run() const
+{
+	f_(); 
+}

+ 157 - 0
core/src/ServiceRequest.cc

@@ -0,0 +1,157 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/ServiceRequest.h>
+
+using namespace AlibabaCloud;
+
+ServiceRequest::ServiceRequest(const std::string &product, const std::string &version) :
+	content_(nullptr),
+	contentSize_(0),
+	params_(),
+	product_(product),
+	resourcePath_("/"),
+	version_(version)
+{
+}
+
+ServiceRequest::ServiceRequest(const ServiceRequest &other) :
+	content_(nullptr),
+	contentSize_(other.contentSize_),
+	params_(other.params_),
+	product_(other.product_),
+	resourcePath_(other.resourcePath_),
+	version_(other.version_)
+{
+	setContent(other.content_, other.contentSize_);
+}
+
+ServiceRequest::ServiceRequest(ServiceRequest &&other)
+{
+	*this = std::move(other);
+}
+
+ServiceRequest& ServiceRequest::operator=(const ServiceRequest &other)
+{
+	if (this != &other) {
+		content_ = nullptr;
+		contentSize_ = 0;
+		params_ = other.params_;
+		setContent(other.content_, other.contentSize_);
+	}
+	return *this;
+}
+
+ServiceRequest& ServiceRequest::operator=(ServiceRequest &&other)
+{
+	if (this != &other)
+		*this = std::move(other);
+	return *this;
+}
+
+ServiceRequest::~ServiceRequest()
+{
+	if (content_)
+		delete content_;
+}
+
+const char * ServiceRequest::content() const
+{
+	return content_;
+}
+
+size_t ServiceRequest::contentSize() const
+{
+	return contentSize_;
+}
+
+bool ServiceRequest::hasContent() const
+{
+	return (contentSize_ != 0);
+}
+
+void ServiceRequest::setContent(const char * data, size_t size)
+{
+	if (content_)
+		delete content_;
+	content_ = nullptr;
+	contentSize_ = 0;
+	if (size) {
+		contentSize_ = size;
+		content_ = new char[size];
+		std::copy(data, data + size, content_);
+	}
+}
+
+void ServiceRequest::addParameter(const ParameterNameType & name, const ParameterValueType & value)
+{
+	setParameter(name, value);
+}
+
+ServiceRequest::ParameterValueType ServiceRequest::parameter(const ParameterNameType &name)const
+{
+	return params_.at(name);
+}
+
+ServiceRequest::ParameterCollection ServiceRequest::parameters() const
+{
+	return params_;
+}
+
+void ServiceRequest::removeParameter(const ParameterNameType & name)
+{
+	params_.erase(name);
+}
+
+void ServiceRequest::setParameter(const ParameterNameType &name, const ParameterValueType &value)
+{
+	params_[name] = value;
+}
+
+void ServiceRequest::setParameters(const ParameterCollection & params)
+{
+	params_ = params;
+}
+
+std::string ServiceRequest::version()const
+{
+	return version_;
+}
+
+void ServiceRequest::setVersion(const std::string &version)
+{
+	version_ = version;
+}
+
+std::string ServiceRequest::product() const
+{
+	return product_;
+}
+
+void ServiceRequest::setProduct(const std::string & product)
+{
+	product_ = product;
+}
+
+std::string ServiceRequest::resourcePath() const
+{
+	return resourcePath_;
+}
+
+void ServiceRequest::setResourcePath(const std::string & path)
+{
+	resourcePath_ = path;
+}

+ 38 - 0
core/src/ServiceResult.cc

@@ -0,0 +1,38 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/ServiceResult.h>
+
+using namespace AlibabaCloud;
+
+ServiceResult::ServiceResult() :
+	requestId_()
+{
+}
+
+ServiceResult::~ServiceResult()
+{
+}
+
+std::string ServiceResult::requestId() const
+{
+	return requestId_;
+}
+
+void ServiceResult::setRequestId(const std::string & requestId)
+{
+	requestId_ = requestId;
+}

+ 45 - 0
core/src/Signer.cc

@@ -0,0 +1,45 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/Signer.h>
+
+using namespace AlibabaCloud;
+
+Signer::Signer(Type type, const std::string & name, const std::string & version) :
+	type_(type),
+	name_(name),
+	version_(version)
+{
+}
+
+Signer::~Signer()
+{
+}
+
+std::string Signer::name() const
+{
+	return name_;
+}
+
+Signer::Type Signer::type() const
+{
+	return type_;
+}
+
+std::string Signer::version() const
+{
+	return version_;
+}

+ 40 - 0
core/src/SimpleCredentialsProvider.cc

@@ -0,0 +1,40 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/SimpleCredentialsProvider.h>
+
+using namespace AlibabaCloud;
+
+SimpleCredentialsProvider::SimpleCredentialsProvider(const Credentials &credentials):
+	CredentialsProvider(),
+	credentials_(credentials)
+{
+}
+
+SimpleCredentialsProvider::SimpleCredentialsProvider(const std::string & accessKeyId, const std::string & accessKeySecret) :
+	CredentialsProvider(),
+	credentials_(accessKeyId, accessKeySecret)
+{
+}
+
+SimpleCredentialsProvider::~SimpleCredentialsProvider()
+{
+}
+
+Credentials SimpleCredentialsProvider::getCredentials()
+{
+	return credentials_;
+}

+ 88 - 0
core/src/StsAssumeRoleCredentialsProvider.cc

@@ -0,0 +1,88 @@
+/*
+* Copyright 2009-2017 Alibaba Cloud All rights reserved.
+*
+* 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.
+*/
+
+#include <alibabacloud/core/StsAssumeRoleCredentialsProvider.h>
+#include <iomanip>
+#include <sstream>
+
+using namespace AlibabaCloud;
+using namespace AlibabaCloud::Sts;
+
+StsAssumeRoleCredentialsProvider::StsAssumeRoleCredentialsProvider(const std::shared_ptr<StsClient>& stsClient, const std::string & roleArn, const std::string & roleSessionName, const std::string & policy, int durationSeconds) :
+	CredentialsProvider(),
+	stsClient_(stsClient),
+	roleArn_(roleArn),
+	roleSessionName_(roleSessionName),
+	policy_(policy),
+	durationSeconds_(durationSeconds),
+	cachedMutex_(),
+	cachedCredentials_("", ""),
+	expiry_()
+{
+}
+
+StsAssumeRoleCredentialsProvider::~StsAssumeRoleCredentialsProvider()
+{
+}
+
+Credentials StsAssumeRoleCredentialsProvider::getCredentials()
+{
+	loadCredentials();
+	std::lock_guard<std::mutex> locker(cachedMutex_);
+	return cachedCredentials_;
+}
+
+bool StsAssumeRoleCredentialsProvider::checkExpiry()const
+{
+	auto now = std::chrono::system_clock::now();
+	auto diff = std::chrono::duration_cast<std::chrono::seconds>(now - expiry_).count();
+
+	return (diff > 0 - 60);
+}
+
+void StsAssumeRoleCredentialsProvider::loadCredentials()
+{
+	if (checkExpiry())
+	{
+		std::lock_guard<std::mutex> locker(cachedMutex_);
+		if (checkExpiry())
+		{
+			Model::AssumeRoleRequest request;
+			request.setRoleArn(roleArn_);
+			request.setRoleSessionName(roleSessionName_);
+			request.setPolicy(policy_);
+			request.setDurationSeconds(durationSeconds_);
+
+			auto assumeRoleOutcome = stsClient_->assumeRole(request);
+			if (assumeRoleOutcome.isSuccess())
+			{
+				const auto stsCredentials = assumeRoleOutcome.result().credentials();
+				cachedCredentials_ = Credentials(stsCredentials.accessKeyId,
+					stsCredentials.accessKeySecret,
+					stsCredentials.securityToken);
+
+				std::tm tm = {};
+#if defined(__GNUG__) && __GNUC__ < 5
+				strptime(stsCredentials.expiration.c_str(), "%Y-%m-%dT%H:%M:%SZ", &tm);
+#else			
+				std::stringstream ss(stsCredentials.expiration);
+				ss >> std::get_time(&tm, "%Y-%m-%dT%H:%M:%SZ");
+#endif
+				expiry_ = std::chrono::system_clock::from_time_t(std::mktime(&tm));
+			}
+		}
+	}
+}

+ 344 - 0
core/src/Url.cc

@@ -0,0 +1,344 @@
+/*
+ * Copyright 2009-2017 Alibaba Cloud All rights reserved.
+ * 
+ * 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.
+ */
+
+#include <alibabacloud/core/Url.h>
+#include <algorithm>
+#include <sstream>
+
+using namespace AlibabaCloud;
+
+namespace
+{
+#define INVALID_PORT -1
+}
+
+Url::Url(const std::string & url) :
+	scheme_(),
+	userName_(),
+	password_(),
+	host_(),
+	path_(),
+	port_(INVALID_PORT),
+	query_(),
+	fragment_()
+{
+	if(!url.empty())
+		fromString(url);
+}
+
+Url::~Url()
+{
+}
+
+bool Url::operator==(const Url &url) const
+{
+	return scheme_ == url.scheme_
+		&& userName_ == url.userName_
+		&& password_ == url.password_
+		&& host_ == url.host_
+		&& path_ == url.path_
+		&& port_ == url.port_
+		&& query_ == url.query_
+		&& fragment_ == url.fragment_;
+}
+
+bool Url::operator!=(const Url &url) const
+{
+	return !(*this == url);
+}
+
+std::string Url::authority() const
+{
+	if (!isValid())
+		return std::string();
+
+	std::ostringstream out;
+	std::string str = userInfo();
+	if (!str.empty())
+		out << str << "@";
+	out << host_;
+	if (port_ != INVALID_PORT)
+		out << ":" << port_;
+	return out.str();
+}
+
+void Url::clear()
+{
+	scheme_.clear();
+	userName_.clear();
+	password_.clear();
+	host_.clear();
+	path_.clear();
+	port_ = INVALID_PORT;
+	query_.clear();
+	fragment_.clear();
+}
+
+std::string Url::fragment() const
+{
+	return fragment_;
+}
+
+void Url::fromString(const std::string & url)
+{
+	clear();
+	if (url.empty())
+		return;
+
+	std::string str = url;
+	std::string::size_type pos = 0;
+	std::string authority, fragment, path, query, scheme;
+
+	pos = str.find("://");
+	if (pos != str.npos) {
+		scheme = str.substr(0, pos);
+		str.erase(0, pos + 3);
+	}
+
+	pos = str.find('#');
+	if (pos != str.npos) {
+		fragment = str.substr(pos + 1);
+		str.erase(pos);
+	}
+
+	pos = str.find('?');
+	if (pos != str.npos) {
+		query = str.substr(pos + 1);
+		str.erase(pos);
+	}
+
+	pos = str.find('/');
+	if (pos != str.npos) {
+		path = str.substr(pos);
+		str.erase(pos);
+	}
+	else
+		path = "/";
+
+	authority = str;
+
+	setScheme(scheme);
+	setAuthority(authority);
+	setPath(path);
+	setQuery(query);
+	setFragment(fragment);
+}
+
+bool Url::hasFragment() const
+{
+	return !fragment_.empty();
+}
+
+bool Url::hasQuery() const
+{
+	return !query_.empty();
+}
+
+std::string Url::host() const
+{
+	return host_;
+}
+
+bool Url::isEmpty() const
+{
+	return scheme_.empty()
+		&& userName_.empty()
+		&& password_.empty()
+		&& host_.empty()
+		&& path_.empty()
+		&& (port_ == INVALID_PORT)
+		&& query_.empty()
+		&& fragment_.empty();
+}
+
+bool Url::isValid() const
+{
+	if (isEmpty())
+		return false;
+
+	if (host_.empty())
+		return false;
+
+	bool valid = true;
+	if (userName_.empty())
+		valid = password_.empty();
+	return valid;
+}
+
+int Url::port() const
+{
+	return port_;
+}
+
+std::string Url::password() const
+{
+	return password_;
+}
+
+std::string Url::path() const
+{
+	return path_;
+}
+
+std::string Url::query() const
+{
+	return query_;
+}
+
+std::string Url::scheme() const
+{
+	return scheme_;
+}
+
+void Url::setAuthority(const std::string & authority)
+{
+	if (authority.empty()) {
+		setUserInfo("");
+		setHost("");
+		setPort(INVALID_PORT);
+		return;
+	}
+
+	std::string userinfo, host, port;
+	std::string::size_type pos = 0, prevpos = 0;
+
+	pos = authority.find('@');
+	if (pos != authority.npos) {
+		userinfo = authority.substr(0, pos);
+		prevpos = pos + 1;
+	}
+	else {
+		pos = 0;
+	}
+
+	pos = authority.find(':', prevpos);
+	if (pos == authority.npos)
+		host = authority.substr(prevpos);
+	else {
+		host = authority.substr(prevpos, pos - prevpos);
+		port = authority.substr(pos + 1);
+	}
+
+	setUserInfo(userinfo);
+	setHost(host);
+	setPort(!port.empty() ? atoi(port.c_str()): INVALID_PORT);
+}
+
+void Url::setFragment(const std::string & fragment)
+{
+	fragment_ = fragment;
+}
+
+void Url::setHost(const std::string & host)
+{
+	if(host.empty()){
+		host_.clear();
+		return;
+	}
+	host_ = host;
+	std::transform(host_.begin(), host_.end(), host_.begin(), ::tolower);
+}
+
+void Url::setPassword(const std::string & password)
+{
+	password_ = password;
+}
+
+void Url::setPath(const std::string & path)
+{
+	path_ = path;
+}
+
+void Url::setPort(int port)
+{
+	port_ = port;
+}
+
+void Url::setQuery(const std::string & query)
+{
+	query_ = query;
+}
+
+void Url::setScheme(const std::string & scheme)
+{
+	if(scheme.empty()){
+		scheme_.clear();
+		return;
+	}
+	scheme_ = scheme;
+	std::transform(scheme_.begin(), scheme_.end(), scheme_.begin(), ::tolower);
+}
+
+void Url::setUserInfo(const std::string & userInfo)
+{
+	if (userInfo.empty()) {
+		userName_.clear();
+		password_.clear();
+		return;
+	}
+
+	auto pos = userInfo.find(':');
+	if (pos == userInfo.npos)
+		userName_ = userInfo;
+	else {
+		userName_ = userInfo.substr(0, pos);
+		password_ = userInfo.substr(pos + 1);
+	}
+}
+
+void Url::setUserName(const std::string & userName)
+{
+	userName_ = userName;
+}
+
+std::string Url::toString() const
+{
+	if (!isValid())
+		return std::string();
+
+	std::ostringstream out;
+	if (!scheme_.empty())
+		out << scheme_ << "://";
+	std::string str = authority();
+	if (!str.empty())
+		out << authority();
+	if (path_.empty())
+		out << "/";
+	else
+		out << path_;
+	if (hasQuery())
+		out << "?" << query_;
+	if (hasFragment())
+		out << "#" << fragment_;
+	return out.str();
+}
+
+std::string Url::userInfo() const
+{
+	if (!isValid())
+		return std::string();
+
+	std::ostringstream out;
+	out << userName_;
+	if (!password_.empty())
+		out << ":" << password_;
+	return out.str();
+}
+
+std::string Url::userName() const
+{
+	return userName_;
+}

Деякі файли не було показано, через те що забагато файлів було змінено