From e632815ff8224fcf05f7b48c71833fd67b27784e Mon Sep 17 00:00:00 2001 From: Jiaxin Ge Date: Tue, 15 Feb 2022 22:52:40 -0800 Subject: [PATCH 01/16] branch for test demo server --- .gitignore | 7 +++++++ demo_server/Dockerfile | 2 +- demo_server/README.md | 2 +- demo_server/demo_server/db.sqlite | Bin 112640 -> 117760 bytes demo_server/demo_server/settings.py | 2 +- demo_server/swagger.json | 2 +- docs/user-guide/Replay.md | 4 ++-- docs/user-guide/Testing.md | 2 +- docs/user-guide/TutorialDemoServer.md | 2 +- .../dependencyTests/header_deps_grammar.py | 8 ++++---- ...ader_response_writer_annotation_grammar.py | 8 ++++---- .../header_response_writer_grammar.py | 8 ++++---- .../dependencyTests/ordering_test_grammar.py | 6 +++--- .../path_annotation_grammar.py | 4 ++-- .../path_in_dictionary_payload_grammar.py | 4 ++-- .../quoted_primitives_grammar.py | 6 +++--- .../exampleTests/array_example_grammar.py | 6 +++--- .../grammarTests/required_params_grammar.json | 4 ++-- .../grammarTests/required_params_grammar.py | 4 ++-- .../required_params_grammar_requiredonly.py | 4 ++-- .../annotationTests/pathAnnotation.json | 2 +- .../pathAnnotationInSeparateFile.json | 2 +- .../swagger/array_example.json | 2 +- .../swagger/array_example_external.json | 2 +- .../swagger/configTests/swagger1.json | 2 +- .../swagger/configTests/swagger2.json | 2 +- .../swagger/configTests/swagger3.json | 2 +- .../swagger/demo_server.json | 2 +- .../array_dep_multiple_items.json | 2 +- .../body_dependency_cycles.json | 2 +- .../dependencyTests/frontend_port_id.json | 2 +- .../swagger/dependencyTests/header_deps.json | 2 +- .../inconsistent_casing_paths.json | 2 +- .../dependencyTests/input_producer_spec.json | 2 +- .../ip_configurations_get.json | 2 +- .../dependencyTests/lowercase_paths.json | 2 +- .../nested_objects_naming.json | 2 +- .../dependencyTests/ordering_test.json | 2 +- .../post_patch_dependency.json | 2 +- .../dependencyTests/response_headers.json | 2 +- .../swagger/dependencyTests/subnet_id.json | 2 +- .../dictionaryTests/customPayloadSwagger.json | 2 +- .../multipleIdenticalUuidSuffix.json | 2 +- .../swagger/dictionaryTests/no_params.json | 2 +- .../pathDictionaryPayload.json | 2 +- .../swagger/empty_array_example.json | 2 +- .../swagger/exactCopy/array_example.json | 2 +- .../swagger/example_demo.json | 2 +- .../swagger/example_demo1.json | 2 +- .../swagger/example_demo1.yaml | 2 +- .../swagger/get_path_dependencies.json | 2 +- .../swagger/grammarTests/required_params.json | 2 +- .../swagger/headers.json | 2 +- .../swagger/inline_examples.json | 2 +- .../swagger/object_example.json | 2 +- .../swagger/put_createorupdate.json | 2 +- .../schemaTests/global_path_parameters.json | 2 +- .../swagger/schemaTests/large_json_body.json | 2 +- 58 files changed, 84 insertions(+), 77 deletions(-) diff --git a/.gitignore b/.gitignore index cfe0ce19..c9ab9881 100644 --- a/.gitignore +++ b/.gitignore @@ -358,3 +358,10 @@ MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder .ionide/ + +# Restler bin +restler_bin/ +Compile/ +Fuzz/ +Test/ +demo_server/coverage_stats.txt \ No newline at end of file diff --git a/demo_server/Dockerfile b/demo_server/Dockerfile index 5510131e..e5f9ffed 100644 --- a/demo_server/Dockerfile +++ b/demo_server/Dockerfile @@ -9,7 +9,7 @@ WORKDIR /app RUN pip install -r requirements.txt -EXPOSE 8888 +EXPOSE 8878 ENV FLASK_RUN_HOST=0.0.0.0 diff --git a/demo_server/README.md b/demo_server/README.md index a1a0531c..c5de4fc4 100644 --- a/demo_server/README.md +++ b/demo_server/README.md @@ -35,7 +35,7 @@ Start demo server at one teminal Swagger ================== - The interactive swagger specification interface will be available at - http://localhost:8888/api/ using your browser. + http://localhost:8878/api/ using your browser. - The swagger can also be found in the demo_server directory as swagger.json - The swagger was automatically generated by flask-restplus - This swagger can be compiled and tested using RESTler. diff --git a/demo_server/demo_server/db.sqlite b/demo_server/demo_server/db.sqlite index f50491efb2cba665fd03287662c22a3329f2902f..8587d24804a50786715ed270954e3a13f211fc38 100644 GIT binary patch delta 1503 zcmZXUO=uNY6vywGJ9$aeMC0}2nWUOn+rHYQojYH5MiB%lbm78o#EpeFcV=v;#x{9M zc~$56vGN1dAW3)KD2nu5ON!ZuAa>bRu?Vh;i&Bbhv+Sz$yir~}IB;k2yZ<@&{LeXe zTFaHzLhse#!4bh2n|-zHYqfAak`H$;4)%l%82`{C&NgPIrjK||s4`(V)kc9;=6g1LoM28D2@Ce2t^w!@Or|TAF6cz!acY%A=;CjQBFl(qbO1uo)w3=#N>BhPc zW)&3&ew<*4eo9p)lU$fSO8r0uT9|hzRk0gl|3@he6P5VFj8IyHQS4)G!xU?kN9b+~ zrCuUqtVEU4ICE1R&CQfXsgt9PO(pGi-j7v^No?$Di*n|5pb|W80~M!noYjR9U2&;( zJzdAZ>nW9 hORex<{10CovwwT}nj5nZ4REaVm$<&dHG_f|{C`Eqqu>Al delta 128 zcmZpe!QSwJZGse^WD^4eLmm)=!9)!+A)tuv#~r*tJ`=M919LaC#AZR36-=8YnBTB) zWHGjZ6y{Cl;kYtckYy!v?pm+r9?tDOoQxIAm~9zarn7Hgtex( POST /api/blog/posts HTTP/1.1\r\nAccept: application/json\r\nHost: localhost:8888\r\nContent-Type: application/json\r\n\r\n{\n "id":0,\n "body":"fuzzstring"}\r\n +-> POST /api/blog/posts HTTP/1.1\r\nAccept: application/json\r\nHost: localhost:8878\r\nContent-Type: application/json\r\n\r\n{\n "id":0,\n "body":"fuzzstring"}\r\n ! producer_timing_delay 0 ! max_async_wait_time 0 PREVIOUS RESPONSE: 'HTTP/1.1 201 CREATED\r\nContent-Type: application/json\r\nContent-Length: 45\r\nServer: Werkzeug/0.16.0 Python/3.8.2\r\nDate: Thu, 01 Oct 2020 22:00:27 GMT\r\n\r\n{\n "id": 5875,\n "body": "fuzzstring"\n}\n' --> PUT /api/blog/posts/5875 HTTP/1.1\r\nAccept: application/json\r\nHost: localhost:8888\r\nContent-Type: application/json\r\n\r\n{"body":"fuzzstring"} +-> PUT /api/blog/posts/5875 HTTP/1.1\r\nAccept: application/json\r\nHost: localhost:8878\r\nContent-Type: application/json\r\n\r\n{"body":"fuzzstring"} ! producer_timing_delay 0 ! max_async_wait_time 0 PREVIOUS RESPONSE: 'HTTP/1.1 500 INTERNAL SERVER ERROR\r\nContent-Type: application/json\r\nContent-Length: 176\r\nServer: Werkzeug/0.16.0 Python/3.8.2\r\nDate: Thu, 01 Oct 2020 22:00:28 GMT\r\n\r\n{\n "message": "The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application."\n}\n' diff --git a/docs/user-guide/Testing.md b/docs/user-guide/Testing.md index 13769afc..62c662f9 100644 --- a/docs/user-guide/Testing.md +++ b/docs/user-guide/Testing.md @@ -94,7 +94,7 @@ During each Test run a `speccov.json` file will be created in the logs directory "request_uri": "/api/blog/posts/5872", "request_headers": [ "Accept: application/json", - "Host: localhost:8888", + "Host: localhost:8878", "Content-Type: application/json" ], "request_body": "{\n \"id\":\"5872\",\n \"checksum\":\"fuzzstring\",\n \"body\":\"first blog\"}\r\n", diff --git a/docs/user-guide/TutorialDemoServer.md b/docs/user-guide/TutorialDemoServer.md index 3f599e53..d0a64c3a 100644 --- a/docs/user-guide/TutorialDemoServer.md +++ b/docs/user-guide/TutorialDemoServer.md @@ -58,7 +58,7 @@ In this example, coverage is 5 / 6 and the only INVALID request is + restler_fuzzable_int: ['0', '1'] - restler_static_string: ' HTTP/1.1\r\n' - restler_static_string: 'Accept: application/json\r\n' - - restler_static_string: 'Host: localhost:8888\r\n' + - restler_static_string: 'Host: localhost:8878\r\n' - restler_static_string: '\r\n' By looking at `network.testing.<...>.txt`, we can see that RESTler attempts to execute this request 4 times, each time with a value either 0 or 1 for the `per_page=` and `page=`. It turns out none of these 4 combinations are valid: the `per_page=` must be 2 minimally, but RESTler was not able to infer this automatically. (One way to fix this is to edit `dict.json` and add the value `2` in the list for `restler_fuzzable_int`.) diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_deps_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_deps_grammar.py index 854bc306..952fb62e 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_deps_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_deps_grammar.py @@ -57,7 +57,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -87,7 +87,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("user-id: "), primitives.restler_static_string(_service_user_post_user_id_header.reader(), quoted=False), primitives.restler_static_string("\r\n"), @@ -109,7 +109,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("user-id: "), primitives.restler_static_string(_service_user_post_user_id_header.reader(), quoted=False), primitives.restler_static_string("\r\n"), @@ -131,7 +131,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("user-id: "), primitives.restler_static_string(_service_user_post_user_id_header.reader(), quoted=False), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_annotation_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_annotation_grammar.py index 605ae357..97127d70 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_annotation_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_annotation_grammar.py @@ -57,7 +57,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -89,7 +89,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_Location_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -110,7 +110,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_Location_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -131,7 +131,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_Location_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_grammar.py index 73e29e71..021d683e 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_grammar.py @@ -57,7 +57,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -89,7 +89,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_userId_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -110,7 +110,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_userId_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -131,7 +131,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_userId_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/ordering_test_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/ordering_test_grammar.py index ecf4e248..a0dafdb6 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/ordering_test_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/ordering_test_grammar.py @@ -18,7 +18,7 @@ primitives.restler_static_string("products"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -47,7 +47,7 @@ primitives.restler_static_string("services"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -77,7 +77,7 @@ primitives.restler_static_string("managementTools"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_annotation_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_annotation_grammar.py index fa87e5fb..59de9949 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_annotation_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_annotation_grammar.py @@ -80,7 +80,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("stores"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -114,7 +114,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("order"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_in_dictionary_payload_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_in_dictionary_payload_grammar.py index bdf481fc..40e54141 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_in_dictionary_payload_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_in_dictionary_payload_grammar.py @@ -54,7 +54,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("stores"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -86,7 +86,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("order"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dictionaryTests/quoted_primitives_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dictionaryTests/quoted_primitives_grammar.py index 7ce6bec9..23a4a84e 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dictionaryTests/quoted_primitives_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dictionaryTests/quoted_primitives_grammar.py @@ -54,7 +54,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("stores"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -86,7 +86,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string(_stores_post_id.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), @@ -135,7 +135,7 @@ def parse_storespost(data, **kwargs): primitives.restler_custom_payload("message", quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/exampleTests/array_example_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/exampleTests/array_example_grammar.py index 113bdc84..b749e254 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/exampleTests/array_example_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/exampleTests/array_example_grammar.py @@ -54,7 +54,7 @@ def parse_storesstoreIdorderpost(data, **kwargs): primitives.restler_static_string("stores"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -99,7 +99,7 @@ def parse_storesstoreIdorderpost(data, **kwargs): primitives.restler_static_string("fff"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), @@ -158,7 +158,7 @@ def parse_storesstoreIdorderpost(data, **kwargs): primitives.restler_fuzzable_string("fuzzstring", quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.json b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.json index 170212dc..9da62551 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.json +++ b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.json @@ -112,7 +112,7 @@ ], [ "Host", - "localhost:8888" + "localhost:8878" ] ], "httpVersion": "1.1", @@ -340,7 +340,7 @@ ], [ "Host", - "localhost:8888" + "localhost:8878" ] ], "httpVersion": "1.1", diff --git a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.py index fd836fe8..a08c6ef6 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.py @@ -14,7 +14,7 @@ primitives.restler_static_string("customers"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), @@ -46,7 +46,7 @@ primitives.restler_fuzzable_string("fuzzstring", quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("array_header_param: "), primitives.restler_fuzzable_string("fuzzstring", quoted=False), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar_requiredonly.py b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar_requiredonly.py index b62c12d5..98b849d8 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar_requiredonly.py +++ b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar_requiredonly.py @@ -14,7 +14,7 @@ primitives.restler_static_string("customers"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), @@ -37,7 +37,7 @@ primitives.restler_static_string("customers"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), diff --git a/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotation.json b/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotation.json index 11b1402c..654a1b25 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotation.json +++ b/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotation.json @@ -180,7 +180,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotationInSeparateFile.json b/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotationInSeparateFile.json index 38c23eb6..d18520dc 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotationInSeparateFile.json +++ b/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotationInSeparateFile.json @@ -166,7 +166,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/array_example.json b/src/compiler/Restler.Compiler.Test/swagger/array_example.json index 18f134da..895741f4 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/array_example.json +++ b/src/compiler/Restler.Compiler.Test/swagger/array_example.json @@ -129,7 +129,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/array_example_external.json b/src/compiler/Restler.Compiler.Test/swagger/array_example_external.json index 07990853..5992b1a0 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/array_example_external.json +++ b/src/compiler/Restler.Compiler.Test/swagger/array_example_external.json @@ -129,7 +129,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger1.json b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger1.json index 09b2afd9..b2c97698 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger1.json +++ b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger1.json @@ -161,7 +161,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger2.json b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger2.json index 857f7335..8b64cbe4 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger2.json +++ b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger2.json @@ -161,7 +161,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger3.json b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger3.json index e17bad3d..9c1b9937 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger3.json +++ b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger3.json @@ -165,7 +165,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/demo_server.json b/src/compiler/Restler.Compiler.Test/swagger/demo_server.json index 788c65dc..a419b11b 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/demo_server.json +++ b/src/compiler/Restler.Compiler.Test/swagger/demo_server.json @@ -76,7 +76,7 @@ ] } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple demonstration of a Flask RestPlus powered API", "title": "My Blog API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/array_dep_multiple_items.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/array_dep_multiple_items.json index 54c620ec..55ab9e29 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/array_dep_multiple_items.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/array_dep_multiple_items.json @@ -122,7 +122,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/body_dependency_cycles.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/body_dependency_cycles.json index c5791ada..036200c8 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/body_dependency_cycles.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/body_dependency_cycles.json @@ -69,7 +69,7 @@ } } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example that produces cycles due to body dependencies.", "title": "Cycle body dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/frontend_port_id.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/frontend_port_id.json index 9e6a1aaa..0bfa6dea 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/frontend_port_id.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/frontend_port_id.json @@ -314,7 +314,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for object with embedded consumer.", "title": "Subnet dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/header_deps.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/header_deps.json index 78301f90..51870199 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/header_deps.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/header_deps.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for header dependencies.", "title": "The title.", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/inconsistent_casing_paths.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/inconsistent_casing_paths.json index 5e2fbb1a..06519418 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/inconsistent_casing_paths.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/inconsistent_casing_paths.json @@ -19,7 +19,7 @@ "x-ms-azure-resource": true } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for inconsistent casing paths.", "title": "Inconsistent casing path dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/input_producer_spec.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/input_producer_spec.json index 84b9b2b4..c345caf9 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/input_producer_spec.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/input_producer_spec.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for POST with input producer", "title": "Input producer test case", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ip_configurations_get.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ip_configurations_get.json index 005ace1d..216a4eb0 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ip_configurations_get.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ip_configurations_get.json @@ -278,7 +278,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for object with embedded consumer.", "title": "Subnet dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/lowercase_paths.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/lowercase_paths.json index b40ddf44..0ba5e8ee 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/lowercase_paths.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/lowercase_paths.json @@ -15,7 +15,7 @@ "x-ms-azure-resource": true } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for lowercase paths.", "title": "Lowercase path dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/nested_objects_naming.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/nested_objects_naming.json index 197e9bb3..a775887b 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/nested_objects_naming.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/nested_objects_naming.json @@ -199,7 +199,7 @@ } } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for object with embedded consumer.", "title": "Subnet dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ordering_test.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ordering_test.json index b35cf804..611c9615 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ordering_test.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ordering_test.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for ordering constraints.", "title": "The title.", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/post_patch_dependency.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/post_patch_dependency.json index 5952d435..3e0f25d1 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/post_patch_dependency.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/post_patch_dependency.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for POST and dependent PATCH.", "title": "patch dependency test case.", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/response_headers.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/response_headers.json index 5f82fff8..48ca531f 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/response_headers.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/response_headers.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for header dependencies.", "title": "The title.", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/subnet_id.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/subnet_id.json index b5e9dbd7..c015cc6e 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/subnet_id.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/subnet_id.json @@ -121,7 +121,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for object with embedded consumer.", "title": "Subnet dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/customPayloadSwagger.json b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/customPayloadSwagger.json index 4d4ea929..6420a766 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/customPayloadSwagger.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/customPayloadSwagger.json @@ -175,7 +175,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/multipleIdenticalUuidSuffix.json b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/multipleIdenticalUuidSuffix.json index 77d4d585..40c9abd8 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/multipleIdenticalUuidSuffix.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/multipleIdenticalUuidSuffix.json @@ -24,7 +24,7 @@ } } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Resource API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/no_params.json b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/no_params.json index 73c3dd69..b0fd9041 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/no_params.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/no_params.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec with one header and one query parameter.", "title": "Simple spec", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/pathDictionaryPayload.json b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/pathDictionaryPayload.json index 7af7db5f..2a0a46ca 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/pathDictionaryPayload.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/pathDictionaryPayload.json @@ -170,7 +170,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/empty_array_example.json b/src/compiler/Restler.Compiler.Test/swagger/empty_array_example.json index 292e0d4e..987bc171 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/empty_array_example.json +++ b/src/compiler/Restler.Compiler.Test/swagger/empty_array_example.json @@ -115,7 +115,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/exactCopy/array_example.json b/src/compiler/Restler.Compiler.Test/swagger/exactCopy/array_example.json index 26e604e7..a22ce673 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/exactCopy/array_example.json +++ b/src/compiler/Restler.Compiler.Test/swagger/exactCopy/array_example.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "Parameter examples", diff --git a/src/compiler/Restler.Compiler.Test/swagger/example_demo.json b/src/compiler/Restler.Compiler.Test/swagger/example_demo.json index 468f6ff9..6d73c551 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/example_demo.json +++ b/src/compiler/Restler.Compiler.Test/swagger/example_demo.json @@ -116,7 +116,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/example_demo1.json b/src/compiler/Restler.Compiler.Test/swagger/example_demo1.json index 27bbee5d..50425312 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/example_demo1.json +++ b/src/compiler/Restler.Compiler.Test/swagger/example_demo1.json @@ -121,7 +121,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/example_demo1.yaml b/src/compiler/Restler.Compiler.Test/swagger/example_demo1.yaml index 5938a713..6881b8fe 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/example_demo1.yaml +++ b/src/compiler/Restler.Compiler.Test/swagger/example_demo1.yaml @@ -84,7 +84,7 @@ definitions: $ref: '#/definitions/KeyType' description: The key type. description: The callback url parameters. -host: 'localhost:8888' +host: 'localhost:8878' info: description: A simple swagger spec that uses examples title: My Grocery API diff --git a/src/compiler/Restler.Compiler.Test/swagger/get_path_dependencies.json b/src/compiler/Restler.Compiler.Test/swagger/get_path_dependencies.json index 005d1d09..4764e578 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/get_path_dependencies.json +++ b/src/compiler/Restler.Compiler.Test/swagger/get_path_dependencies.json @@ -179,7 +179,7 @@ }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "", "title": "Based on ApplicationGateway.json", diff --git a/src/compiler/Restler.Compiler.Test/swagger/grammarTests/required_params.json b/src/compiler/Restler.Compiler.Test/swagger/grammarTests/required_params.json index 43635b64..502ce2d8 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/grammarTests/required_params.json +++ b/src/compiler/Restler.Compiler.Test/swagger/grammarTests/required_params.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses required and optional parameters", "title": "Parameters example spec", diff --git a/src/compiler/Restler.Compiler.Test/swagger/headers.json b/src/compiler/Restler.Compiler.Test/swagger/headers.json index b0d69011..b74d5955 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/headers.json +++ b/src/compiler/Restler.Compiler.Test/swagger/headers.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses headers", "title": "Header example spec", diff --git a/src/compiler/Restler.Compiler.Test/swagger/inline_examples.json b/src/compiler/Restler.Compiler.Test/swagger/inline_examples.json index 39b7e34e..114e5d4e 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/inline_examples.json +++ b/src/compiler/Restler.Compiler.Test/swagger/inline_examples.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses inline examples", "title": "Inline example spec", diff --git a/src/compiler/Restler.Compiler.Test/swagger/object_example.json b/src/compiler/Restler.Compiler.Test/swagger/object_example.json index fa04bbf8..aebf5468 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/object_example.json +++ b/src/compiler/Restler.Compiler.Test/swagger/object_example.json @@ -115,7 +115,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/put_createorupdate.json b/src/compiler/Restler.Compiler.Test/swagger/put_createorupdate.json index 73d2e9a9..5845eafa 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/put_createorupdate.json +++ b/src/compiler/Restler.Compiler.Test/swagger/put_createorupdate.json @@ -115,7 +115,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/schemaTests/global_path_parameters.json b/src/compiler/Restler.Compiler.Test/swagger/schemaTests/global_path_parameters.json index 1aad56f8..d454c7e0 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/schemaTests/global_path_parameters.json +++ b/src/compiler/Restler.Compiler.Test/swagger/schemaTests/global_path_parameters.json @@ -5,7 +5,7 @@ "version": "1" }, - "host": "localhost:8888", + "host": "localhost:8878", "paths": { "/customer/{customerId}": { "put": { diff --git a/src/compiler/Restler.Compiler.Test/swagger/schemaTests/large_json_body.json b/src/compiler/Restler.Compiler.Test/swagger/schemaTests/large_json_body.json index e503a17a..1ab709ec 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/schemaTests/large_json_body.json +++ b/src/compiler/Restler.Compiler.Test/swagger/schemaTests/large_json_body.json @@ -122,7 +122,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Example with deep json body and both arrays, properties, and objects.", "title": "Test json nesting depth", From ef4672077d899587b3e983e1028989d15a9b260c Mon Sep 17 00:00:00 2001 From: Jiaxin Ge Date: Tue, 15 Feb 2022 22:56:05 -0800 Subject: [PATCH 02/16] add common used comments file --- commands.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 commands.txt diff --git a/commands.txt b/commands.txt new file mode 100644 index 00000000..099d379b --- /dev/null +++ b/commands.txt @@ -0,0 +1,7 @@ +# comments for macos +# compile +dotnet ./restler_bin/restler/Restler.dll compile --api_spec ./demo_server/swagger.json +# test +dotnet ./restler_bin/restler/Restler.dll test --grammar_file ./Compile/grammar.py --dictionary_file ./Compile/dict.json --settings ./Compile/engine_settings.json --no_ssl +# fuzz +dotnet ./restler_bin/restler/Restler.dll fuzz --grammar_file ./Compile/grammar.py --dictionary_file ./Compile/dict.json --settings ./Compile/engine_settings.json --no_ssl From 98f6e7eda9887bd2b8325e4caf165cd6d95d5e9d Mon Sep 17 00:00:00 2001 From: Jiaxin Ge Date: Mon, 21 Feb 2022 11:58:40 -0800 Subject: [PATCH 03/16] add joseph code --- demo_server/demo_server/db.sqlite | Bin 117760 -> 117760 bytes prototype/app.py | 15 +++++++++++++++ prototype/wrapper.py | 30 ++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 prototype/app.py create mode 100644 prototype/wrapper.py diff --git a/demo_server/demo_server/db.sqlite b/demo_server/demo_server/db.sqlite index 8587d24804a50786715ed270954e3a13f211fc38..71e72be4ea720a1cb2d8a848bf36d4c5836ec224 100644 GIT binary patch delta 67 zcmZpe!QL=~eS$Qj$V3@uMv=yZtqF`vwliu@XWhXV0%S$)U^Hf8l$z)$Cd9v9kA*=} Wthl5oGcVmT$<#P``?g(-UV;F(%M^hC delta 49 zcmV-10M7q_m96OkN40TY2>wO|3Hw*e@Z1-JoJ0id^9xB)W)0W6ad1Sq$* Hx&cZNgJBOw diff --git a/prototype/app.py b/prototype/app.py new file mode 100644 index 00000000..f407991b --- /dev/null +++ b/prototype/app.py @@ -0,0 +1,15 @@ +from flask import Flask +import warnings +app = Flask(__name__) + +@app.route('/') +def hello_world(): + # no warning here + return 'helloworld' + +@app.route('/deprecated_api') +def deprecated(): + warnings.warn("devil hides in the detail: deprecated", DeprecationWarning) + return 'everything looks perfectly fine!!' +if __name__ == '__main__': + app.run(debug=True, host='0.0.0.0') \ No newline at end of file diff --git a/prototype/wrapper.py b/prototype/wrapper.py new file mode 100644 index 00000000..c904c651 --- /dev/null +++ b/prototype/wrapper.py @@ -0,0 +1,30 @@ +from flask import Flask, request, g +from app import app +import warnings + +with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + + @app.before_request + def before_req(): + print('request intercepted before processing') + print(request) + + # clear warnings before processing requests + w.clear() + + + @app.after_request + def after_req(response): + print('response intercepted after processing') + print(response) + + # We can access captured warnings in w + print('When processing the reqeust, the following warnings were observed') + print(w) + + # clear warnings after response + w.clear() + return response + + app.run(debug=True, host='0.0.0.0') \ No newline at end of file From 971d4e5f2dab940dce46185c7fe4371f23f86dc9 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 25 Feb 2022 17:34:57 -0800 Subject: [PATCH 04/16] wrapper with 289 to 299 return code --- wrapper/app.py | 21 +++++++++++++++++++ wrapper/wrapper.py | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) create mode 100644 wrapper/app.py create mode 100644 wrapper/wrapper.py diff --git a/wrapper/app.py b/wrapper/app.py new file mode 100644 index 00000000..d85ab4a8 --- /dev/null +++ b/wrapper/app.py @@ -0,0 +1,21 @@ +from flask import Flask +import warnings +app = Flask(__name__) + + +@app.route('/') +def hello_world(): + # no warning here + return 'helloworld' + + +@app.route('/deprecated_api') +def deprecated(): + + warnings.warn("devil hides in the detail: deprecated", DeprecationWarning) + + return 'everything looks perfectly fine!!' + + +if __name__ == '__main__': + app.run(debug=True, host='0.0.0.0') \ No newline at end of file diff --git a/wrapper/wrapper.py b/wrapper/wrapper.py new file mode 100644 index 00000000..c6e2b7d8 --- /dev/null +++ b/wrapper/wrapper.py @@ -0,0 +1,50 @@ +from flask import Flask, request, g +from app import app +import warnings + +warning_map = { + "Warning": 289, + "UserWarning": 290, + "DeprecationWarning": 291, + "SyntaxWarning": 292, + "RuntimeWarning": 293, + "FutureWarning": 294, + "PendingDeprecationWarning": 295, + "ImportWarning": 296, + "UnicodeWarning": 297, + "BytesWarning": 298, + "ResourceWarning": 299 +} + +with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + + @app.before_request + def before_req(): + print('request intercepted before processing') + print(request) + + # clear warnings before processing requests + w.clear() + + + @app.after_request + def after_req(response): + print('response intercepted after processing') + print(response) + + # We can access captured warnings in w + print('When processing the reqeust, the following warnings were observed') + print(w) + + if len(w) > 0: + # Only return the first warning... + warning_category = w[0].category.__name__ + status_code = warning_map.get(warning_category, warning_map["Warning"]) + response.status_code = status_code + + # clear warnings after response + w.clear() + return response + + app.run(debug=True, host='0.0.0.0') \ No newline at end of file From 211ad0c04c24cbf017dcb0503ef8a5d0bab9f6b9 Mon Sep 17 00:00:00 2001 From: Jiaxin Ge Date: Sat, 26 Feb 2022 11:57:05 -0800 Subject: [PATCH 05/16] integrate wrapper with the demo-server --- .../restler_grammar_grammar_17197.py | 234 ++++++++++++++++++ .../restler_grammar_grammar_17460.py | 234 ++++++++++++++++++ .../restler_grammar_grammar_19627.py | 234 ++++++++++++++++++ .../restler_grammar_grammar_20013.py | 234 ++++++++++++++++++ .../restler_grammar_grammar_23963.py | 234 ++++++++++++++++++ .../restler_grammar_grammar_23998.py | 234 ++++++++++++++++++ restler/restler.py | 2 +- 7 files changed, 1405 insertions(+), 1 deletion(-) create mode 100644 restler/RestlerResults/experiment17197/restler_grammar_grammar_17197.py create mode 100644 restler/RestlerResults/experiment17460/restler_grammar_grammar_17460.py create mode 100644 restler/RestlerResults/experiment19627/restler_grammar_grammar_19627.py create mode 100644 restler/RestlerResults/experiment20013/restler_grammar_grammar_20013.py create mode 100644 restler/RestlerResults/experiment23963/restler_grammar_grammar_23963.py create mode 100644 restler/RestlerResults/experiment23998/restler_grammar_grammar_23998.py diff --git a/restler/RestlerResults/experiment17197/restler_grammar_grammar_17197.py b/restler/RestlerResults/experiment17197/restler_grammar_grammar_17197.py new file mode 100644 index 00000000..227aa9c5 --- /dev/null +++ b/restler/RestlerResults/experiment17197/restler_grammar_grammar_17197.py @@ -0,0 +1,234 @@ +""" THIS IS AN AUTOMATICALLY GENERATED FILE!""" +from __future__ import print_function +import json +from engine import primitives +from engine.core import requests +from engine.errors import ResponseParsingException +from engine import dependencies + +_blog_posts_post_body = dependencies.DynamicVariable("_blog_posts_post_body") + +_blog_posts_post_id = dependencies.DynamicVariable("_blog_posts_post_id") + +def parse_blogpostspost(data, **kwargs): + """ Automatically generated response parser """ + # Declare response variables + temp_7262 = None + temp_8173 = None + + if 'headers' in kwargs: + headers = kwargs['headers'] + + + # Parse body if needed + if data: + + try: + data = json.loads(data) + except Exception as error: + raise ResponseParsingException("Exception parsing response, data was not valid json: {}".format(error)) + pass + + # Try to extract each dynamic object + + try: + temp_7262 = str(data["body"]) + + except Exception as error: + # This is not an error, since some properties are not always returned + pass + + + try: + temp_8173 = str(data["id"]) + + except Exception as error: + # This is not an error, since some properties are not always returned + pass + + + + # If no dynamic objects were extracted, throw. + if not (temp_7262 or temp_8173): + raise ResponseParsingException("Error: all of the expected dynamic objects were not present in the response.") + + # Set dynamic variables + if temp_7262: + dependencies.set_variable("_blog_posts_post_body", temp_7262) + if temp_8173: + dependencies.set_variable("_blog_posts_post_id", temp_8173) + +req_collection = requests.RequestCollection([]) +# Endpoint: /blog/posts, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("?"), + primitives.restler_static_string("per_page="), + primitives.restler_fuzzable_group("per_page", ['2','10','50'] , default_enum="10" ,quoted=False), + primitives.restler_static_string("&"), + primitives.restler_static_string("page="), + primitives.restler_fuzzable_int("1"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("correlation_id: "), + primitives.restler_fuzzable_uuid4("566048da-ed19-4cd3-8e0a-b7e0e1ec4d72", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts, method: Post +request = requests.Request([ + primitives.restler_static_string("POST "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("correlation_id: "), + primitives.restler_fuzzable_uuid4("566048da-ed19-4cd3-8e0a-b7e0e1ec4d72", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("client_id: "), + primitives.restler_fuzzable_string("fuzzstring", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("Content-Type: "), + primitives.restler_static_string("application/json"), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("{"), + primitives.restler_static_string(""" + "id":"""), + primitives.restler_fuzzable_int("1", examples=["123"]), + primitives.restler_static_string(""", + "body":"""), + primitives.restler_fuzzable_string("fuzzstring", quoted=True, examples=["first blog"]), + primitives.restler_static_string("}"), + primitives.restler_static_string("\r\n"), + + { + + 'post_send': + { + 'parser': parse_blogpostspost, + 'dependencies': + [ + _blog_posts_post_body.writer(), + _blog_posts_post_id.writer() + ] + } + + }, + +], +requestId="/blog/posts" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Delete +request = requests.Request([ + primitives.restler_static_string("DELETE "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Put +request = requests.Request([ + primitives.restler_static_string("PUT "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Content-Type: "), + primitives.restler_static_string("application/json"), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("{"), + primitives.restler_static_string(""" + "id":"""), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(""", + "checksum":"""), + primitives.restler_fuzzable_string("fuzzstring", quoted=True), + primitives.restler_static_string(""", + "body":"""), + primitives.restler_static_string(_blog_posts_post_body.reader(), quoted=True), + primitives.restler_static_string("}"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /doc, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("doc"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/doc" +) +req_collection.add_request(request) diff --git a/restler/RestlerResults/experiment17460/restler_grammar_grammar_17460.py b/restler/RestlerResults/experiment17460/restler_grammar_grammar_17460.py new file mode 100644 index 00000000..227aa9c5 --- /dev/null +++ b/restler/RestlerResults/experiment17460/restler_grammar_grammar_17460.py @@ -0,0 +1,234 @@ +""" THIS IS AN AUTOMATICALLY GENERATED FILE!""" +from __future__ import print_function +import json +from engine import primitives +from engine.core import requests +from engine.errors import ResponseParsingException +from engine import dependencies + +_blog_posts_post_body = dependencies.DynamicVariable("_blog_posts_post_body") + +_blog_posts_post_id = dependencies.DynamicVariable("_blog_posts_post_id") + +def parse_blogpostspost(data, **kwargs): + """ Automatically generated response parser """ + # Declare response variables + temp_7262 = None + temp_8173 = None + + if 'headers' in kwargs: + headers = kwargs['headers'] + + + # Parse body if needed + if data: + + try: + data = json.loads(data) + except Exception as error: + raise ResponseParsingException("Exception parsing response, data was not valid json: {}".format(error)) + pass + + # Try to extract each dynamic object + + try: + temp_7262 = str(data["body"]) + + except Exception as error: + # This is not an error, since some properties are not always returned + pass + + + try: + temp_8173 = str(data["id"]) + + except Exception as error: + # This is not an error, since some properties are not always returned + pass + + + + # If no dynamic objects were extracted, throw. + if not (temp_7262 or temp_8173): + raise ResponseParsingException("Error: all of the expected dynamic objects were not present in the response.") + + # Set dynamic variables + if temp_7262: + dependencies.set_variable("_blog_posts_post_body", temp_7262) + if temp_8173: + dependencies.set_variable("_blog_posts_post_id", temp_8173) + +req_collection = requests.RequestCollection([]) +# Endpoint: /blog/posts, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("?"), + primitives.restler_static_string("per_page="), + primitives.restler_fuzzable_group("per_page", ['2','10','50'] , default_enum="10" ,quoted=False), + primitives.restler_static_string("&"), + primitives.restler_static_string("page="), + primitives.restler_fuzzable_int("1"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("correlation_id: "), + primitives.restler_fuzzable_uuid4("566048da-ed19-4cd3-8e0a-b7e0e1ec4d72", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts, method: Post +request = requests.Request([ + primitives.restler_static_string("POST "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("correlation_id: "), + primitives.restler_fuzzable_uuid4("566048da-ed19-4cd3-8e0a-b7e0e1ec4d72", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("client_id: "), + primitives.restler_fuzzable_string("fuzzstring", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("Content-Type: "), + primitives.restler_static_string("application/json"), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("{"), + primitives.restler_static_string(""" + "id":"""), + primitives.restler_fuzzable_int("1", examples=["123"]), + primitives.restler_static_string(""", + "body":"""), + primitives.restler_fuzzable_string("fuzzstring", quoted=True, examples=["first blog"]), + primitives.restler_static_string("}"), + primitives.restler_static_string("\r\n"), + + { + + 'post_send': + { + 'parser': parse_blogpostspost, + 'dependencies': + [ + _blog_posts_post_body.writer(), + _blog_posts_post_id.writer() + ] + } + + }, + +], +requestId="/blog/posts" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Delete +request = requests.Request([ + primitives.restler_static_string("DELETE "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Put +request = requests.Request([ + primitives.restler_static_string("PUT "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Content-Type: "), + primitives.restler_static_string("application/json"), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("{"), + primitives.restler_static_string(""" + "id":"""), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(""", + "checksum":"""), + primitives.restler_fuzzable_string("fuzzstring", quoted=True), + primitives.restler_static_string(""", + "body":"""), + primitives.restler_static_string(_blog_posts_post_body.reader(), quoted=True), + primitives.restler_static_string("}"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /doc, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("doc"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/doc" +) +req_collection.add_request(request) diff --git a/restler/RestlerResults/experiment19627/restler_grammar_grammar_19627.py b/restler/RestlerResults/experiment19627/restler_grammar_grammar_19627.py new file mode 100644 index 00000000..227aa9c5 --- /dev/null +++ b/restler/RestlerResults/experiment19627/restler_grammar_grammar_19627.py @@ -0,0 +1,234 @@ +""" THIS IS AN AUTOMATICALLY GENERATED FILE!""" +from __future__ import print_function +import json +from engine import primitives +from engine.core import requests +from engine.errors import ResponseParsingException +from engine import dependencies + +_blog_posts_post_body = dependencies.DynamicVariable("_blog_posts_post_body") + +_blog_posts_post_id = dependencies.DynamicVariable("_blog_posts_post_id") + +def parse_blogpostspost(data, **kwargs): + """ Automatically generated response parser """ + # Declare response variables + temp_7262 = None + temp_8173 = None + + if 'headers' in kwargs: + headers = kwargs['headers'] + + + # Parse body if needed + if data: + + try: + data = json.loads(data) + except Exception as error: + raise ResponseParsingException("Exception parsing response, data was not valid json: {}".format(error)) + pass + + # Try to extract each dynamic object + + try: + temp_7262 = str(data["body"]) + + except Exception as error: + # This is not an error, since some properties are not always returned + pass + + + try: + temp_8173 = str(data["id"]) + + except Exception as error: + # This is not an error, since some properties are not always returned + pass + + + + # If no dynamic objects were extracted, throw. + if not (temp_7262 or temp_8173): + raise ResponseParsingException("Error: all of the expected dynamic objects were not present in the response.") + + # Set dynamic variables + if temp_7262: + dependencies.set_variable("_blog_posts_post_body", temp_7262) + if temp_8173: + dependencies.set_variable("_blog_posts_post_id", temp_8173) + +req_collection = requests.RequestCollection([]) +# Endpoint: /blog/posts, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("?"), + primitives.restler_static_string("per_page="), + primitives.restler_fuzzable_group("per_page", ['2','10','50'] , default_enum="10" ,quoted=False), + primitives.restler_static_string("&"), + primitives.restler_static_string("page="), + primitives.restler_fuzzable_int("1"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("correlation_id: "), + primitives.restler_fuzzable_uuid4("566048da-ed19-4cd3-8e0a-b7e0e1ec4d72", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts, method: Post +request = requests.Request([ + primitives.restler_static_string("POST "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("correlation_id: "), + primitives.restler_fuzzable_uuid4("566048da-ed19-4cd3-8e0a-b7e0e1ec4d72", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("client_id: "), + primitives.restler_fuzzable_string("fuzzstring", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("Content-Type: "), + primitives.restler_static_string("application/json"), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("{"), + primitives.restler_static_string(""" + "id":"""), + primitives.restler_fuzzable_int("1", examples=["123"]), + primitives.restler_static_string(""", + "body":"""), + primitives.restler_fuzzable_string("fuzzstring", quoted=True, examples=["first blog"]), + primitives.restler_static_string("}"), + primitives.restler_static_string("\r\n"), + + { + + 'post_send': + { + 'parser': parse_blogpostspost, + 'dependencies': + [ + _blog_posts_post_body.writer(), + _blog_posts_post_id.writer() + ] + } + + }, + +], +requestId="/blog/posts" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Delete +request = requests.Request([ + primitives.restler_static_string("DELETE "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Put +request = requests.Request([ + primitives.restler_static_string("PUT "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Content-Type: "), + primitives.restler_static_string("application/json"), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("{"), + primitives.restler_static_string(""" + "id":"""), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(""", + "checksum":"""), + primitives.restler_fuzzable_string("fuzzstring", quoted=True), + primitives.restler_static_string(""", + "body":"""), + primitives.restler_static_string(_blog_posts_post_body.reader(), quoted=True), + primitives.restler_static_string("}"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /doc, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("doc"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/doc" +) +req_collection.add_request(request) diff --git a/restler/RestlerResults/experiment20013/restler_grammar_grammar_20013.py b/restler/RestlerResults/experiment20013/restler_grammar_grammar_20013.py new file mode 100644 index 00000000..227aa9c5 --- /dev/null +++ b/restler/RestlerResults/experiment20013/restler_grammar_grammar_20013.py @@ -0,0 +1,234 @@ +""" THIS IS AN AUTOMATICALLY GENERATED FILE!""" +from __future__ import print_function +import json +from engine import primitives +from engine.core import requests +from engine.errors import ResponseParsingException +from engine import dependencies + +_blog_posts_post_body = dependencies.DynamicVariable("_blog_posts_post_body") + +_blog_posts_post_id = dependencies.DynamicVariable("_blog_posts_post_id") + +def parse_blogpostspost(data, **kwargs): + """ Automatically generated response parser """ + # Declare response variables + temp_7262 = None + temp_8173 = None + + if 'headers' in kwargs: + headers = kwargs['headers'] + + + # Parse body if needed + if data: + + try: + data = json.loads(data) + except Exception as error: + raise ResponseParsingException("Exception parsing response, data was not valid json: {}".format(error)) + pass + + # Try to extract each dynamic object + + try: + temp_7262 = str(data["body"]) + + except Exception as error: + # This is not an error, since some properties are not always returned + pass + + + try: + temp_8173 = str(data["id"]) + + except Exception as error: + # This is not an error, since some properties are not always returned + pass + + + + # If no dynamic objects were extracted, throw. + if not (temp_7262 or temp_8173): + raise ResponseParsingException("Error: all of the expected dynamic objects were not present in the response.") + + # Set dynamic variables + if temp_7262: + dependencies.set_variable("_blog_posts_post_body", temp_7262) + if temp_8173: + dependencies.set_variable("_blog_posts_post_id", temp_8173) + +req_collection = requests.RequestCollection([]) +# Endpoint: /blog/posts, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("?"), + primitives.restler_static_string("per_page="), + primitives.restler_fuzzable_group("per_page", ['2','10','50'] , default_enum="10" ,quoted=False), + primitives.restler_static_string("&"), + primitives.restler_static_string("page="), + primitives.restler_fuzzable_int("1"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("correlation_id: "), + primitives.restler_fuzzable_uuid4("566048da-ed19-4cd3-8e0a-b7e0e1ec4d72", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts, method: Post +request = requests.Request([ + primitives.restler_static_string("POST "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("correlation_id: "), + primitives.restler_fuzzable_uuid4("566048da-ed19-4cd3-8e0a-b7e0e1ec4d72", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("client_id: "), + primitives.restler_fuzzable_string("fuzzstring", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("Content-Type: "), + primitives.restler_static_string("application/json"), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("{"), + primitives.restler_static_string(""" + "id":"""), + primitives.restler_fuzzable_int("1", examples=["123"]), + primitives.restler_static_string(""", + "body":"""), + primitives.restler_fuzzable_string("fuzzstring", quoted=True, examples=["first blog"]), + primitives.restler_static_string("}"), + primitives.restler_static_string("\r\n"), + + { + + 'post_send': + { + 'parser': parse_blogpostspost, + 'dependencies': + [ + _blog_posts_post_body.writer(), + _blog_posts_post_id.writer() + ] + } + + }, + +], +requestId="/blog/posts" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Delete +request = requests.Request([ + primitives.restler_static_string("DELETE "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Put +request = requests.Request([ + primitives.restler_static_string("PUT "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Content-Type: "), + primitives.restler_static_string("application/json"), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("{"), + primitives.restler_static_string(""" + "id":"""), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(""", + "checksum":"""), + primitives.restler_fuzzable_string("fuzzstring", quoted=True), + primitives.restler_static_string(""", + "body":"""), + primitives.restler_static_string(_blog_posts_post_body.reader(), quoted=True), + primitives.restler_static_string("}"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /doc, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("doc"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/doc" +) +req_collection.add_request(request) diff --git a/restler/RestlerResults/experiment23963/restler_grammar_grammar_23963.py b/restler/RestlerResults/experiment23963/restler_grammar_grammar_23963.py new file mode 100644 index 00000000..227aa9c5 --- /dev/null +++ b/restler/RestlerResults/experiment23963/restler_grammar_grammar_23963.py @@ -0,0 +1,234 @@ +""" THIS IS AN AUTOMATICALLY GENERATED FILE!""" +from __future__ import print_function +import json +from engine import primitives +from engine.core import requests +from engine.errors import ResponseParsingException +from engine import dependencies + +_blog_posts_post_body = dependencies.DynamicVariable("_blog_posts_post_body") + +_blog_posts_post_id = dependencies.DynamicVariable("_blog_posts_post_id") + +def parse_blogpostspost(data, **kwargs): + """ Automatically generated response parser """ + # Declare response variables + temp_7262 = None + temp_8173 = None + + if 'headers' in kwargs: + headers = kwargs['headers'] + + + # Parse body if needed + if data: + + try: + data = json.loads(data) + except Exception as error: + raise ResponseParsingException("Exception parsing response, data was not valid json: {}".format(error)) + pass + + # Try to extract each dynamic object + + try: + temp_7262 = str(data["body"]) + + except Exception as error: + # This is not an error, since some properties are not always returned + pass + + + try: + temp_8173 = str(data["id"]) + + except Exception as error: + # This is not an error, since some properties are not always returned + pass + + + + # If no dynamic objects were extracted, throw. + if not (temp_7262 or temp_8173): + raise ResponseParsingException("Error: all of the expected dynamic objects were not present in the response.") + + # Set dynamic variables + if temp_7262: + dependencies.set_variable("_blog_posts_post_body", temp_7262) + if temp_8173: + dependencies.set_variable("_blog_posts_post_id", temp_8173) + +req_collection = requests.RequestCollection([]) +# Endpoint: /blog/posts, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("?"), + primitives.restler_static_string("per_page="), + primitives.restler_fuzzable_group("per_page", ['2','10','50'] , default_enum="10" ,quoted=False), + primitives.restler_static_string("&"), + primitives.restler_static_string("page="), + primitives.restler_fuzzable_int("1"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("correlation_id: "), + primitives.restler_fuzzable_uuid4("566048da-ed19-4cd3-8e0a-b7e0e1ec4d72", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts, method: Post +request = requests.Request([ + primitives.restler_static_string("POST "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("correlation_id: "), + primitives.restler_fuzzable_uuid4("566048da-ed19-4cd3-8e0a-b7e0e1ec4d72", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("client_id: "), + primitives.restler_fuzzable_string("fuzzstring", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("Content-Type: "), + primitives.restler_static_string("application/json"), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("{"), + primitives.restler_static_string(""" + "id":"""), + primitives.restler_fuzzable_int("1", examples=["123"]), + primitives.restler_static_string(""", + "body":"""), + primitives.restler_fuzzable_string("fuzzstring", quoted=True, examples=["first blog"]), + primitives.restler_static_string("}"), + primitives.restler_static_string("\r\n"), + + { + + 'post_send': + { + 'parser': parse_blogpostspost, + 'dependencies': + [ + _blog_posts_post_body.writer(), + _blog_posts_post_id.writer() + ] + } + + }, + +], +requestId="/blog/posts" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Delete +request = requests.Request([ + primitives.restler_static_string("DELETE "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Put +request = requests.Request([ + primitives.restler_static_string("PUT "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Content-Type: "), + primitives.restler_static_string("application/json"), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("{"), + primitives.restler_static_string(""" + "id":"""), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(""", + "checksum":"""), + primitives.restler_fuzzable_string("fuzzstring", quoted=True), + primitives.restler_static_string(""", + "body":"""), + primitives.restler_static_string(_blog_posts_post_body.reader(), quoted=True), + primitives.restler_static_string("}"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /doc, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("doc"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/doc" +) +req_collection.add_request(request) diff --git a/restler/RestlerResults/experiment23998/restler_grammar_grammar_23998.py b/restler/RestlerResults/experiment23998/restler_grammar_grammar_23998.py new file mode 100644 index 00000000..227aa9c5 --- /dev/null +++ b/restler/RestlerResults/experiment23998/restler_grammar_grammar_23998.py @@ -0,0 +1,234 @@ +""" THIS IS AN AUTOMATICALLY GENERATED FILE!""" +from __future__ import print_function +import json +from engine import primitives +from engine.core import requests +from engine.errors import ResponseParsingException +from engine import dependencies + +_blog_posts_post_body = dependencies.DynamicVariable("_blog_posts_post_body") + +_blog_posts_post_id = dependencies.DynamicVariable("_blog_posts_post_id") + +def parse_blogpostspost(data, **kwargs): + """ Automatically generated response parser """ + # Declare response variables + temp_7262 = None + temp_8173 = None + + if 'headers' in kwargs: + headers = kwargs['headers'] + + + # Parse body if needed + if data: + + try: + data = json.loads(data) + except Exception as error: + raise ResponseParsingException("Exception parsing response, data was not valid json: {}".format(error)) + pass + + # Try to extract each dynamic object + + try: + temp_7262 = str(data["body"]) + + except Exception as error: + # This is not an error, since some properties are not always returned + pass + + + try: + temp_8173 = str(data["id"]) + + except Exception as error: + # This is not an error, since some properties are not always returned + pass + + + + # If no dynamic objects were extracted, throw. + if not (temp_7262 or temp_8173): + raise ResponseParsingException("Error: all of the expected dynamic objects were not present in the response.") + + # Set dynamic variables + if temp_7262: + dependencies.set_variable("_blog_posts_post_body", temp_7262) + if temp_8173: + dependencies.set_variable("_blog_posts_post_id", temp_8173) + +req_collection = requests.RequestCollection([]) +# Endpoint: /blog/posts, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("?"), + primitives.restler_static_string("per_page="), + primitives.restler_fuzzable_group("per_page", ['2','10','50'] , default_enum="10" ,quoted=False), + primitives.restler_static_string("&"), + primitives.restler_static_string("page="), + primitives.restler_fuzzable_int("1"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("correlation_id: "), + primitives.restler_fuzzable_uuid4("566048da-ed19-4cd3-8e0a-b7e0e1ec4d72", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts, method: Post +request = requests.Request([ + primitives.restler_static_string("POST "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("correlation_id: "), + primitives.restler_fuzzable_uuid4("566048da-ed19-4cd3-8e0a-b7e0e1ec4d72", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("client_id: "), + primitives.restler_fuzzable_string("fuzzstring", quoted=False), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("Content-Type: "), + primitives.restler_static_string("application/json"), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("{"), + primitives.restler_static_string(""" + "id":"""), + primitives.restler_fuzzable_int("1", examples=["123"]), + primitives.restler_static_string(""", + "body":"""), + primitives.restler_fuzzable_string("fuzzstring", quoted=True, examples=["first blog"]), + primitives.restler_static_string("}"), + primitives.restler_static_string("\r\n"), + + { + + 'post_send': + { + 'parser': parse_blogpostspost, + 'dependencies': + [ + _blog_posts_post_body.writer(), + _blog_posts_post_id.writer() + ] + } + + }, + +], +requestId="/blog/posts" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Delete +request = requests.Request([ + primitives.restler_static_string("DELETE "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Put +request = requests.Request([ + primitives.restler_static_string("PUT "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Content-Type: "), + primitives.restler_static_string("application/json"), + primitives.restler_static_string("\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + primitives.restler_static_string("{"), + primitives.restler_static_string(""" + "id":"""), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(""", + "checksum":"""), + primitives.restler_fuzzable_string("fuzzstring", quoted=True), + primitives.restler_static_string(""", + "body":"""), + primitives.restler_static_string(_blog_posts_post_body.reader(), quoted=True), + primitives.restler_static_string("}"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /blog/posts/{postId}, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("blog"), + primitives.restler_static_string("/"), + primitives.restler_static_string("posts"), + primitives.restler_static_string("/"), + primitives.restler_static_string(_blog_posts_post_id.reader(), quoted=False), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/blog/posts/{postId}" +) +req_collection.add_request(request) + +# Endpoint: /doc, method: Get +request = requests.Request([ + primitives.restler_static_string("GET "), + primitives.restler_basepath("/api"), + primitives.restler_static_string("/"), + primitives.restler_static_string("doc"), + primitives.restler_static_string(" HTTP/1.1\r\n"), + primitives.restler_static_string("Accept: application/json\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_refreshable_authentication_token("authentication_token_tag"), + primitives.restler_static_string("\r\n"), + +], +requestId="/doc" +) +req_collection.add_request(request) diff --git a/restler/restler.py b/restler/restler.py index 52cf63e8..90119c93 100644 --- a/restler/restler.py +++ b/restler/restler.py @@ -62,7 +62,7 @@ def import_grammar(path): shutil.copyfile(path, target_path) except shutil.Error: pass - + print("request collection",req_collection) return req_collection def get_checker_list(req_collection, fuzzing_requests, enable_list, disable_list, set_enable_first, custom_checkers, enable_default_checkers=True): From 828266fb426fe8c7f0ec942937ac19151e23baef Mon Sep 17 00:00:00 2001 From: Jiaxin Ge Date: Sat, 26 Feb 2022 16:28:08 -0800 Subject: [PATCH 06/16] add --- .gitignore | 3 +- demo_server/demo_server/app.py | 4 +-- demo_server/demo_server/db.sqlite | Bin 117760 -> 153600 bytes demo_server/demo_server/wrapper.py | 55 +++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 demo_server/demo_server/wrapper.py diff --git a/.gitignore b/.gitignore index c9ab9881..b18d4e30 100644 --- a/.gitignore +++ b/.gitignore @@ -364,4 +364,5 @@ restler_bin/ Compile/ Fuzz/ Test/ -demo_server/coverage_stats.txt \ No newline at end of file +demo_server/coverage_stats.txt +restler \ No newline at end of file diff --git a/demo_server/demo_server/app.py b/demo_server/demo_server/app.py index 1b5a2be4..97cdd781 100644 --- a/demo_server/demo_server/app.py +++ b/demo_server/demo_server/app.py @@ -60,5 +60,5 @@ def main(): log.info('>>>>> Starting development server at http://{}/api/ <<<<<'.format(app.config['SERVER_NAME'])) app.run(threaded=True, use_reloader=False, debug=settings.FLASK_DEBUG, host=os.getenv("FLASK_RUN_HOST", "localhost")) -if __name__ == "__main__": - main() +# if __name__ == "__main__": +# main() diff --git a/demo_server/demo_server/db.sqlite b/demo_server/demo_server/db.sqlite index 71e72be4ea720a1cb2d8a848bf36d4c5836ec224..a195a3c57124404d0a2f45593b36fc1841764759 100644 GIT binary patch delta 35651 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

$J{l{tUKYH-Qp$4lXklzK;|RIr1> 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 aJb)0B6<8v8nSn+W0C6D@7XcN#VFm!)zf(E@ diff --git a/demo_server/demo_server/wrapper.py b/demo_server/demo_server/wrapper.py new file mode 100644 index 00000000..0bed28eb --- /dev/null +++ b/demo_server/demo_server/wrapper.py @@ -0,0 +1,55 @@ +from flask import Flask, request, g +from app import app,main +import warnings + +warning_map = { + "Warning": 289, + "UserWarning": 290, + "DeprecationWarning": 291, + "SyntaxWarning": 292, + "RuntimeWarning": 293, + "FutureWarning": 294, + "PendingDeprecationWarning": 295, + "ImportWarning": 296, + "UnicodeWarning": 297, + "BytesWarning": 298, + "ResourceWarning": 299 +} + +with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + + @app.before_request + def before_req(): + print('request intercepted before processing') + print(request) + + # clear warnings before processing requests + w.clear() + + # warning injected for testing + warnings.warn("devil hides in the detail: deprecated", DeprecationWarning) + + + @app.after_request + def after_req(response): + print('response intercepted after processing') + print(response) + + # We can access captured warnings in w + print('When processing the reqeust, the following warnings were observed') + print(w) + + if len(w) > 0: + # Only return the first warning... + warning_category = w[0].category.__name__ + status_code = warning_map.get(warning_category, warning_map["Warning"]) + response.status_code = status_code + + print('response after warning check') + print(response) + # clear warnings after response + w.clear() + return response + + main() \ No newline at end of file From 70042dae7cf9a70fcaa02a47b78b6696f7c362a3 Mon Sep 17 00:00:00 2001 From: Jiaxin Ge Date: Sat, 26 Feb 2022 16:49:52 -0800 Subject: [PATCH 07/16] add valid code for testing --- demo_server/demo_server/db.sqlite | Bin 153600 -> 159744 bytes .../restler_grammar_grammar_17197.py | 234 ------------------ .../restler_grammar_grammar_17460.py | 234 ------------------ .../restler_grammar_grammar_19627.py | 234 ------------------ .../restler_grammar_grammar_20013.py | 234 ------------------ .../restler_grammar_grammar_23963.py | 234 ------------------ .../restler_grammar_grammar_23998.py | 234 ------------------ restler/engine/transport_layer/response.py | 2 +- 8 files changed, 1 insertion(+), 1405 deletions(-) delete mode 100644 restler/RestlerResults/experiment17197/restler_grammar_grammar_17197.py delete mode 100644 restler/RestlerResults/experiment17460/restler_grammar_grammar_17460.py delete mode 100644 restler/RestlerResults/experiment19627/restler_grammar_grammar_19627.py delete mode 100644 restler/RestlerResults/experiment20013/restler_grammar_grammar_20013.py delete mode 100644 restler/RestlerResults/experiment23963/restler_grammar_grammar_23963.py delete mode 100644 restler/RestlerResults/experiment23998/restler_grammar_grammar_23998.py diff --git a/demo_server/demo_server/db.sqlite b/demo_server/demo_server/db.sqlite index a195a3c57124404d0a2f45593b36fc1841764759..f9e4e1bc25d820e7c3b5166e1ce7700c3e123f58 100644 GIT binary patch delta 4908 zcmZ9PO^{th702JbZwv{Bd~g$@3Bn{XK_igvd;9A~AOTcFQ3nm-D>!!d?H)mN6e4~h z53O>qQu0t)xY2T>C1vT9w=IgYSY+YSl~!4nOECIjI?y2t6r_bs0 zKQI1n*Ngw!^~1wEj{jydnY{X=<-4lm-&_5`YW0WJ`j>lmUZ}1BPhOqx-dF!(cYU}% zQ17XC)^&B|_xqRbt8V#udKkZdmTtrMr)i4sE2G7CKAy$*%e*4nA1_w_ZA0otn(AeXF{A`uFO<{DC*CBh_;+ z?O*!Kd|0Vp+xW*r^@)1tby#q@Iyaf``CoO@e0il_+Bf~r^l#JGr@x;5c>4S_PFFV0 zyj@*W&Bn7!lcP7pC!cxt(z1Jcea$&5`)0h0(w24JH{+d@iqKo#jCW8vMBTGy{4k}? zGJ_S)P%18pK4QC`;-D07n~_m!^tlImeG_( zWw>odMX6&>!d6mhf)lYB1*P0Y2}inu#?!6tnz5x=1TPT|PAQYpg+IPg9mKs@`paA2 zBi3J_RIAv6u2L#2a|r6^DK)KhvKgPCl*NJZX1qx0FpF)EgFjAjRKmjR$0$`!$k2?B zQW^t~Sm6;$h4cZTdzexlg@wcSZ_`=MMa!Ln#~Y|%zl<=o1 z4k~Cw;!~8`wiBQaP}*@jfPRwFp*Ifeeu7fRj8yr>$`4=l+v=6-`_;zYH>(|}f+wkI z974|FFH-9J5Rp`Cln#UUNUBJw5-Ph8DD7kDad88scGk0ebDm-)L`2a!O1&7mp-EFp z+fGK?q?*#sS!7SD3fg-an>5*`n^j<>x~G1-{&zj!d%3zWOSe%=fdxd9 zZl$!BNXsUDh*GZ&(j=XtG-~C#CVh}nXi%5-=Uudm5gGA!|4N?B+P z?(RL52BbEw;}E3~r8$;2P-;9EIP$@(^w?Epj9@~@r32L1w_3ZG|5}AvDnv~X98xD0 zZC?(|z>%Wuhru&s)_J+4wv4DJpZNKNn zqsEG^Kky;H3Psn4#$d>yg|5F@ri!%=XD-^l&?e$mi?-jpXmEWCqA!;;=N)E>RA@fY zqq8-s(0tHU&_8KQ^DUIARSMe`qR;U`!MG58$^y~$Tj*IE4V?3u}FG4y>zO;d*lt{^CqqBL@mb3!gslqnty$lp}VMb^t)2i>Ca`kJ;TXK_m@ z?lXXLN@c4#u8tLS;CY49SLvy%WvT}W8J}*a#+J7#!;?gr|Qrw6{3l2os+8&O~%CtT8Jjhayjj{MAJKygX;U7;Du&V&RWnyGr3vY<)ke{ z69fci)l`TkjV6m6C`41>nn6@vq6hb#Z4sqHGkFYASYbgkZIv&4L-Q>}lW;5`?+ejn zq{*$U5KYp@9`PwO6B?OB78RNaqhL;#EzPuDzDl(iGg2X%oa+NlSBNGjLvGZ?l;F{j z5w&7UfK>H}a4{vY9%86Tu_#|@ZQiaJ6C~>f&|*voE!Q}Qr-4U5&3&kx5>Tm#kEOPd z(K7}wis@cqUcwTq)HoQHAMawi*IIbE_5`(Mor#F$MM|v<9h`W4k>0<)X1LFd`msg4 XzSc9(Q0tEtG~(H7(jx^mkW>E$oY%rm delta 122 zcmV-=0EPd6;0b`R36L5FBCP-b0G5#;J^> Date: Wed, 2 Mar 2022 15:38:06 -0800 Subject: [PATCH 08/16] add containsWarning in the report --- commands.txt | 10 ++++++++- .../demo_server/api/blog/endpoints/posts.py | 3 ++- demo_server/demo_server/db.sqlite | Bin 159744 -> 327680 bytes demo_server/demo_server/wrapper.py | 5 +---- restler/engine/transport_layer/response.py | 3 ++- src/ResultsAnalyzer/Analyze/Types.fs | 21 +++++++++++++++++- 6 files changed, 34 insertions(+), 8 deletions(-) diff --git a/commands.txt b/commands.txt index 099d379b..b283f2ca 100644 --- a/commands.txt +++ b/commands.txt @@ -1,5 +1,13 @@ # comments for macos -# compile +# compile restler +python3 ./build-restler.py --dest_dir restler_bin/ +# compile the engine seperately due to a bug +python3 ./build-restler.py --dest_dir restler_bin/ --compile_type engine --python_path /usr/local/bin/python3.8 + +# use the engine only +python3 restler.py --restler_grammar /Users/anne/Desktop/restler_project/restler-fuzzer/Compile/grammar.py --no_ssl + +# compile grammar dotnet ./restler_bin/restler/Restler.dll compile --api_spec ./demo_server/swagger.json # test dotnet ./restler_bin/restler/Restler.dll test --grammar_file ./Compile/grammar.py --dictionary_file ./Compile/dict.json --settings ./Compile/engine_settings.json --no_ssl diff --git a/demo_server/demo_server/api/blog/endpoints/posts.py b/demo_server/demo_server/api/blog/endpoints/posts.py index e8cabfce..ccf59fa8 100644 --- a/demo_server/demo_server/api/blog/endpoints/posts.py +++ b/demo_server/demo_server/api/blog/endpoints/posts.py @@ -11,6 +11,7 @@ from demo_server.api.blog.parsers import pagination_arguments from demo_server.api.restplus import api from demo_server.database.models import Post +import warnings log = logging.getLogger(__name__) @@ -31,7 +32,7 @@ def get(self): per_page = args.get('per_page', 1) posts_query = Post.query posts_page = posts_query.paginate(page, per_page) - + warnings.warn("test warning",DeprecationWarning) return posts_page @api.expect(blog_post_public) diff --git a/demo_server/demo_server/db.sqlite b/demo_server/demo_server/db.sqlite index f9e4e1bc25d820e7c3b5166e1ce7700c3e123f58..55efd0fa7af0623b42a4d54dfe93351117ea977d 100644 GIT binary patch literal 327680 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.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

4+C%Ep(*~ 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 delta 196 zcmZo@5NUY8IYEj|c`XA2!<>lHyS9liv4l)#Im4JZT|1ZQ_;#I4rW;HwY7BcA qrpx?c)S0euf{|mo%>_p3$wC}K)9?Oe5!vop#AL#_{bMc@KNA26T{gi0 diff --git a/demo_server/demo_server/wrapper.py b/demo_server/demo_server/wrapper.py index 0bed28eb..f010cb48 100644 --- a/demo_server/demo_server/wrapper.py +++ b/demo_server/demo_server/wrapper.py @@ -1,3 +1,4 @@ +from logging import warning from flask import Flask, request, g from app import app,main import warnings @@ -27,10 +28,6 @@ def before_req(): # clear warnings before processing requests w.clear() - # warning injected for testing - warnings.warn("devil hides in the detail: deprecated", DeprecationWarning) - - @app.after_request def after_req(response): print('response intercepted after processing') diff --git a/restler/engine/transport_layer/response.py b/restler/engine/transport_layer/response.py index a86b140f..5d723aa6 100644 --- a/restler/engine/transport_layer/response.py +++ b/restler/engine/transport_layer/response.py @@ -5,7 +5,8 @@ from restler_settings import Settings DELIM = "\r\n\r\n" -VALID_CODES = {'200', '201', '202', '204', '304', '291'} +VALID_CODES = {'200', '201', '202', '204', '304', '290', '291', '292', '293', '294', '295', '296', '297', '298', '299' } +# VALID_CODES = {'200', '201', '202', '204', '304'} TIMEOUT_CODE = '599' CONNECTION_CLOSED_CODE = '598' RESTLER_BUG_CODES = [TIMEOUT_CODE, CONNECTION_CLOSED_CODE] diff --git a/src/ResultsAnalyzer/Analyze/Types.fs b/src/ResultsAnalyzer/Analyze/Types.fs index 36d73af9..15b2aa4d 100644 --- a/src/ResultsAnalyzer/Analyze/Types.fs +++ b/src/ResultsAnalyzer/Analyze/Types.fs @@ -8,17 +8,33 @@ open System.Text.RegularExpressions [] let UnknownResponseCode = 0 +let WarningResponseCode = [ 289 .. 299 ] [] let BugResponseCode = 500 let isFailure x = x >= 400 || // Consider these a failure as well, so they are analyzed. - x = UnknownResponseCode + x = UnknownResponseCode || + List.contains x WarningResponseCode let isBug x = x = BugResponseCode +let containsWarning x = + match x with + | 289 -> "Warning" + | 290 -> "UserWarning" + | 291 -> "DeprecationWarning" + | 292 -> "SyntaxWarning" + | 293 -> "RuntimeWarning" + | 294 -> "FutureWarning" + | 295 -> "PendingDeprecationWarning" + | 296 -> "ImportWarning" + | 297 -> "UnicodeWarning" + | 298 -> "BytesWarning" + | 299 -> "ResourceWarning" + // TODO replace the Http types here with the ones in Common.Http and Common.Log type HttpRequestData = @@ -41,6 +57,9 @@ type HttpResponseData = member x.isBug = isBug x.code + member x.containsWarning = + containsWarning x.code + type RequestTrace = | RequestData of HttpRequestData /// In some cases, the request RESTler sends is not well-formed From 533ac278ff693cea5c6b0cb2896dfe22063e6122 Mon Sep 17 00:00:00 2001 From: Jiaxin Ge Date: Wed, 2 Mar 2022 15:41:54 -0800 Subject: [PATCH 09/16] clean wrapper --- demo_server/demo_server/wrapper.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/demo_server/demo_server/wrapper.py b/demo_server/demo_server/wrapper.py index f010cb48..dad5d95a 100644 --- a/demo_server/demo_server/wrapper.py +++ b/demo_server/demo_server/wrapper.py @@ -1,6 +1,6 @@ from logging import warning from flask import Flask, request, g -from app import app,main +from app import app, main import warnings warning_map = { @@ -22,20 +22,20 @@ @app.before_request def before_req(): - print('request intercepted before processing') - print(request) + # print('request intercepted before processing') + # print(request) # clear warnings before processing requests w.clear() @app.after_request def after_req(response): - print('response intercepted after processing') - print(response) + # print('response intercepted after processing') + # print(response) # We can access captured warnings in w - print('When processing the reqeust, the following warnings were observed') - print(w) + # print('When processing the reqeust, the following warnings were observed') + # print(w) if len(w) > 0: # Only return the first warning... @@ -43,8 +43,8 @@ def after_req(response): status_code = warning_map.get(warning_category, warning_map["Warning"]) response.status_code = status_code - print('response after warning check') - print(response) + # print('response after warning check') + # print(response) # clear warnings after response w.clear() return response From 99e0c220a7452a62031c266886b000340b9ef648 Mon Sep 17 00:00:00 2001 From: Jiaxin Ge Date: Wed, 2 Mar 2022 15:42:51 -0800 Subject: [PATCH 10/16] clean code --- restler/engine/transport_layer/response.py | 1 - 1 file changed, 1 deletion(-) diff --git a/restler/engine/transport_layer/response.py b/restler/engine/transport_layer/response.py index 5d723aa6..542fdeb5 100644 --- a/restler/engine/transport_layer/response.py +++ b/restler/engine/transport_layer/response.py @@ -6,7 +6,6 @@ DELIM = "\r\n\r\n" VALID_CODES = {'200', '201', '202', '204', '304', '290', '291', '292', '293', '294', '295', '296', '297', '298', '299' } -# VALID_CODES = {'200', '201', '202', '204', '304'} TIMEOUT_CODE = '599' CONNECTION_CLOSED_CODE = '598' RESTLER_BUG_CODES = [TIMEOUT_CODE, CONNECTION_CLOSED_CODE] From ef8f65cbba41a1c4befc92addbcc2aa9a88a2ea3 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 4 Mar 2022 00:25:42 -0800 Subject: [PATCH 11/16] motivating samples --- .../CoursesStudentNamesID/app.py | 29 ++++++++++++ motivating_server/LRUCache.py | 46 +++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 motivating_server/CoursesStudentNamesID/app.py create mode 100644 motivating_server/LRUCache.py diff --git a/motivating_server/CoursesStudentNamesID/app.py b/motivating_server/CoursesStudentNamesID/app.py new file mode 100644 index 00000000..c258c9ab --- /dev/null +++ b/motivating_server/CoursesStudentNamesID/app.py @@ -0,0 +1,29 @@ +from flask import Flask, jsonify, request, abort + +app = Flask(__name__) + +@app.route("/get_class_names") +def get_class_names(): + classes = ['compiler', 'physics', 'automated_testing'] + return jsonify(classes) + +# /get_students_and_ids?class_name=compiler +@app.route("/get_students_and_ids") +def get_students_and_ids(): + class_name = request.args.get('class_name', '') + if class_name == 'compiler': + students_and_ids = [('Aatrox', '1111111111'), ('Ahri', '22222222'), ('Akali', '333333333')] + return jsonify(students_and_ids) + elif class_name == 'physics': + students_and_ids = [('Elise', '24253245'), ('Ekko', '23645126'), ('Jax', '7643325345')] + return jsonify(students_and_ids) + elif class_name == 'automated_testing': + # Notice there's a missing comma in the list below + students_and_ids = [('Sett', '425145'), ('Urgot', '52342543')('Ziggs', '5722145')] + return jsonify(students_and_ids) + else: + # Not found + abort(404) + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=11111) \ No newline at end of file diff --git a/motivating_server/LRUCache.py b/motivating_server/LRUCache.py new file mode 100644 index 00000000..2eda6258 --- /dev/null +++ b/motivating_server/LRUCache.py @@ -0,0 +1,46 @@ +""" +Modified from + https://www.geeksforgeeks.org/lru-cache-in-python-using-ordereddict/ +""" + +from collections import OrderedDict +from random import randrange + + +class LRUCache: + def __init__(self): + self.cache = OrderedDict() + + def get(self, key): + if key not in self.cache: + return -1 + else: + self.cache.move_to_end(key) + return self.cache[key] + + def put(self, key, value): + self.cache[key] = value + self.cache.move_to_end(key) + + # 1000 is the hard-coded LRU cache capacity + # The line below will raise a 'warning' + if 1000 is (len(self.cache) - 1): + self.cache.popitem(last=False) + + +if __name__ == '__main__': + # RUNNER + # initializing our cache with the capacity of 1000 + cache = LRUCache() + + num_test_records = 10000 + + for idx in range(num_test_records): + key, value = idx, randrange(10000) + cache.put(key, value) + cache_len = len(cache.cache) + + print(f'Number of entries in LRU cache is {cache_len}') + + + From 2a5c025c43f6a6ac4d36a4b27ca5c8032e2b3109 Mon Sep 17 00:00:00 2001 From: Jiaxin Ge Date: Sun, 6 Mar 2022 18:36:34 -0800 Subject: [PATCH 12/16] bug injected --- demo_server/db.sqlite | 0 demo_server/demo_server/api/blog/business.py | 18 +++++++++++- .../demo_server/api/blog/endpoints/posts.py | 4 --- demo_server/demo_server/app.py | 4 +-- demo_server/demo_server/database/models.py | 6 ++-- demo_server/demo_server/db.sqlite | Bin 327680 -> 329728 bytes demo_server/demo_server/wrapper.py | 26 ++++++++++++------ demo_server/requirements.txt | 3 +- 8 files changed, 42 insertions(+), 19 deletions(-) create mode 100644 demo_server/db.sqlite diff --git a/demo_server/db.sqlite b/demo_server/db.sqlite new file mode 100644 index 00000000..e69de29b diff --git a/demo_server/demo_server/api/blog/business.py b/demo_server/demo_server/api/blog/business.py index 2db73283..10f6a8d7 100644 --- a/demo_server/demo_server/api/blog/business.py +++ b/demo_server/demo_server/api/blog/business.py @@ -1,10 +1,13 @@ # Copyright (c) Microsoft Corporation. # Licensed under the MIT License. +from logging import warning from demo_server.database.models import Post, Category, db from flask import abort from flask import request +import pandas as pd import json +import warnings def get_query(): # Gets the query string from the request @@ -34,13 +37,26 @@ def get_post(postId): # PLANTED_BUG - # Intentionally ignore unexpected query, so the invalid dynamic # object checker throws a bug due to '200' response. - + # PLANTED_BUG for demo purpose + check_use_exist_posts() post = Post.query.filter(Post.id == postId).one_or_none() return post or abort(404) +def check_use_exist_posts(): + exist_posts = Post.query.limit(5).all() + df = pd.DataFrame() + rows = [] + for post in exist_posts: + rows.append([post.id,post.body]) + rows.append(['7',"hello"]) + df = pd.DataFrame(rows,columns=['id','body']) + df[df['body'] == 'la']['id'] = 10 + return + def create_blog_post(): body = request.json.get('body') post = Post(body) + db.session.add(post) db.session.commit() return post diff --git a/demo_server/demo_server/api/blog/endpoints/posts.py b/demo_server/demo_server/api/blog/endpoints/posts.py index ccf59fa8..73d6e922 100644 --- a/demo_server/demo_server/api/blog/endpoints/posts.py +++ b/demo_server/demo_server/api/blog/endpoints/posts.py @@ -11,8 +11,6 @@ from demo_server.api.blog.parsers import pagination_arguments from demo_server.api.restplus import api from demo_server.database.models import Post -import warnings - log = logging.getLogger(__name__) ns = api.namespace('blog/posts', description='Operations related to blog posts') @@ -32,7 +30,6 @@ def get(self): per_page = args.get('per_page', 1) posts_query = Post.query posts_page = posts_query.paginate(page, per_page) - warnings.warn("test warning",DeprecationWarning) return posts_page @api.expect(blog_post_public) @@ -70,7 +67,6 @@ def delete(self, postId): """ Deletes a blog post with matching \"postId\". """ - delete_post(postId) diff --git a/demo_server/demo_server/app.py b/demo_server/demo_server/app.py index 97cdd781..57de9a7d 100644 --- a/demo_server/demo_server/app.py +++ b/demo_server/demo_server/app.py @@ -15,6 +15,7 @@ import json from flask import Flask, Blueprint from demo_server import settings +from settings import SQLALCHEMY_DATABASE_URI from demo_server.database.models import db from demo_server.api.blog.endpoints.posts import ns as blog_posts_namespace # from demo_server.api.blog.endpoints.categories import ns\ @@ -40,7 +41,6 @@ def configure_app(flask_app): flask_app.config['RESTPLUS_MASK_SWAGGER'] = settings.RESTPLUS_MASK_SWAGGER flask_app.config['ERROR_404_HELP'] = settings.RESTPLUS_ERROR_404_HELP - def initialize_app(flask_app): configure_app(flask_app) @@ -49,10 +49,8 @@ def initialize_app(flask_app): api.add_namespace(blog_posts_namespace) # api.add_namespace(blog_categories_namespace) flask_app.register_blueprint(blueprint) - db.init_app(flask_app) - def main(): initialize_app(app) # with app.app_context(): diff --git a/demo_server/demo_server/database/models.py b/demo_server/demo_server/database/models.py index e0159dc9..74a8fe36 100644 --- a/demo_server/demo_server/database/models.py +++ b/demo_server/demo_server/database/models.py @@ -8,7 +8,9 @@ from datetime import datetime from flask_sqlalchemy import SQLAlchemy - +import pandas as pd +from demo_server import settings +from settings import SQLALCHEMY_DATABASE_URI db = SQLAlchemy() @@ -16,7 +18,7 @@ class Post(db.Model): id = db.Column(db.Integer, primary_key=True) body = db.Column(db.Text) checksum = db.Column(db.Text) - + def __init__(self, body): self.body = body self.checksum = binascii.b2a_hex(os.urandom(100))[:5] diff --git a/demo_server/demo_server/db.sqlite b/demo_server/demo_server/db.sqlite index 55efd0fa7af0623b42a4d54dfe93351117ea977d..5b37b113ae38d4a4706be87e0d0a108719b97bf4 100644 GIT binary patch delta 2301 zcmcJRzi%8x6vtSb0Ah;p`)43O2qe2ZGsX}cupI&> zu$Cw&XcC0je}NK-!Ub03KOhwiy$eJ!D_MxbL?X$%i|yRINJvQGq&=O!`t0}3n|bfe zt*#ziy?pTU!=0mwkYM)8^iv1m*ArrTKOrQHdL;Tb>is-5{$u!cFZ!kz1@MIML~Fe$ z_7mfmf*yduY%?(#|J7_vhVhjn-O1pHzX<9x{y2O;?d96xsra|wJ3!8m^=524e)d4P zNp6ro$ggBQdOUhC+zvOJ(;LCrX7fgTYOVWsd@blw&tr0^>*g1imZ!^e=jSxbQn|K$ zJ>D0L!TX2EI%y_fgq)POZ(Ue+yfrg_D;0W0=hyXN>wcFY(g|L$%3U3Xhq z3GSycTWG;SeFv*d3j@hKj~$qj$|Tf3hhdw#3Knq`t4?y6Hs9Th7k>CYoUezAMklP2 zwB3haP{uh++i|RNW{QNiV*_=slr(2~N!t!)UE#`$`7cgs-U{KG?SWR`wpjwvtYJF#97-=Q6&mxAU)EXM)lYzQ-&X$QB)Q>T1mCj-4 zoX2We8VOaufE{$E3`DCx!f?h+f5qo83h*u?^?TmxHQWz_UT+D`PA1Aiuh)1-GnXo;jIXe&l}kYV5<76^45*hdo2W{G?-x64 zy>rGpK>jN7OQB(5Rp7SnN2ILdfi{qf5BVVQx-fHqABEVf#Q#rqExB Hg6aGg3{lLF delta 217 zcmZpeAkxqvGC_*Xbshr)qr*f6J0T!T&-w!|0|NsSvjhWkH?zcML5>wn%@WM*63mQ1 z%ml>D+a;J;-tcf#F{%I+GCEA>5n%Z;S&&1Gh0*?v;dU)Smg~>hm>w}GGKx%R|H0xc z#E`;V!<@z(z-+~=!pz6?gXz)qm;;PEw~PK{Im3e>#L`fL2Fer+pWfm2eC?w_Nr&}7D8k+$f O;skVp-SkQSS@HnEO+BIj diff --git a/demo_server/demo_server/wrapper.py b/demo_server/demo_server/wrapper.py index dad5d95a..426557b0 100644 --- a/demo_server/demo_server/wrapper.py +++ b/demo_server/demo_server/wrapper.py @@ -1,7 +1,10 @@ +from distutils.log import warn from logging import warning +from pydoc import resolve from flask import Flask, request, g from app import app, main import warnings +from pandas.core.common import SettingWithCopyWarning warning_map = { "Warning": 289, @@ -30,21 +33,28 @@ def before_req(): @app.after_request def after_req(response): - # print('response intercepted after processing') - # print(response) + print('response intercepted after processing') + print(response) # We can access captured warnings in w - # print('When processing the reqeust, the following warnings were observed') - # print(w) + print('When processing the reqeust, the following warnings were observed') + print(w) if len(w) > 0: - # Only return the first warning... + # Only return the first warning code... warning_category = w[0].category.__name__ status_code = warning_map.get(warning_category, warning_map["Warning"]) response.status_code = status_code - - # print('response after warning check') - # print(response) + + # Concat message + warning_msg = '' + for warning in w: + warning_msg += str(warning.message) + '\n' + response.warningMessage = warning_msg + print(warning_msg) + + print('response after warning check') + print(response) # clear warnings after response w.clear() return response diff --git a/demo_server/requirements.txt b/demo_server/requirements.txt index 0e1bd749..1abd89d8 100644 --- a/demo_server/requirements.txt +++ b/demo_server/requirements.txt @@ -1,4 +1,5 @@ -flask==1.1.2 +flask==1.1.02 flask-restplus==0.13.0 Flask-SQLAlchemy==2.5.1 Werkzeug==0.16.0 +itsdangerous==2.0.1 \ No newline at end of file From c6ff448f410dd0f28d8c8a7193dc8569125e536b Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 6 Mar 2022 20:01:20 -0800 Subject: [PATCH 13/16] readme about warnings --- README.md | 3 +++ demo_server/README.md | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index 72e91cff..58891274 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,9 @@ See [Testing](./docs/user-guide/Testing.md). To use custom test engine settings, **Warning:** This type of fuzzing is more aggressive and may create outages in the service under test if the service is poorly implemented (e.g., fuzzing might create resource leaks, perf degradation, backend corruptions, etc.). See [Fuzzing](./docs/user-guide/Fuzzing.md). +### With warning messages +If you are fuzzing a Flask server and want to have warnings included, use `demo_server/demo_server/wrapper.py` to start the demo server instead of just using `demo_server/demo_server/app.py`. + ## Quick Start For a quick intro with simple examples, see this [Tutorial](./docs/user-guide/TutorialDemoServer.md). diff --git a/demo_server/README.md b/demo_server/README.md index a1a0531c..fe960e25 100644 --- a/demo_server/README.md +++ b/demo_server/README.md @@ -29,6 +29,10 @@ Start demo server at one teminal -------------------------------- `python demo_server/app.py` +Start demo server which captures warnings at one teminal +-------------------------------- +`python demo_server/wrapper.py` + - Make sure you execute all the above from the base directory of demo_server (the same directory where this README lives in.) From df867849ba2962d13393f6b3a66fb9cbcd072a11 Mon Sep 17 00:00:00 2001 From: Jiaxin Ge Date: Sun, 6 Mar 2022 20:02:03 -0800 Subject: [PATCH 14/16] remove lines --- demo_server/demo_server/db.sqlite | Bin 329728 -> 329728 bytes demo_server/demo_server/wrapper.py | 4 +--- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/demo_server/demo_server/db.sqlite b/demo_server/demo_server/db.sqlite index 5b37b113ae38d4a4706be87e0d0a108719b97bf4..85281421518c1f4eef8a4a30cb6fd2209ffa17da 100644 GIT binary patch delta 361 zcmZpeAkr{FWP&uK*F+g-Mz6+%)&$1Z1g6#m=GFw3tqH6Pnb{c_7~~nl7^W+HU{srK zaDa)0iFx02g(WPKlZ7}=)r&DGilt>16_+R^<>aSZrdU{50yUtDCRrGpn_`GsrW&W1 z3cnR&0hv%*RaIP4l$n=qY+#U@Ec{j!EDAT*AkosyK=`c)s@kN)g4K4i6Q`RPW+mgd`~ a*;p4diV45vMV180C7YNgPrt&>ssjKK2x@}> delta 130 zcmZpeAkr{FWP&uK#Y7orMvKOT)&$1Z1g6#m=GFw3tqH6Pnc125F^DqBFicnYz^FFe z-~bZ~8}mLUHpUN|1vz#zP8Vlo<&!c^HA^vJU| Date: Sun, 6 Mar 2022 20:04:12 -0800 Subject: [PATCH 15/16] change to 8888 --- demo_server/Dockerfile | 2 +- demo_server/README.md | 2 +- demo_server/demo_server/settings.py | 2 +- demo_server/swagger.json | 2 +- docs/user-guide/Replay.md | 4 ++-- docs/user-guide/Testing.md | 2 +- docs/user-guide/TutorialDemoServer.md | 2 +- .../baselines/dependencyTests/header_deps_grammar.py | 8 ++++---- .../header_response_writer_annotation_grammar.py | 8 ++++---- .../dependencyTests/header_response_writer_grammar.py | 8 ++++---- .../baselines/dependencyTests/ordering_test_grammar.py | 6 +++--- .../baselines/dependencyTests/path_annotation_grammar.py | 4 ++-- .../dependencyTests/path_in_dictionary_payload_grammar.py | 4 ++-- .../dictionaryTests/quoted_primitives_grammar.py | 6 +++--- .../baselines/exampleTests/array_example_grammar.py | 6 +++--- .../baselines/grammarTests/required_params_grammar.json | 4 ++-- .../baselines/grammarTests/required_params_grammar.py | 4 ++-- .../grammarTests/required_params_grammar_requiredonly.py | 4 ++-- .../swagger/annotationTests/pathAnnotation.json | 2 +- .../annotationTests/pathAnnotationInSeparateFile.json | 2 +- .../Restler.Compiler.Test/swagger/array_example.json | 2 +- .../swagger/array_example_external.json | 2 +- .../swagger/configTests/swagger1.json | 2 +- .../swagger/configTests/swagger2.json | 2 +- .../swagger/configTests/swagger3.json | 2 +- .../Restler.Compiler.Test/swagger/demo_server.json | 2 +- .../swagger/dependencyTests/array_dep_multiple_items.json | 2 +- .../swagger/dependencyTests/body_dependency_cycles.json | 2 +- .../swagger/dependencyTests/frontend_port_id.json | 2 +- .../swagger/dependencyTests/header_deps.json | 2 +- .../dependencyTests/inconsistent_casing_paths.json | 2 +- .../swagger/dependencyTests/input_producer_spec.json | 2 +- .../swagger/dependencyTests/ip_configurations_get.json | 2 +- .../swagger/dependencyTests/lowercase_paths.json | 2 +- .../swagger/dependencyTests/nested_objects_naming.json | 2 +- .../swagger/dependencyTests/ordering_test.json | 2 +- .../swagger/dependencyTests/post_patch_dependency.json | 2 +- .../swagger/dependencyTests/response_headers.json | 2 +- .../swagger/dependencyTests/subnet_id.json | 2 +- .../swagger/dictionaryTests/customPayloadSwagger.json | 2 +- .../dictionaryTests/multipleIdenticalUuidSuffix.json | 2 +- .../swagger/dictionaryTests/no_params.json | 2 +- .../swagger/dictionaryTests/pathDictionaryPayload.json | 2 +- .../swagger/empty_array_example.json | 2 +- .../swagger/exactCopy/array_example.json | 2 +- .../Restler.Compiler.Test/swagger/example_demo.json | 2 +- .../Restler.Compiler.Test/swagger/example_demo1.json | 2 +- .../Restler.Compiler.Test/swagger/example_demo1.yaml | 2 +- .../swagger/get_path_dependencies.json | 2 +- .../swagger/grammarTests/required_params.json | 2 +- src/compiler/Restler.Compiler.Test/swagger/headers.json | 2 +- .../Restler.Compiler.Test/swagger/inline_examples.json | 2 +- .../Restler.Compiler.Test/swagger/object_example.json | 2 +- .../Restler.Compiler.Test/swagger/put_createorupdate.json | 2 +- .../swagger/schemaTests/global_path_parameters.json | 2 +- .../swagger/schemaTests/large_json_body.json | 2 +- 56 files changed, 77 insertions(+), 77 deletions(-) diff --git a/demo_server/Dockerfile b/demo_server/Dockerfile index e5f9ffed..5510131e 100644 --- a/demo_server/Dockerfile +++ b/demo_server/Dockerfile @@ -9,7 +9,7 @@ WORKDIR /app RUN pip install -r requirements.txt -EXPOSE 8878 +EXPOSE 8888 ENV FLASK_RUN_HOST=0.0.0.0 diff --git a/demo_server/README.md b/demo_server/README.md index c5de4fc4..a1a0531c 100644 --- a/demo_server/README.md +++ b/demo_server/README.md @@ -35,7 +35,7 @@ Start demo server at one teminal Swagger ================== - The interactive swagger specification interface will be available at - http://localhost:8878/api/ using your browser. + http://localhost:8888/api/ using your browser. - The swagger can also be found in the demo_server directory as swagger.json - The swagger was automatically generated by flask-restplus - This swagger can be compiled and tested using RESTler. diff --git a/demo_server/demo_server/settings.py b/demo_server/demo_server/settings.py index 177a6e9a..e1fc085e 100644 --- a/demo_server/demo_server/settings.py +++ b/demo_server/demo_server/settings.py @@ -2,7 +2,7 @@ # Licensed under the MIT License. # Flask settings -FLASK_SERVER_NAME = 'localhost:8878' +FLASK_SERVER_NAME = 'localhost:8888' FLASK_DEBUG = True # Do not use debug mode in production # Flask-Restplus settings diff --git a/demo_server/swagger.json b/demo_server/swagger.json index 5c4278b9..861ac06f 100644 --- a/demo_server/swagger.json +++ b/demo_server/swagger.json @@ -285,5 +285,5 @@ }, "NoResultFound": {} }, - "host": "localhost:8878" + "host": "localhost:8888" } \ No newline at end of file diff --git a/docs/user-guide/Replay.md b/docs/user-guide/Replay.md index a180f0b4..2d6bd326 100644 --- a/docs/user-guide/Replay.md +++ b/docs/user-guide/Replay.md @@ -39,12 +39,12 @@ so that the sequence can be replayed exactly as it was executed before. Below is an example of the requests and responses from a replay log sequence. ``` --> POST /api/blog/posts HTTP/1.1\r\nAccept: application/json\r\nHost: localhost:8878\r\nContent-Type: application/json\r\n\r\n{\n "id":0,\n "body":"fuzzstring"}\r\n +-> POST /api/blog/posts HTTP/1.1\r\nAccept: application/json\r\nHost: localhost:8888\r\nContent-Type: application/json\r\n\r\n{\n "id":0,\n "body":"fuzzstring"}\r\n ! producer_timing_delay 0 ! max_async_wait_time 0 PREVIOUS RESPONSE: 'HTTP/1.1 201 CREATED\r\nContent-Type: application/json\r\nContent-Length: 45\r\nServer: Werkzeug/0.16.0 Python/3.8.2\r\nDate: Thu, 01 Oct 2020 22:00:27 GMT\r\n\r\n{\n "id": 5875,\n "body": "fuzzstring"\n}\n' --> PUT /api/blog/posts/5875 HTTP/1.1\r\nAccept: application/json\r\nHost: localhost:8878\r\nContent-Type: application/json\r\n\r\n{"body":"fuzzstring"} +-> PUT /api/blog/posts/5875 HTTP/1.1\r\nAccept: application/json\r\nHost: localhost:8888\r\nContent-Type: application/json\r\n\r\n{"body":"fuzzstring"} ! producer_timing_delay 0 ! max_async_wait_time 0 PREVIOUS RESPONSE: 'HTTP/1.1 500 INTERNAL SERVER ERROR\r\nContent-Type: application/json\r\nContent-Length: 176\r\nServer: Werkzeug/0.16.0 Python/3.8.2\r\nDate: Thu, 01 Oct 2020 22:00:28 GMT\r\n\r\n{\n "message": "The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application."\n}\n' diff --git a/docs/user-guide/Testing.md b/docs/user-guide/Testing.md index 62c662f9..13769afc 100644 --- a/docs/user-guide/Testing.md +++ b/docs/user-guide/Testing.md @@ -94,7 +94,7 @@ During each Test run a `speccov.json` file will be created in the logs directory "request_uri": "/api/blog/posts/5872", "request_headers": [ "Accept: application/json", - "Host: localhost:8878", + "Host: localhost:8888", "Content-Type: application/json" ], "request_body": "{\n \"id\":\"5872\",\n \"checksum\":\"fuzzstring\",\n \"body\":\"first blog\"}\r\n", diff --git a/docs/user-guide/TutorialDemoServer.md b/docs/user-guide/TutorialDemoServer.md index d0a64c3a..3f599e53 100644 --- a/docs/user-guide/TutorialDemoServer.md +++ b/docs/user-guide/TutorialDemoServer.md @@ -58,7 +58,7 @@ In this example, coverage is 5 / 6 and the only INVALID request is + restler_fuzzable_int: ['0', '1'] - restler_static_string: ' HTTP/1.1\r\n' - restler_static_string: 'Accept: application/json\r\n' - - restler_static_string: 'Host: localhost:8878\r\n' + - restler_static_string: 'Host: localhost:8888\r\n' - restler_static_string: '\r\n' By looking at `network.testing.<...>.txt`, we can see that RESTler attempts to execute this request 4 times, each time with a value either 0 or 1 for the `per_page=` and `page=`. It turns out none of these 4 combinations are valid: the `per_page=` must be 2 minimally, but RESTler was not able to infer this automatically. (One way to fix this is to edit `dict.json` and add the value `2` in the list for `restler_fuzzable_int`.) diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_deps_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_deps_grammar.py index 952fb62e..854bc306 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_deps_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_deps_grammar.py @@ -57,7 +57,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -87,7 +87,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_static_string("user-id: "), primitives.restler_static_string(_service_user_post_user_id_header.reader(), quoted=False), primitives.restler_static_string("\r\n"), @@ -109,7 +109,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_static_string("user-id: "), primitives.restler_static_string(_service_user_post_user_id_header.reader(), quoted=False), primitives.restler_static_string("\r\n"), @@ -131,7 +131,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_static_string("user-id: "), primitives.restler_static_string(_service_user_post_user_id_header.reader(), quoted=False), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_annotation_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_annotation_grammar.py index 97127d70..605ae357 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_annotation_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_annotation_grammar.py @@ -57,7 +57,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -89,7 +89,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_Location_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -110,7 +110,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_Location_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -131,7 +131,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_Location_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_grammar.py index 021d683e..73e29e71 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_grammar.py @@ -57,7 +57,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -89,7 +89,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_userId_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -110,7 +110,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_userId_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -131,7 +131,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_userId_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/ordering_test_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/ordering_test_grammar.py index a0dafdb6..ecf4e248 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/ordering_test_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/ordering_test_grammar.py @@ -18,7 +18,7 @@ primitives.restler_static_string("products"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -47,7 +47,7 @@ primitives.restler_static_string("services"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -77,7 +77,7 @@ primitives.restler_static_string("managementTools"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_annotation_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_annotation_grammar.py index 59de9949..fa87e5fb 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_annotation_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_annotation_grammar.py @@ -80,7 +80,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("stores"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -114,7 +114,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("order"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_in_dictionary_payload_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_in_dictionary_payload_grammar.py index 40e54141..bdf481fc 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_in_dictionary_payload_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_in_dictionary_payload_grammar.py @@ -54,7 +54,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("stores"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -86,7 +86,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("order"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dictionaryTests/quoted_primitives_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dictionaryTests/quoted_primitives_grammar.py index 23a4a84e..7ce6bec9 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dictionaryTests/quoted_primitives_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dictionaryTests/quoted_primitives_grammar.py @@ -54,7 +54,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("stores"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -86,7 +86,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string(_stores_post_id.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), @@ -135,7 +135,7 @@ def parse_storespost(data, **kwargs): primitives.restler_custom_payload("message", quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/exampleTests/array_example_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/exampleTests/array_example_grammar.py index b749e254..113bdc84 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/exampleTests/array_example_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/exampleTests/array_example_grammar.py @@ -54,7 +54,7 @@ def parse_storesstoreIdorderpost(data, **kwargs): primitives.restler_static_string("stores"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -99,7 +99,7 @@ def parse_storesstoreIdorderpost(data, **kwargs): primitives.restler_static_string("fff"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), @@ -158,7 +158,7 @@ def parse_storesstoreIdorderpost(data, **kwargs): primitives.restler_fuzzable_string("fuzzstring", quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.json b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.json index 9da62551..170212dc 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.json +++ b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.json @@ -112,7 +112,7 @@ ], [ "Host", - "localhost:8878" + "localhost:8888" ] ], "httpVersion": "1.1", @@ -340,7 +340,7 @@ ], [ "Host", - "localhost:8878" + "localhost:8888" ] ], "httpVersion": "1.1", diff --git a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.py index a08c6ef6..fd836fe8 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.py @@ -14,7 +14,7 @@ primitives.restler_static_string("customers"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), @@ -46,7 +46,7 @@ primitives.restler_fuzzable_string("fuzzstring", quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_static_string("array_header_param: "), primitives.restler_fuzzable_string("fuzzstring", quoted=False), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar_requiredonly.py b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar_requiredonly.py index 98b849d8..b62c12d5 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar_requiredonly.py +++ b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar_requiredonly.py @@ -14,7 +14,7 @@ primitives.restler_static_string("customers"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), @@ -37,7 +37,7 @@ primitives.restler_static_string("customers"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8878\r\n"), + primitives.restler_static_string("Host: localhost:8888\r\n"), primitives.restler_static_string("\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), diff --git a/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotation.json b/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotation.json index 654a1b25..11b1402c 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotation.json +++ b/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotation.json @@ -180,7 +180,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotationInSeparateFile.json b/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotationInSeparateFile.json index d18520dc..38c23eb6 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotationInSeparateFile.json +++ b/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotationInSeparateFile.json @@ -166,7 +166,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/array_example.json b/src/compiler/Restler.Compiler.Test/swagger/array_example.json index 895741f4..18f134da 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/array_example.json +++ b/src/compiler/Restler.Compiler.Test/swagger/array_example.json @@ -129,7 +129,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/array_example_external.json b/src/compiler/Restler.Compiler.Test/swagger/array_example_external.json index 5992b1a0..07990853 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/array_example_external.json +++ b/src/compiler/Restler.Compiler.Test/swagger/array_example_external.json @@ -129,7 +129,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger1.json b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger1.json index b2c97698..09b2afd9 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger1.json +++ b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger1.json @@ -161,7 +161,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger2.json b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger2.json index 8b64cbe4..857f7335 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger2.json +++ b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger2.json @@ -161,7 +161,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger3.json b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger3.json index 9c1b9937..e17bad3d 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger3.json +++ b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger3.json @@ -165,7 +165,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/demo_server.json b/src/compiler/Restler.Compiler.Test/swagger/demo_server.json index a419b11b..788c65dc 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/demo_server.json +++ b/src/compiler/Restler.Compiler.Test/swagger/demo_server.json @@ -76,7 +76,7 @@ ] } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple demonstration of a Flask RestPlus powered API", "title": "My Blog API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/array_dep_multiple_items.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/array_dep_multiple_items.json index 55ab9e29..54c620ec 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/array_dep_multiple_items.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/array_dep_multiple_items.json @@ -122,7 +122,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/body_dependency_cycles.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/body_dependency_cycles.json index 036200c8..c5791ada 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/body_dependency_cycles.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/body_dependency_cycles.json @@ -69,7 +69,7 @@ } } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Small example that produces cycles due to body dependencies.", "title": "Cycle body dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/frontend_port_id.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/frontend_port_id.json index 0bfa6dea..9e6a1aaa 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/frontend_port_id.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/frontend_port_id.json @@ -314,7 +314,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Small example for object with embedded consumer.", "title": "Subnet dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/header_deps.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/header_deps.json index 51870199..78301f90 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/header_deps.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/header_deps.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Small example for header dependencies.", "title": "The title.", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/inconsistent_casing_paths.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/inconsistent_casing_paths.json index 06519418..5e2fbb1a 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/inconsistent_casing_paths.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/inconsistent_casing_paths.json @@ -19,7 +19,7 @@ "x-ms-azure-resource": true } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Small example for inconsistent casing paths.", "title": "Inconsistent casing path dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/input_producer_spec.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/input_producer_spec.json index c345caf9..84b9b2b4 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/input_producer_spec.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/input_producer_spec.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Small example for POST with input producer", "title": "Input producer test case", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ip_configurations_get.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ip_configurations_get.json index 216a4eb0..005ace1d 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ip_configurations_get.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ip_configurations_get.json @@ -278,7 +278,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Small example for object with embedded consumer.", "title": "Subnet dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/lowercase_paths.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/lowercase_paths.json index 0ba5e8ee..b40ddf44 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/lowercase_paths.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/lowercase_paths.json @@ -15,7 +15,7 @@ "x-ms-azure-resource": true } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Small example for lowercase paths.", "title": "Lowercase path dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/nested_objects_naming.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/nested_objects_naming.json index a775887b..197e9bb3 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/nested_objects_naming.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/nested_objects_naming.json @@ -199,7 +199,7 @@ } } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Small example for object with embedded consumer.", "title": "Subnet dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ordering_test.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ordering_test.json index 611c9615..b35cf804 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ordering_test.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ordering_test.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Small example for ordering constraints.", "title": "The title.", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/post_patch_dependency.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/post_patch_dependency.json index 3e0f25d1..5952d435 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/post_patch_dependency.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/post_patch_dependency.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Small example for POST and dependent PATCH.", "title": "patch dependency test case.", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/response_headers.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/response_headers.json index 48ca531f..5f82fff8 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/response_headers.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/response_headers.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Small example for header dependencies.", "title": "The title.", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/subnet_id.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/subnet_id.json index c015cc6e..b5e9dbd7 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/subnet_id.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/subnet_id.json @@ -121,7 +121,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Small example for object with embedded consumer.", "title": "Subnet dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/customPayloadSwagger.json b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/customPayloadSwagger.json index 6420a766..4d4ea929 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/customPayloadSwagger.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/customPayloadSwagger.json @@ -175,7 +175,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/multipleIdenticalUuidSuffix.json b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/multipleIdenticalUuidSuffix.json index 40c9abd8..77d4d585 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/multipleIdenticalUuidSuffix.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/multipleIdenticalUuidSuffix.json @@ -24,7 +24,7 @@ } } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Resource API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/no_params.json b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/no_params.json index b0fd9041..73c3dd69 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/no_params.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/no_params.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec with one header and one query parameter.", "title": "Simple spec", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/pathDictionaryPayload.json b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/pathDictionaryPayload.json index 2a0a46ca..7af7db5f 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/pathDictionaryPayload.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/pathDictionaryPayload.json @@ -170,7 +170,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/empty_array_example.json b/src/compiler/Restler.Compiler.Test/swagger/empty_array_example.json index 987bc171..292e0d4e 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/empty_array_example.json +++ b/src/compiler/Restler.Compiler.Test/swagger/empty_array_example.json @@ -115,7 +115,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/exactCopy/array_example.json b/src/compiler/Restler.Compiler.Test/swagger/exactCopy/array_example.json index a22ce673..26e604e7 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/exactCopy/array_example.json +++ b/src/compiler/Restler.Compiler.Test/swagger/exactCopy/array_example.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "Parameter examples", diff --git a/src/compiler/Restler.Compiler.Test/swagger/example_demo.json b/src/compiler/Restler.Compiler.Test/swagger/example_demo.json index 6d73c551..468f6ff9 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/example_demo.json +++ b/src/compiler/Restler.Compiler.Test/swagger/example_demo.json @@ -116,7 +116,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/example_demo1.json b/src/compiler/Restler.Compiler.Test/swagger/example_demo1.json index 50425312..27bbee5d 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/example_demo1.json +++ b/src/compiler/Restler.Compiler.Test/swagger/example_demo1.json @@ -121,7 +121,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/example_demo1.yaml b/src/compiler/Restler.Compiler.Test/swagger/example_demo1.yaml index 6881b8fe..5938a713 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/example_demo1.yaml +++ b/src/compiler/Restler.Compiler.Test/swagger/example_demo1.yaml @@ -84,7 +84,7 @@ definitions: $ref: '#/definitions/KeyType' description: The key type. description: The callback url parameters. -host: 'localhost:8878' +host: 'localhost:8888' info: description: A simple swagger spec that uses examples title: My Grocery API diff --git a/src/compiler/Restler.Compiler.Test/swagger/get_path_dependencies.json b/src/compiler/Restler.Compiler.Test/swagger/get_path_dependencies.json index 4764e578..005d1d09 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/get_path_dependencies.json +++ b/src/compiler/Restler.Compiler.Test/swagger/get_path_dependencies.json @@ -179,7 +179,7 @@ }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "", "title": "Based on ApplicationGateway.json", diff --git a/src/compiler/Restler.Compiler.Test/swagger/grammarTests/required_params.json b/src/compiler/Restler.Compiler.Test/swagger/grammarTests/required_params.json index 502ce2d8..43635b64 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/grammarTests/required_params.json +++ b/src/compiler/Restler.Compiler.Test/swagger/grammarTests/required_params.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses required and optional parameters", "title": "Parameters example spec", diff --git a/src/compiler/Restler.Compiler.Test/swagger/headers.json b/src/compiler/Restler.Compiler.Test/swagger/headers.json index b74d5955..b0d69011 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/headers.json +++ b/src/compiler/Restler.Compiler.Test/swagger/headers.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses headers", "title": "Header example spec", diff --git a/src/compiler/Restler.Compiler.Test/swagger/inline_examples.json b/src/compiler/Restler.Compiler.Test/swagger/inline_examples.json index 114e5d4e..39b7e34e 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/inline_examples.json +++ b/src/compiler/Restler.Compiler.Test/swagger/inline_examples.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses inline examples", "title": "Inline example spec", diff --git a/src/compiler/Restler.Compiler.Test/swagger/object_example.json b/src/compiler/Restler.Compiler.Test/swagger/object_example.json index aebf5468..fa04bbf8 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/object_example.json +++ b/src/compiler/Restler.Compiler.Test/swagger/object_example.json @@ -115,7 +115,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/put_createorupdate.json b/src/compiler/Restler.Compiler.Test/swagger/put_createorupdate.json index 5845eafa..73d2e9a9 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/put_createorupdate.json +++ b/src/compiler/Restler.Compiler.Test/swagger/put_createorupdate.json @@ -115,7 +115,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/schemaTests/global_path_parameters.json b/src/compiler/Restler.Compiler.Test/swagger/schemaTests/global_path_parameters.json index d454c7e0..1aad56f8 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/schemaTests/global_path_parameters.json +++ b/src/compiler/Restler.Compiler.Test/swagger/schemaTests/global_path_parameters.json @@ -5,7 +5,7 @@ "version": "1" }, - "host": "localhost:8878", + "host": "localhost:8888", "paths": { "/customer/{customerId}": { "put": { diff --git a/src/compiler/Restler.Compiler.Test/swagger/schemaTests/large_json_body.json b/src/compiler/Restler.Compiler.Test/swagger/schemaTests/large_json_body.json index 1ab709ec..e503a17a 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/schemaTests/large_json_body.json +++ b/src/compiler/Restler.Compiler.Test/swagger/schemaTests/large_json_body.json @@ -122,7 +122,7 @@ } }, - "host": "localhost:8878", + "host": "localhost:8888", "info": { "description": "Example with deep json body and both arrays, properties, and objects.", "title": "Test json nesting depth", From 0455a7f13a99fb001cb11262508cc731c25dae3f Mon Sep 17 00:00:00 2001 From: Jiaxin Ge Date: Sun, 6 Mar 2022 20:54:52 -0800 Subject: [PATCH 16/16] updage --- demo_server/Dockerfile | 2 +- demo_server/README.md | 2 +- demo_server/demo_server/db.sqlite | Bin 329728 -> 329728 bytes demo_server/demo_server/settings.py | 2 +- demo_server/demo_server/wrapper.py | 1 + demo_server/swagger.json | 2 +- docs/user-guide/Replay.md | 4 ++-- docs/user-guide/Testing.md | 2 +- docs/user-guide/TutorialDemoServer.md | 2 +- .../dependencyTests/header_deps_grammar.py | 8 ++++---- ...ader_response_writer_annotation_grammar.py | 8 ++++---- .../header_response_writer_grammar.py | 8 ++++---- .../dependencyTests/ordering_test_grammar.py | 6 +++--- .../path_annotation_grammar.py | 4 ++-- .../path_in_dictionary_payload_grammar.py | 4 ++-- .../quoted_primitives_grammar.py | 6 +++--- .../exampleTests/array_example_grammar.py | 6 +++--- .../grammarTests/required_params_grammar.json | 4 ++-- .../grammarTests/required_params_grammar.py | 4 ++-- .../required_params_grammar_requiredonly.py | 4 ++-- .../annotationTests/pathAnnotation.json | 2 +- .../pathAnnotationInSeparateFile.json | 2 +- .../swagger/array_example.json | 2 +- .../swagger/array_example_external.json | 2 +- .../swagger/configTests/swagger1.json | 2 +- .../swagger/configTests/swagger2.json | 2 +- .../swagger/configTests/swagger3.json | 2 +- .../swagger/demo_server.json | 2 +- .../array_dep_multiple_items.json | 2 +- .../body_dependency_cycles.json | 2 +- .../dependencyTests/frontend_port_id.json | 2 +- .../swagger/dependencyTests/header_deps.json | 2 +- .../inconsistent_casing_paths.json | 2 +- .../dependencyTests/input_producer_spec.json | 2 +- .../ip_configurations_get.json | 2 +- .../dependencyTests/lowercase_paths.json | 2 +- .../nested_objects_naming.json | 2 +- .../dependencyTests/ordering_test.json | 2 +- .../post_patch_dependency.json | 2 +- .../dependencyTests/response_headers.json | 2 +- .../swagger/dependencyTests/subnet_id.json | 2 +- .../dictionaryTests/customPayloadSwagger.json | 2 +- .../multipleIdenticalUuidSuffix.json | 2 +- .../swagger/dictionaryTests/no_params.json | 2 +- .../pathDictionaryPayload.json | 2 +- .../swagger/empty_array_example.json | 2 +- .../swagger/exactCopy/array_example.json | 2 +- .../swagger/example_demo.json | 2 +- .../swagger/example_demo1.json | 2 +- .../swagger/example_demo1.yaml | 2 +- .../swagger/get_path_dependencies.json | 2 +- .../swagger/grammarTests/required_params.json | 2 +- .../swagger/headers.json | 2 +- .../swagger/inline_examples.json | 2 +- .../swagger/object_example.json | 2 +- .../swagger/put_createorupdate.json | 2 +- .../schemaTests/global_path_parameters.json | 2 +- .../swagger/schemaTests/large_json_body.json | 2 +- 58 files changed, 78 insertions(+), 77 deletions(-) diff --git a/demo_server/Dockerfile b/demo_server/Dockerfile index 5510131e..e5f9ffed 100644 --- a/demo_server/Dockerfile +++ b/demo_server/Dockerfile @@ -9,7 +9,7 @@ WORKDIR /app RUN pip install -r requirements.txt -EXPOSE 8888 +EXPOSE 8878 ENV FLASK_RUN_HOST=0.0.0.0 diff --git a/demo_server/README.md b/demo_server/README.md index a1a0531c..c5de4fc4 100644 --- a/demo_server/README.md +++ b/demo_server/README.md @@ -35,7 +35,7 @@ Start demo server at one teminal Swagger ================== - The interactive swagger specification interface will be available at - http://localhost:8888/api/ using your browser. + http://localhost:8878/api/ using your browser. - The swagger can also be found in the demo_server directory as swagger.json - The swagger was automatically generated by flask-restplus - This swagger can be compiled and tested using RESTler. diff --git a/demo_server/demo_server/db.sqlite b/demo_server/demo_server/db.sqlite index 85281421518c1f4eef8a4a30cb6fd2209ffa17da..1dedfd66116af809b53b5c4c72dbde045609fe7b 100644 GIT binary patch delta 90 zcmZpeAkr{FWP&tf&_o$$#-PT8)&$1Z1g6#m=GFw3tqH70Sqx3g5)Dil7#PGD6vfgq fi;7DWl5+CXO^l3xEG#S;7#PGD6vfgq fi;7DWl5+CXlPrwQO)*3*Q;kzhw}-K^u3`cJmjxLs diff --git a/demo_server/demo_server/settings.py b/demo_server/demo_server/settings.py index e1fc085e..177a6e9a 100644 --- a/demo_server/demo_server/settings.py +++ b/demo_server/demo_server/settings.py @@ -2,7 +2,7 @@ # Licensed under the MIT License. # Flask settings -FLASK_SERVER_NAME = 'localhost:8888' +FLASK_SERVER_NAME = 'localhost:8878' FLASK_DEBUG = True # Do not use debug mode in production # Flask-Restplus settings diff --git a/demo_server/demo_server/wrapper.py b/demo_server/demo_server/wrapper.py index cf58adb8..1765acf1 100644 --- a/demo_server/demo_server/wrapper.py +++ b/demo_server/demo_server/wrapper.py @@ -34,6 +34,7 @@ def before_req(): @app.after_request def after_req(response): print('response intercepted after processing') + print(response) # We can access captured warnings in w print('When processing the reqeust, the following warnings were observed') diff --git a/demo_server/swagger.json b/demo_server/swagger.json index 861ac06f..5c4278b9 100644 --- a/demo_server/swagger.json +++ b/demo_server/swagger.json @@ -285,5 +285,5 @@ }, "NoResultFound": {} }, - "host": "localhost:8888" + "host": "localhost:8878" } \ No newline at end of file diff --git a/docs/user-guide/Replay.md b/docs/user-guide/Replay.md index 2d6bd326..a180f0b4 100644 --- a/docs/user-guide/Replay.md +++ b/docs/user-guide/Replay.md @@ -39,12 +39,12 @@ so that the sequence can be replayed exactly as it was executed before. Below is an example of the requests and responses from a replay log sequence. ``` --> POST /api/blog/posts HTTP/1.1\r\nAccept: application/json\r\nHost: localhost:8888\r\nContent-Type: application/json\r\n\r\n{\n "id":0,\n "body":"fuzzstring"}\r\n +-> POST /api/blog/posts HTTP/1.1\r\nAccept: application/json\r\nHost: localhost:8878\r\nContent-Type: application/json\r\n\r\n{\n "id":0,\n "body":"fuzzstring"}\r\n ! producer_timing_delay 0 ! max_async_wait_time 0 PREVIOUS RESPONSE: 'HTTP/1.1 201 CREATED\r\nContent-Type: application/json\r\nContent-Length: 45\r\nServer: Werkzeug/0.16.0 Python/3.8.2\r\nDate: Thu, 01 Oct 2020 22:00:27 GMT\r\n\r\n{\n "id": 5875,\n "body": "fuzzstring"\n}\n' --> PUT /api/blog/posts/5875 HTTP/1.1\r\nAccept: application/json\r\nHost: localhost:8888\r\nContent-Type: application/json\r\n\r\n{"body":"fuzzstring"} +-> PUT /api/blog/posts/5875 HTTP/1.1\r\nAccept: application/json\r\nHost: localhost:8878\r\nContent-Type: application/json\r\n\r\n{"body":"fuzzstring"} ! producer_timing_delay 0 ! max_async_wait_time 0 PREVIOUS RESPONSE: 'HTTP/1.1 500 INTERNAL SERVER ERROR\r\nContent-Type: application/json\r\nContent-Length: 176\r\nServer: Werkzeug/0.16.0 Python/3.8.2\r\nDate: Thu, 01 Oct 2020 22:00:28 GMT\r\n\r\n{\n "message": "The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application."\n}\n' diff --git a/docs/user-guide/Testing.md b/docs/user-guide/Testing.md index 13769afc..62c662f9 100644 --- a/docs/user-guide/Testing.md +++ b/docs/user-guide/Testing.md @@ -94,7 +94,7 @@ During each Test run a `speccov.json` file will be created in the logs directory "request_uri": "/api/blog/posts/5872", "request_headers": [ "Accept: application/json", - "Host: localhost:8888", + "Host: localhost:8878", "Content-Type: application/json" ], "request_body": "{\n \"id\":\"5872\",\n \"checksum\":\"fuzzstring\",\n \"body\":\"first blog\"}\r\n", diff --git a/docs/user-guide/TutorialDemoServer.md b/docs/user-guide/TutorialDemoServer.md index 3f599e53..d0a64c3a 100644 --- a/docs/user-guide/TutorialDemoServer.md +++ b/docs/user-guide/TutorialDemoServer.md @@ -58,7 +58,7 @@ In this example, coverage is 5 / 6 and the only INVALID request is + restler_fuzzable_int: ['0', '1'] - restler_static_string: ' HTTP/1.1\r\n' - restler_static_string: 'Accept: application/json\r\n' - - restler_static_string: 'Host: localhost:8888\r\n' + - restler_static_string: 'Host: localhost:8878\r\n' - restler_static_string: '\r\n' By looking at `network.testing.<...>.txt`, we can see that RESTler attempts to execute this request 4 times, each time with a value either 0 or 1 for the `per_page=` and `page=`. It turns out none of these 4 combinations are valid: the `per_page=` must be 2 minimally, but RESTler was not able to infer this automatically. (One way to fix this is to edit `dict.json` and add the value `2` in the list for `restler_fuzzable_int`.) diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_deps_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_deps_grammar.py index 854bc306..952fb62e 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_deps_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_deps_grammar.py @@ -57,7 +57,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -87,7 +87,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("user-id: "), primitives.restler_static_string(_service_user_post_user_id_header.reader(), quoted=False), primitives.restler_static_string("\r\n"), @@ -109,7 +109,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("user-id: "), primitives.restler_static_string(_service_user_post_user_id_header.reader(), quoted=False), primitives.restler_static_string("\r\n"), @@ -131,7 +131,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("user-id: "), primitives.restler_static_string(_service_user_post_user_id_header.reader(), quoted=False), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_annotation_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_annotation_grammar.py index 605ae357..97127d70 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_annotation_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_annotation_grammar.py @@ -57,7 +57,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -89,7 +89,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_Location_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -110,7 +110,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_Location_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -131,7 +131,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_Location_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_grammar.py index 73e29e71..021d683e 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/header_response_writer_grammar.py @@ -57,7 +57,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string("user"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -89,7 +89,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_userId_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -110,7 +110,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_userId_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -131,7 +131,7 @@ def parse_serviceuserpost(data, **kwargs): primitives.restler_static_string(_service_user_post_userId_header.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/ordering_test_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/ordering_test_grammar.py index ecf4e248..a0dafdb6 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/ordering_test_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/ordering_test_grammar.py @@ -18,7 +18,7 @@ primitives.restler_static_string("products"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -47,7 +47,7 @@ primitives.restler_static_string("services"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -77,7 +77,7 @@ primitives.restler_static_string("managementTools"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_annotation_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_annotation_grammar.py index fa87e5fb..59de9949 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_annotation_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_annotation_grammar.py @@ -80,7 +80,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("stores"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -114,7 +114,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("order"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_in_dictionary_payload_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_in_dictionary_payload_grammar.py index bdf481fc..40e54141 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_in_dictionary_payload_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dependencyTests/path_in_dictionary_payload_grammar.py @@ -54,7 +54,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("stores"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -86,7 +86,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("order"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/dictionaryTests/quoted_primitives_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/dictionaryTests/quoted_primitives_grammar.py index 7ce6bec9..23a4a84e 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/dictionaryTests/quoted_primitives_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/dictionaryTests/quoted_primitives_grammar.py @@ -54,7 +54,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string("stores"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -86,7 +86,7 @@ def parse_storespost(data, **kwargs): primitives.restler_static_string(_stores_post_id.reader(), quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), @@ -135,7 +135,7 @@ def parse_storespost(data, **kwargs): primitives.restler_custom_payload("message", quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/exampleTests/array_example_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/exampleTests/array_example_grammar.py index 113bdc84..b749e254 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/exampleTests/array_example_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/exampleTests/array_example_grammar.py @@ -54,7 +54,7 @@ def parse_storesstoreIdorderpost(data, **kwargs): primitives.restler_static_string("stores"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), @@ -99,7 +99,7 @@ def parse_storesstoreIdorderpost(data, **kwargs): primitives.restler_static_string("fff"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), @@ -158,7 +158,7 @@ def parse_storesstoreIdorderpost(data, **kwargs): primitives.restler_fuzzable_string("fuzzstring", quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_refreshable_authentication_token("authentication_token_tag"), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.json b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.json index 170212dc..9da62551 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.json +++ b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.json @@ -112,7 +112,7 @@ ], [ "Host", - "localhost:8888" + "localhost:8878" ] ], "httpVersion": "1.1", @@ -340,7 +340,7 @@ ], [ "Host", - "localhost:8888" + "localhost:8878" ] ], "httpVersion": "1.1", diff --git a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.py b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.py index fd836fe8..a08c6ef6 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.py +++ b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar.py @@ -14,7 +14,7 @@ primitives.restler_static_string("customers"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), @@ -46,7 +46,7 @@ primitives.restler_fuzzable_string("fuzzstring", quoted=False), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("array_header_param: "), primitives.restler_fuzzable_string("fuzzstring", quoted=False), primitives.restler_static_string("\r\n"), diff --git a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar_requiredonly.py b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar_requiredonly.py index b62c12d5..98b849d8 100644 --- a/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar_requiredonly.py +++ b/src/compiler/Restler.Compiler.Test/baselines/grammarTests/required_params_grammar_requiredonly.py @@ -14,7 +14,7 @@ primitives.restler_static_string("customers"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), primitives.restler_static_string("\r\n"), @@ -37,7 +37,7 @@ primitives.restler_static_string("customers"), primitives.restler_static_string(" HTTP/1.1\r\n"), primitives.restler_static_string("Accept: application/json\r\n"), - primitives.restler_static_string("Host: localhost:8888\r\n"), + primitives.restler_static_string("Host: localhost:8878\r\n"), primitives.restler_static_string("\r\n"), primitives.restler_static_string("Content-Type: "), primitives.restler_static_string("application/json"), diff --git a/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotation.json b/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotation.json index 11b1402c..654a1b25 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotation.json +++ b/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotation.json @@ -180,7 +180,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotationInSeparateFile.json b/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotationInSeparateFile.json index 38c23eb6..d18520dc 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotationInSeparateFile.json +++ b/src/compiler/Restler.Compiler.Test/swagger/annotationTests/pathAnnotationInSeparateFile.json @@ -166,7 +166,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/array_example.json b/src/compiler/Restler.Compiler.Test/swagger/array_example.json index 18f134da..895741f4 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/array_example.json +++ b/src/compiler/Restler.Compiler.Test/swagger/array_example.json @@ -129,7 +129,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/array_example_external.json b/src/compiler/Restler.Compiler.Test/swagger/array_example_external.json index 07990853..5992b1a0 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/array_example_external.json +++ b/src/compiler/Restler.Compiler.Test/swagger/array_example_external.json @@ -129,7 +129,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger1.json b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger1.json index 09b2afd9..b2c97698 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger1.json +++ b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger1.json @@ -161,7 +161,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger2.json b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger2.json index 857f7335..8b64cbe4 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger2.json +++ b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger2.json @@ -161,7 +161,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger3.json b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger3.json index e17bad3d..9c1b9937 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger3.json +++ b/src/compiler/Restler.Compiler.Test/swagger/configTests/swagger3.json @@ -165,7 +165,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/demo_server.json b/src/compiler/Restler.Compiler.Test/swagger/demo_server.json index 788c65dc..a419b11b 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/demo_server.json +++ b/src/compiler/Restler.Compiler.Test/swagger/demo_server.json @@ -76,7 +76,7 @@ ] } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple demonstration of a Flask RestPlus powered API", "title": "My Blog API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/array_dep_multiple_items.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/array_dep_multiple_items.json index 54c620ec..55ab9e29 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/array_dep_multiple_items.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/array_dep_multiple_items.json @@ -122,7 +122,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/body_dependency_cycles.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/body_dependency_cycles.json index c5791ada..036200c8 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/body_dependency_cycles.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/body_dependency_cycles.json @@ -69,7 +69,7 @@ } } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example that produces cycles due to body dependencies.", "title": "Cycle body dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/frontend_port_id.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/frontend_port_id.json index 9e6a1aaa..0bfa6dea 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/frontend_port_id.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/frontend_port_id.json @@ -314,7 +314,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for object with embedded consumer.", "title": "Subnet dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/header_deps.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/header_deps.json index 78301f90..51870199 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/header_deps.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/header_deps.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for header dependencies.", "title": "The title.", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/inconsistent_casing_paths.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/inconsistent_casing_paths.json index 5e2fbb1a..06519418 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/inconsistent_casing_paths.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/inconsistent_casing_paths.json @@ -19,7 +19,7 @@ "x-ms-azure-resource": true } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for inconsistent casing paths.", "title": "Inconsistent casing path dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/input_producer_spec.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/input_producer_spec.json index 84b9b2b4..c345caf9 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/input_producer_spec.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/input_producer_spec.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for POST with input producer", "title": "Input producer test case", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ip_configurations_get.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ip_configurations_get.json index 005ace1d..216a4eb0 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ip_configurations_get.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ip_configurations_get.json @@ -278,7 +278,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for object with embedded consumer.", "title": "Subnet dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/lowercase_paths.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/lowercase_paths.json index b40ddf44..0ba5e8ee 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/lowercase_paths.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/lowercase_paths.json @@ -15,7 +15,7 @@ "x-ms-azure-resource": true } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for lowercase paths.", "title": "Lowercase path dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/nested_objects_naming.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/nested_objects_naming.json index 197e9bb3..a775887b 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/nested_objects_naming.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/nested_objects_naming.json @@ -199,7 +199,7 @@ } } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for object with embedded consumer.", "title": "Subnet dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ordering_test.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ordering_test.json index b35cf804..611c9615 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ordering_test.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/ordering_test.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for ordering constraints.", "title": "The title.", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/post_patch_dependency.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/post_patch_dependency.json index 5952d435..3e0f25d1 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/post_patch_dependency.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/post_patch_dependency.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for POST and dependent PATCH.", "title": "patch dependency test case.", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/response_headers.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/response_headers.json index 5f82fff8..48ca531f 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/response_headers.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/response_headers.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for header dependencies.", "title": "The title.", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/subnet_id.json b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/subnet_id.json index b5e9dbd7..c015cc6e 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/subnet_id.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dependencyTests/subnet_id.json @@ -121,7 +121,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Small example for object with embedded consumer.", "title": "Subnet dependencies regression test", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/customPayloadSwagger.json b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/customPayloadSwagger.json index 4d4ea929..6420a766 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/customPayloadSwagger.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/customPayloadSwagger.json @@ -175,7 +175,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/multipleIdenticalUuidSuffix.json b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/multipleIdenticalUuidSuffix.json index 77d4d585..40c9abd8 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/multipleIdenticalUuidSuffix.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/multipleIdenticalUuidSuffix.json @@ -24,7 +24,7 @@ } } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Resource API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/no_params.json b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/no_params.json index 73c3dd69..b0fd9041 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/no_params.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/no_params.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec with one header and one query parameter.", "title": "Simple spec", diff --git a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/pathDictionaryPayload.json b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/pathDictionaryPayload.json index 7af7db5f..2a0a46ca 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/pathDictionaryPayload.json +++ b/src/compiler/Restler.Compiler.Test/swagger/dictionaryTests/pathDictionaryPayload.json @@ -170,7 +170,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/empty_array_example.json b/src/compiler/Restler.Compiler.Test/swagger/empty_array_example.json index 292e0d4e..987bc171 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/empty_array_example.json +++ b/src/compiler/Restler.Compiler.Test/swagger/empty_array_example.json @@ -115,7 +115,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/exactCopy/array_example.json b/src/compiler/Restler.Compiler.Test/swagger/exactCopy/array_example.json index 26e604e7..a22ce673 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/exactCopy/array_example.json +++ b/src/compiler/Restler.Compiler.Test/swagger/exactCopy/array_example.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "Parameter examples", diff --git a/src/compiler/Restler.Compiler.Test/swagger/example_demo.json b/src/compiler/Restler.Compiler.Test/swagger/example_demo.json index 468f6ff9..6d73c551 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/example_demo.json +++ b/src/compiler/Restler.Compiler.Test/swagger/example_demo.json @@ -116,7 +116,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/example_demo1.json b/src/compiler/Restler.Compiler.Test/swagger/example_demo1.json index 27bbee5d..50425312 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/example_demo1.json +++ b/src/compiler/Restler.Compiler.Test/swagger/example_demo1.json @@ -121,7 +121,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/example_demo1.yaml b/src/compiler/Restler.Compiler.Test/swagger/example_demo1.yaml index 5938a713..6881b8fe 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/example_demo1.yaml +++ b/src/compiler/Restler.Compiler.Test/swagger/example_demo1.yaml @@ -84,7 +84,7 @@ definitions: $ref: '#/definitions/KeyType' description: The key type. description: The callback url parameters. -host: 'localhost:8888' +host: 'localhost:8878' info: description: A simple swagger spec that uses examples title: My Grocery API diff --git a/src/compiler/Restler.Compiler.Test/swagger/get_path_dependencies.json b/src/compiler/Restler.Compiler.Test/swagger/get_path_dependencies.json index 005d1d09..4764e578 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/get_path_dependencies.json +++ b/src/compiler/Restler.Compiler.Test/swagger/get_path_dependencies.json @@ -179,7 +179,7 @@ }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "", "title": "Based on ApplicationGateway.json", diff --git a/src/compiler/Restler.Compiler.Test/swagger/grammarTests/required_params.json b/src/compiler/Restler.Compiler.Test/swagger/grammarTests/required_params.json index 43635b64..502ce2d8 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/grammarTests/required_params.json +++ b/src/compiler/Restler.Compiler.Test/swagger/grammarTests/required_params.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses required and optional parameters", "title": "Parameters example spec", diff --git a/src/compiler/Restler.Compiler.Test/swagger/headers.json b/src/compiler/Restler.Compiler.Test/swagger/headers.json index b0d69011..b74d5955 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/headers.json +++ b/src/compiler/Restler.Compiler.Test/swagger/headers.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses headers", "title": "Header example spec", diff --git a/src/compiler/Restler.Compiler.Test/swagger/inline_examples.json b/src/compiler/Restler.Compiler.Test/swagger/inline_examples.json index 39b7e34e..114e5d4e 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/inline_examples.json +++ b/src/compiler/Restler.Compiler.Test/swagger/inline_examples.json @@ -3,7 +3,7 @@ "consumes": [ "application/json" ], - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses inline examples", "title": "Inline example spec", diff --git a/src/compiler/Restler.Compiler.Test/swagger/object_example.json b/src/compiler/Restler.Compiler.Test/swagger/object_example.json index fa04bbf8..aebf5468 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/object_example.json +++ b/src/compiler/Restler.Compiler.Test/swagger/object_example.json @@ -115,7 +115,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/put_createorupdate.json b/src/compiler/Restler.Compiler.Test/swagger/put_createorupdate.json index 73d2e9a9..5845eafa 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/put_createorupdate.json +++ b/src/compiler/Restler.Compiler.Test/swagger/put_createorupdate.json @@ -115,7 +115,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "A simple swagger spec that uses examples", "title": "My Grocery API", diff --git a/src/compiler/Restler.Compiler.Test/swagger/schemaTests/global_path_parameters.json b/src/compiler/Restler.Compiler.Test/swagger/schemaTests/global_path_parameters.json index 1aad56f8..d454c7e0 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/schemaTests/global_path_parameters.json +++ b/src/compiler/Restler.Compiler.Test/swagger/schemaTests/global_path_parameters.json @@ -5,7 +5,7 @@ "version": "1" }, - "host": "localhost:8888", + "host": "localhost:8878", "paths": { "/customer/{customerId}": { "put": { diff --git a/src/compiler/Restler.Compiler.Test/swagger/schemaTests/large_json_body.json b/src/compiler/Restler.Compiler.Test/swagger/schemaTests/large_json_body.json index e503a17a..1ab709ec 100644 --- a/src/compiler/Restler.Compiler.Test/swagger/schemaTests/large_json_body.json +++ b/src/compiler/Restler.Compiler.Test/swagger/schemaTests/large_json_body.json @@ -122,7 +122,7 @@ } }, - "host": "localhost:8888", + "host": "localhost:8878", "info": { "description": "Example with deep json body and both arrays, properties, and objects.", "title": "Test json nesting depth",