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.
22 # An abstract request that defines most of the standard options for Neo4j REST API
23 abstract class JsonCurlRequest
27 var auth
: nullable String is writable
29 # init HTTP headers for Neo4j REST API
30 protected fun init_headers
do
31 headers
= new HeaderMap
32 headers
["Accept"] = "application/json; charset=UTF-8"
33 headers
["Transfer-Encoding"] = "chunked"
34 headers
["X-Stream"] = "true"
36 headers
["Authorization"] = "token {auth.to_s}"
39 # User agent (is used by github to contact devs in case of problems)
40 if user_agent
!= null then
41 headers
["User-Agent"] = user_agent
.to_s
48 if not self.curl
.is_ok
then
49 return answer_failure
(0, "Curl instance is not correctly initialized")
52 var success_response
= new CurlResponseSuccess
53 var callback_receiver
: CurlCallbacks = success_response
54 if self.delegate
!= null then callback_receiver
= self.delegate
.as(not null)
56 var err
= self.curl
.native
.easy_setopt
(new CURLOption.follow_location
, 1)
57 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
59 err
= self.curl
.native
.easy_setopt
(new CURLOption.http_version
, 1)
60 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
62 err
= self.curl
.native
.easy_setopt
(new CURLOption.url
, url
)
63 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
65 err
= self.curl
.native
.register_callback_header
(callback_receiver
)
66 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
68 err
= self.curl
.native
.register_callback_body
(callback_receiver
)
69 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
72 if self.headers
!= null then
73 var headers_joined
= self.headers
.join_pairs
(": ")
74 err
= self.curl
.native
.easy_setopt
(
75 new CURLOption.httpheader
, headers_joined
.to_curlslist
)
76 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
79 var err_hook
= execute_hook
80 if err_hook
!= null then return err_hook
82 var err_resp
= perform
83 if err_resp
!= null then return err_resp
85 var st_code
= self.curl
.native
.easy_getinfo_long
(new CURLInfoLong.response_code
)
86 if not st_code
== null then success_response
.status_code
= st_code
88 return success_response
91 # Hook to implement in concrete requests
92 protected fun execute_hook
: nullable CurlResponse do return null
99 redef fun execute_hook
do
100 var err
= self.curl
.native
.easy_setopt
(new CURLOption.get
, true)
101 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
106 # HTTP POST command that sends JSON data
108 super JsonCurlRequest
110 var json_data
: nullable Serializable = null is writable
112 redef fun init_headers
do
114 headers
["Content-Type"] = "application/json"
117 redef fun execute_hook
do
118 var err
= self.curl
.native
.easy_setopt
(new CURLOption.post
, true)
119 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
121 if self.json_data
!= null then
122 var postdatas
= self.json_data
.to_json
123 err
= self.curl
.native
.easy_setopt
(new CURLOption.postfields
, postdatas
)
124 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
130 # HTTP DELETE command
132 super JsonCurlRequest
134 redef fun execute_hook
do
135 var err
= self.curl
.native
.easy_setopt
(new CURLOption.custom_request
, "DELETE")
136 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
141 # HTTP PUT command that sends JSON data
143 super JsonCurlRequest
145 var json_data
: nullable Serializable = null is writable
147 redef fun init_headers
do
149 headers
["Content-Type"] = "application/json"
152 redef fun execute_hook
do
153 var err
= self.curl
.native
.easy_setopt
(new CURLOption.custom_request
, "PUT")
154 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)
156 if self.json_data
!= null then
157 var postdatas
= self.json_data
.to_json
158 err
= self.curl
.native
.easy_setopt
(new CURLOption.postfields
, postdatas
)
159 if not err
.is_ok
then return answer_failure
(err
.to_i
, err
.to_s
)