Changes
3 changed files (+90/-0)
-
src/Moo/Body.test.vala (new)
-
@@ -0,0 +1,37 @@// Copyright 2025 Shota FUJI // // 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. // // SPDX-License-Identifier: Apache-2.0 using GLib; namespace Moo { namespace Tests { public void add_json_body_tests() { Test.add_func("/libmoo/json-body/parse-single", () => { try { var input = "MOO/1 REQUEST foo\nContent-Type: application/json\nContent-Length: 10\n\n{\"foo\": 8}"; var metadata = new Metadata.from_string(input); var headers = new Headers.from_string(input, metadata); var body = new JsonBody.from_string(input, headers); assert(body.data == "{\"foo\": 8}"); } catch (Error e) { assert_no_error(e); } }); } } }
-
-
src/Moo/Body.vala (new)
-
@@ -0,0 +1,52 @@// Copyright 2025 Shota FUJI // // 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. // // SPDX-License-Identifier: Apache-2.0 namespace Moo { public errordomain JsonBodyParseError { NO_PARSING_CONTEXT, CONTENT_LENGTH_MISMATCH, CONTENT_TYPE_MISMATCH, } public class JsonBody : Object { public string data { get; construct; } public JsonBody.from_string(string src, Headers headers) throws JsonBodyParseError { if (headers.last_byte_index < 0) { throw new JsonBodyParseError.NO_PARSING_CONTEXT("Headers does not contain parsed length."); } if (headers.content_length == 0) { throw new JsonBodyParseError.CONTENT_LENGTH_MISMATCH("Content-Length is zero or missing."); } if (headers.content_type == null) { throw new JsonBodyParseError.CONTENT_TYPE_MISMATCH("Content-Type is missing."); } if (headers.content_type != "application/json") { throw new JsonBodyParseError.CONTENT_TYPE_MISMATCH("Content-Type is not application/json."); } var body = src.slice(headers.last_byte_index, src.length); if (body.length != headers.content_length) { throw new JsonBodyParseError.CONTENT_LENGTH_MISMATCH("Body size does not match the declared one."); } Object(data: body); } } }
-
-
-
@@ -18,5 +18,6 @@ void main(string[] args) {GLib.Test.init(ref args); Moo.Tests.add_metadata_tests(); Moo.Tests.add_headers_tests(); Moo.Tests.add_json_body_tests(); GLib.Test.run(); }
-