1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
15 # cURL requests compatible with the JSON REST APIs.
21 # An abstract request that defines most of the standard options for Neo4j REST API
22 abstract class JsonCurlRequest
26 var auth
: nullable String is writable
28 # init HTTP headers for Neo4j REST API
29 protected fun init_headers
do
30 headers
= new HeaderMap
31 headers
["Accept"] = "application/json; charset=UTF-8"
32 headers
["Transfer-Encoding"] = "chunked"
33 headers
["X-Stream"] = "true"
35 headers
["Authorization"] = "token {auth.to_s}"
38 # User agent (is used by github to contact devs in case of problems)
39 if user_agent
!= null then
40 headers
["User-Agent"] = user_agent
.to_s
47 if not self.curl
.is_ok
then
48 return answer_failure
(0, "Curl instance is not correctly initialized")
51 var success_response
= new CurlResponseSuccess
52 var callback_receiver
: CurlCallbacks = success_response
53 if self.delegate
!= null then callback_receiver
= self.delegate
.as(not null)
55 var err
= self.curl
.native
.easy_setopt
(new CURLOption.follow_location
, 1)
56 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
58 err
= self.curl
.native
.easy_setopt
(new CURLOption.http_version
, 1)
59 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
61 err
= self.curl
.native
.easy_setopt
(new CURLOption.url
, url
)
62 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
64 err
= self.curl
.native
.register_callback_header
(callback_receiver
)
65 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
67 err
= self.curl
.native
.register_callback_body
(callback_receiver
)
68 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
71 if self.headers
!= null then
72 var headers_joined
= self.headers
.join_pairs
(": ")
73 err
= self.curl
.native
.easy_setopt
(
74 new CURLOption.httpheader
, headers_joined
.to_curlslist
)
75 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
78 var err_hook
= execute_hook
79 if err_hook
!= null then return err_hook
81 var err_resp
= perform
82 if err_resp
!= null then return err_resp
84 var st_code
= self.curl
.native
.easy_getinfo_long
(new CURLInfoLong.response_code
)
85 if not st_code
== null then success_response
.status_code
= st_code
87 return success_response
90 # Hook to implement in concrete requests
91 protected fun execute_hook
: nullable CurlResponse do return null
98 redef fun execute_hook
do
99 var err
= self.curl
.native
.easy_setopt
(new CURLOption.get
, true)
100 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
105 # HTTP POST command that sends JSON data
107 super JsonCurlRequest
109 var data
: nullable Jsonable = null is writable
111 redef fun init_headers
do
113 headers
["Content-Type"] = "application/json"
116 redef fun execute_hook
do
117 var err
= self.curl
.native
.easy_setopt
(new CURLOption.post
, true)
118 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
120 if self.data
!= null then
121 var postdatas
= self.data
.to_json
122 err
= self.curl
.native
.easy_setopt
(new CURLOption.postfields
, postdatas
)
123 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
129 # HTTP DELETE command
131 super JsonCurlRequest
133 redef fun execute_hook
do
134 var err
= self.curl
.native
.easy_setopt
(new CURLOption.custom_request
, "DELETE")
135 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
140 # HTTP PUT command that sends JSON data
142 super JsonCurlRequest
144 var data
: nullable Jsonable = null is writable
146 redef fun init_headers
do
148 headers
["Content-Type"] = "application/json"
151 redef fun execute_hook
do
152 var err
= self.curl
.native
.easy_setopt
(new CURLOption.custom_request
, "PUT")
153 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
155 if self.data
!= null then
156 var postdatas
= self.data
.to_json
157 err
= self.curl
.native
.easy_setopt
(new CURLOption.postfields
, postdatas
)
158 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)