Create HttpRequestContextImpl

This commit is contained in:
Tobe O 2018-02-06 23:59:05 -05:00
parent 15b49f1888
commit dbfac9c583
4 changed files with 265 additions and 264 deletions

View file

@ -2,11 +2,10 @@
<project version="4"> <project version="4">
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="7b89ff1e-1260-4dcf-9c3d-345de0471ea1" name="Default" comment=""> <list default="true" id="7b89ff1e-1260-4dcf-9c3d-345de0471ea1" name="Default" comment="">
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/.idea/runConfigurations/main_dart.xml" /> <change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/src/http/http_request_context.dart" />
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/example/main.dart" />
<change type="DELETED" beforePath="$PROJECT_DIR$/example/common.dart" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/example/json.dart" afterPath="$PROJECT_DIR$/example/json.dart" /> <change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/angel_http.dart" afterPath="$PROJECT_DIR$/lib/src/http/angel_http.dart" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/request_context.dart" afterPath="$PROJECT_DIR$/lib/src/http/request_context.dart" />
</list> </list>
<ignored path="$PROJECT_DIR$/.tmp/" /> <ignored path="$PROJECT_DIR$/.tmp/" />
<ignored path="$PROJECT_DIR$/temp/" /> <ignored path="$PROJECT_DIR$/temp/" />
@ -28,44 +27,14 @@
<favorites_list name="framework" /> <favorites_list name="framework" />
</component> </component>
<component name="FileEditorManager"> <component name="FileEditorManager">
<splitter split-orientation="horizontal" split-proportion="0.50455236"> <splitter split-orientation="horizontal" split-proportion="0.53945374">
<split-first> <split-first>
<leaf SIDE_TABS_SIZE_LIMIT_KEY="375"> <leaf>
<file leaf-file-name="parameter_meta_test.dart" pinned="false" current-in-tab="false"> <file leaf-file-name="angel_http.dart" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/test/parameter_meta_test.dart"> <entry file="file://$PROJECT_DIR$/lib/src/http/angel_http.dart">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="176"> <state relative-caret-position="257">
<caret line="23" column="30" lean-forward="false" selection-start-line="23" selection-start-column="30" selection-end-line="23" selection-end-column="30" /> <caret line="281" column="65" lean-forward="false" selection-start-line="281" selection-start-column="65" selection-end-line="281" selection-end-column="65" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="primitives_test.dart" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/test/primitives_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="119">
<caret line="12" column="30" lean-forward="false" selection-start-line="12" selection-start-column="30" selection-end-line="12" selection-end-column="30" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="server_test.dart" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/test/server_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="192">
<caret line="52" column="40" lean-forward="true" selection-start-line="52" selection-start-column="40" selection-end-line="52" selection-end-column="40" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="json.dart" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/example/json.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding> <folding>
<element signature="e#0#20#0" expanded="true" /> <element signature="e#0#20#0" expanded="true" />
</folding> </folding>
@ -73,80 +42,15 @@
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="main.dart" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/example/main.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="270">
<caret line="18" column="1" lean-forward="true" selection-start-line="18" selection-start-column="1" selection-end-line="18" selection-end-column="1" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="server.dart" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/lib/src/http/server.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="180">
<caret line="422" column="22" lean-forward="true" selection-start-line="422" selection-start-column="22" selection-end-line="422" selection-end-column="22" />
<folding>
<element signature="e#38#58#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="streaming_test.dart" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/test/streaming_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="276">
<caret line="103" column="25" lean-forward="false" selection-start-line="103" selection-start-column="25" selection-end-line="103" selection-end-column="25" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="encoders_buffer_test.dart" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/test/encoders_buffer_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="99">
<caret line="38" column="4" lean-forward="false" selection-start-line="38" selection-start-column="4" selection-end-line="38" selection-end-column="4" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="hooked_test.dart" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/test/hooked_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="132">
<caret line="35" column="28" lean-forward="false" selection-start-line="35" selection-start-column="28" selection-end-line="35" selection-end-column="28" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="routing_test.dart" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/test/routing_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1269">
<caret line="102" column="14" lean-forward="false" selection-start-line="102" selection-start-column="14" selection-end-line="102" selection-end-column="14" />
<folding>
<marker date="1517977457000" expanded="false" signature="7:13" ph="..." />
<marker date="1517977457000" expanded="true" signature="6143:6153" ph="{...}" />
</folding>
</state>
</provider>
</entry>
</file>
</leaf> </leaf>
</split-first> </split-first>
<split-second> <split-second>
<leaf> <leaf>
<file leaf-file-name="angel_http.dart" pinned="false" current-in-tab="true"> <file leaf-file-name="http_request_context.dart" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/lib/src/http/angel_http.dart"> <entry file="file://$PROJECT_DIR$/lib/src/http/http_request_context.dart">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="182"> <state relative-caret-position="90">
<caret line="275" column="3" lean-forward="true" selection-start-line="275" selection-start-column="3" selection-end-line="275" selection-end-column="3" /> <caret line="6" column="69" lean-forward="false" selection-start-line="6" selection-start-column="69" selection-end-line="6" selection-end-column="69" />
<folding> <folding>
<element signature="e#0#20#0" expanded="true" /> <element signature="e#0#20#0" expanded="true" />
</folding> </folding>
@ -161,13 +65,13 @@
<component name="FileTemplateManagerImpl"> <component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES"> <option name="RECENT_TEMPLATES">
<list> <list>
<option value="Gherkin feature file" />
<option value="Dart File" /> <option value="Dart File" />
</list> </list>
</option> </option>
</component> </component>
<component name="FindInProjectRecents"> <component name="FindInProjectRecents">
<findStrings> <findStrings>
<find>path</find>
<find>handleRequest</find> <find>handleRequest</find>
<find>flatten</find> <find>flatten</find>
<find>pipeline</find> <find>pipeline</find>
@ -197,6 +101,7 @@
<find>app</find> <find>app</find>
<find>handleRe</find> <find>handleRe</find>
<find>instead.</find> <find>instead.</find>
<find>io\b</find>
</findStrings> </findStrings>
<replaceStrings> <replaceStrings>
<replace>_isClosed</replace> <replace>_isClosed</replace>
@ -246,7 +151,6 @@
<component name="IdeDocumentHistory"> <component name="IdeDocumentHistory">
<option name="CHANGED_PATHS"> <option name="CHANGED_PATHS">
<list> <list>
<option value="$PROJECT_DIR$/test/util_test.dart" />
<option value="$PROJECT_DIR$/performance/hello/raw.dart" /> <option value="$PROJECT_DIR$/performance/hello/raw.dart" />
<option value="$PROJECT_DIR$/performance/hello/angel.md" /> <option value="$PROJECT_DIR$/performance/hello/angel.md" />
<option value="$PROJECT_DIR$/performance/hello/raw.md" /> <option value="$PROJECT_DIR$/performance/hello/raw.md" />
@ -277,14 +181,12 @@
<option value="$PROJECT_DIR$/test/di_test.dart" /> <option value="$PROJECT_DIR$/test/di_test.dart" />
<option value="$PROJECT_DIR$/lib/src/stats/metric_server.dart" /> <option value="$PROJECT_DIR$/lib/src/stats/metric_server.dart" />
<option value="$PROJECT_DIR$/performance/hello/main.dart" /> <option value="$PROJECT_DIR$/performance/hello/main.dart" />
<option value="$PROJECT_DIR$/lib/src/http/request_context.dart" />
<option value="$PROJECT_DIR$/test/all.dart" /> <option value="$PROJECT_DIR$/test/all.dart" />
<option value="$PROJECT_DIR$/lib/src/http/service.dart" /> <option value="$PROJECT_DIR$/lib/src/http/service.dart" />
<option value="$PROJECT_DIR$/pubspec.yaml" /> <option value="$PROJECT_DIR$/pubspec.yaml" />
<option value="$PROJECT_DIR$/lib/src/http/map_service.dart" /> <option value="$PROJECT_DIR$/lib/src/http/map_service.dart" />
<option value="$PROJECT_DIR$/lib/src/http/response_context.dart" /> <option value="$PROJECT_DIR$/lib/src/http/response_context.dart" />
<option value="$PROJECT_DIR$/CHANGELOG.md" /> <option value="$PROJECT_DIR$/CHANGELOG.md" />
<option value="$PROJECT_DIR$/lib/src/http/angel_http.dart" />
<option value="$PROJECT_DIR$/lib/src/http/http.dart" /> <option value="$PROJECT_DIR$/lib/src/http/http.dart" />
<option value="$PROJECT_DIR$/test/extension_test.dart" /> <option value="$PROJECT_DIR$/test/extension_test.dart" />
<option value="$PROJECT_DIR$/test/accepts_test.dart" /> <option value="$PROJECT_DIR$/test/accepts_test.dart" />
@ -297,6 +199,9 @@
<option value="$PROJECT_DIR$/test/server_test.dart" /> <option value="$PROJECT_DIR$/test/server_test.dart" />
<option value="$PROJECT_DIR$/example/json.dart" /> <option value="$PROJECT_DIR$/example/json.dart" />
<option value="$PROJECT_DIR$/example/main.dart" /> <option value="$PROJECT_DIR$/example/main.dart" />
<option value="$PROJECT_DIR$/lib/src/http/request_context.dart" />
<option value="$PROJECT_DIR$/lib/src/http/http_request_context.dart" />
<option value="$PROJECT_DIR$/lib/src/http/angel_http.dart" />
</list> </list>
</option> </option>
</component> </component>
@ -710,14 +615,7 @@
<workItem from="1513103483207" duration="18000" /> <workItem from="1513103483207" duration="18000" />
<workItem from="1513103506825" duration="139000" /> <workItem from="1513103506825" duration="139000" />
<workItem from="1517332581856" duration="858000" /> <workItem from="1517332581856" duration="858000" />
<workItem from="1517973177718" duration="5097000" /> <workItem from="1517973177718" duration="6314000" />
</task>
<task id="LOCAL-00012" summary="Coverage start...">
<created>1495888785100</created>
<option name="number" value="00012" />
<option name="presentableId" value="LOCAL-00012" />
<option name="project" value="LOCAL" />
<updated>1495888785100</updated>
</task> </task>
<task id="LOCAL-00013" summary="1.0.3"> <task id="LOCAL-00013" summary="1.0.3">
<created>1496752953708</created> <created>1496752953708</created>
@ -1055,7 +953,14 @@
<option name="project" value="LOCAL" /> <option name="project" value="LOCAL" />
<updated>1517978048043</updated> <updated>1517978048043</updated>
</task> </task>
<option name="localTasksCounter" value="61" /> <task id="LOCAL-00061" summary="Added example/main.dart">
<created>1517978306602</created>
<option name="number" value="00061" />
<option name="presentableId" value="LOCAL-00061" />
<option name="project" value="LOCAL" />
<updated>1517978306602</updated>
</task>
<option name="localTasksCounter" value="62" />
<servers /> <servers />
</component> </component>
<component name="TestHistory"> <component name="TestHistory">
@ -1091,7 +996,7 @@
</history-entry> </history-entry>
</component> </component>
<component name="TimeTrackingManager"> <component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="123133000" /> <option name="totallyTimeSpent" value="124350000" />
</component> </component>
<component name="TodoView"> <component name="TodoView">
<todo-panel id="selected-file"> <todo-panel id="selected-file">
@ -1126,7 +1031,7 @@
<window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" /> <window_info id="Image Layers" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" /> <window_info id="Capture Analysis" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32905984" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32905984" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.4002849" sideWeight="0.4964476" order="2" side_tool="false" content_ui="tabs" /> <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4002849" sideWeight="0.4964476" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.48005697" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> <window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.48005697" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.23141123" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.23141123" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32905984" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" /> <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32905984" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
@ -1150,7 +1055,6 @@
</component> </component>
<component name="VcsManagerConfiguration"> <component name="VcsManagerConfiguration">
<option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" /> <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
<MESSAGE value="+2" />
<MESSAGE value="+3" /> <MESSAGE value="+3" />
<MESSAGE value="+4" /> <MESSAGE value="+4" />
<MESSAGE value="+6" /> <MESSAGE value="+6" />
@ -1175,7 +1079,8 @@
<MESSAGE value="Deprecated createZoneForRequest" /> <MESSAGE value="Deprecated createZoneForRequest" />
<MESSAGE value="Deprecated `ServerGenerator`" /> <MESSAGE value="Deprecated `ServerGenerator`" />
<MESSAGE value="Updated tests to use `AngelHttp` API" /> <MESSAGE value="Updated tests to use `AngelHttp` API" />
<option name="LAST_COMMIT_MESSAGE" value="Updated tests to use `AngelHttp` API" /> <MESSAGE value="Added example/main.dart" />
<option name="LAST_COMMIT_MESSAGE" value="Added example/main.dart" />
</component> </component>
<component name="XDebuggerManager"> <component name="XDebuggerManager">
<breakpoint-manager> <breakpoint-manager>
@ -1184,21 +1089,6 @@
<watches-manager /> <watches-manager />
</component> </component>
<component name="editorHistoryManager"> <component name="editorHistoryManager">
<entry file="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/angel_route-1.0.6/lib/src/middleware_pipeline.dart" />
<entry file="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/tuple-1.0.1/lib/src/tuple.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="131">
<caret line="78" column="21" lean-forward="false" selection-start-line="78" selection-start-column="21" selection-end-line="78" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/body_parser-1.0.2/lib/src/parse_body.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="152">
<caret line="90" column="7" lean-forward="true" selection-start-line="90" selection-start-column="7" selection-end-line="90" selection-end-column="7" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/angel_base.dart"> <entry file="file://$PROJECT_DIR$/lib/src/http/angel_base.dart">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="107"> <state relative-caret-position="107">
@ -1329,13 +1219,6 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/request_context.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="316">
<caret line="249" column="30" lean-forward="true" selection-start-line="249" selection-start-column="30" selection-end-line="249" selection-end-column="30" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/tool/travis.sh"> <entry file="file://$PROJECT_DIR$/tool/travis.sh">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="45"> <state relative-caret-position="45">
@ -1512,6 +1395,40 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/example/common.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75">
<caret line="5" column="0" lean-forward="true" selection-start-line="5" selection-start-column="0" selection-end-line="5" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/main.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="225">
<caret line="15" column="32" lean-forward="true" selection-start-line="15" selection-start-column="32" selection-end-line="15" selection-end-column="32" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/json.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/server_test.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="192">
<caret line="52" column="40" lean-forward="true" selection-start-line="52" selection-start-column="40" selection-end-line="52" selection-end-column="40" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test/primitives_test.dart"> <entry file="file://$PROJECT_DIR$/test/primitives_test.dart">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="119"> <state relative-caret-position="119">
@ -1530,7 +1447,7 @@
</entry> </entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/server.dart"> <entry file="file://$PROJECT_DIR$/lib/src/http/server.dart">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="180"> <state relative-caret-position="6330">
<caret line="422" column="22" lean-forward="true" selection-start-line="422" selection-start-column="22" selection-end-line="422" selection-end-column="22" /> <caret line="422" column="22" lean-forward="true" selection-start-line="422" selection-start-column="22" selection-end-line="422" selection-end-column="22" />
<folding> <folding>
<element signature="e#38#58#0" expanded="true" /> <element signature="e#38#58#0" expanded="true" />
@ -1538,58 +1455,60 @@
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file:///usr/local/Cellar/dart/1.24.2/libexec/lib/io/http.dart"> <entry file="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/meta-1.1.2/lib/meta.dart">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="129"> <state relative-caret-position="224">
<caret line="709" column="35" lean-forward="false" selection-start-line="709" selection-start-column="35" selection-end-line="709" selection-end-column="35" /> <caret line="201" column="50" lean-forward="false" selection-start-line="201" selection-start-column="50" selection-end-line="201" selection-end-column="50" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/test/server_test.dart"> <entry file="file://$USER_HOME$/.pub-cache/hosted/pub.dartlang.org/body_parser-1.0.3/lib/src/body_parse_result.dart">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="192"> <state relative-caret-position="240">
<caret line="52" column="40" lean-forward="true" selection-start-line="52" selection-start-column="40" selection-end-line="52" selection-end-column="40" /> <caret line="16" column="31" lean-forward="true" selection-start-line="16" selection-start-column="31" selection-end-line="16" selection-end-column="31" />
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file:///usr/local/Cellar/dart/1.24.2/libexec/lib/io/http.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="152">
<caret line="820" column="15" lean-forward="false" selection-start-line="820" selection-start-column="15" selection-end-line="820" selection-end-column="15" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/http_request_context.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="90">
<caret line="6" column="69" lean-forward="false" selection-start-line="6" selection-start-column="69" selection-end-line="6" selection-end-column="69" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/request_context.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="227">
<caret line="232" column="19" lean-forward="false" selection-start-line="232" selection-start-column="19" selection-end-line="232" selection-end-column="19" />
<folding>
<element signature="e#47#67#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/lib/src/http/angel_http.dart"> <entry file="file://$PROJECT_DIR$/lib/src/http/angel_http.dart">
<provider selected="true" editor-type-id="text-editor"> <provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="182"> <state relative-caret-position="257">
<caret line="275" column="3" lean-forward="true" selection-start-line="275" selection-start-column="3" selection-end-line="275" selection-end-column="3" /> <caret line="281" column="65" lean-forward="false" selection-start-line="281" selection-start-column="65" selection-end-line="281" selection-end-column="65" />
<folding> <folding>
<element signature="e#0#20#0" expanded="true" /> <element signature="e#0#20#0" expanded="true" />
</folding> </folding>
</state> </state>
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/example/common.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="75">
<caret line="5" column="0" lean-forward="true" selection-start-line="5" selection-start-column="0" selection-end-line="5" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/json.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding>
<element signature="e#0#20#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/example/main.dart">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="270">
<caret line="18" column="1" lean-forward="true" selection-start-line="18" selection-start-column="1" selection-end-line="18" selection-end-column="1" />
<folding />
</state>
</provider>
</entry>
</component> </component>
<component name="masterDetails"> <component name="masterDetails">
<states> <states>

View file

@ -7,6 +7,7 @@ import 'package:combinator/combinator.dart';
import 'package:json_god/json_god.dart' as god; import 'package:json_god/json_god.dart' as god;
import 'package:pool/pool.dart'; import 'package:pool/pool.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
import 'http_request_context.dart';
import 'request_context.dart'; import 'request_context.dart';
import 'response_context.dart'; import 'response_context.dart';
import 'server.dart'; import 'server.dart';
@ -278,7 +279,7 @@ class AngelHttp {
Future<RequestContext> createRequestContext(HttpRequest request) { Future<RequestContext> createRequestContext(HttpRequest request) {
var path = request.uri.path.replaceAll(_straySlashes, ''); var path = request.uri.path.replaceAll(_straySlashes, '');
if (path.length == 0) path = '/'; if (path.length == 0) path = '/';
return RequestContext.from(request, app, path).then((req) async { return HttpRequestContextImpl.from(request, app, path).then((req) async {
if (_pool != null) req.inject(PoolResource, await _pool.request()); if (_pool != null) req.inject(PoolResource, await _pool.request());
if (app.injections.isNotEmpty) app.injections.forEach(req.inject); if (app.injections.isNotEmpty) app.injections.forEach(req.inject);
return req; return req;

View file

@ -0,0 +1,139 @@
import 'dart:async';
import 'dart:io';
import 'package:body_parser/body_parser.dart';
import 'request_context.dart';
import 'server.dart';
/// An implementation of [RequestContext] that wraps a [HttpRequest].
class HttpRequestContextImpl extends RequestContext {
ContentType _contentType;
HttpRequest _io;
String _override, _path;
@override
ContentType get contentType {
return _contentType;
}
@override
List<Cookie> get cookies {
return io.cookies;
}
@override
HttpHeaders get headers {
return io.headers;
}
@override
String get hostname {
return io.headers.value(HttpHeaders.HOST);
}
/// The underlying [HttpRequest] instance underneath this context.
HttpRequest get io => _io;
@override
String get method {
return _override ?? originalMethod;
}
@override
String get originalMethod {
return io.method;
}
@override
String get path {
return _path;
}
@override
InternetAddress get remoteAddress {
return io.connectionInfo.remoteAddress;
}
@override
HttpSession get session {
return io.session;
}
@override
Uri get uri {
return io.uri;
}
@override
bool get xhr {
return io.headers.value("X-Requested-With")?.trim()?.toLowerCase() ==
'xmlhttprequest';
}
/// Magically transforms an [HttpRequest] into a [RequestContext].
static Future<HttpRequestContextImpl> from(
HttpRequest request, Angel app, String path) async {
HttpRequestContextImpl ctx = new HttpRequestContextImpl();
String override = request.method;
if (app.allowMethodOverrides == true)
override =
request.headers.value('x-http-method-override')?.toUpperCase() ??
request.method;
ctx.app = app;
ctx._contentType = request.headers.contentType;
ctx._override = override;
/*
// Faster way to get path
List<int> _path = [];
// Go up until we reach a ?
for (int ch in request.uri.toString().codeUnits) {
if (ch != $question)
_path.add(ch);
else
break;
}
// Remove trailing slashes
int lastSlash = -1;
for (int i = _path.length - 1; i >= 0; i--) {
if (_path[i] == $slash)
lastSlash = i;
else
break;
}
if (lastSlash > -1)
ctx._path = new String.fromCharCodes(_path.take(lastSlash));
else
ctx._path = new String.fromCharCodes(_path);
*/
ctx._path = path;
ctx._io = request;
if (app.lazyParseBodies != true) {
await ctx.parse();
}
return ctx;
}
@override
Future close() {
_contentType = null;
_io = null;
_override = _path = null;
return super.close();
}
@override
Future<BodyParseResult> parseOnce() async {
return await parseBody(io,
storeOriginalBuffer: app.storeOriginalBuffer == true);
}
}

View file

@ -4,6 +4,7 @@ import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'dart:mirrors'; import 'dart:mirrors';
import 'package:body_parser/body_parser.dart'; import 'package:body_parser/body_parser.dart';
import 'package:meta/meta.dart';
import 'package:path/path.dart' as p; import 'package:path/path.dart' as p;
import 'metadata.dart'; import 'metadata.dart';
import 'response_context.dart'; import 'response_context.dart';
@ -12,13 +13,10 @@ import 'server.dart' show Angel;
part 'injection.dart'; part 'injection.dart';
/// A convenience wrapper around an incoming HTTP request. /// A convenience wrapper around an incoming HTTP request.
class RequestContext { abstract class RequestContext {
String _acceptHeaderCache, _extensionCache; String _acceptHeaderCache, _extensionCache;
bool _acceptsAllCache; bool _acceptsAllCache;
BodyParseResult _body; BodyParseResult _body;
ContentType _contentType;
HttpRequest _io;
String _override, _path;
Map _provisionalQuery; Map _provisionalQuery;
final Map properties = {}; final Map properties = {};
@ -30,13 +28,13 @@ class RequestContext {
Angel app; Angel app;
/// Any cookies sent with this request. /// Any cookies sent with this request.
List<Cookie> get cookies => io.cookies; List<Cookie> get cookies;
/// All HTTP headers sent with this request. /// All HTTP headers sent with this request.
HttpHeaders get headers => io.headers; HttpHeaders get headers;
/// The requested hostname. /// The requested hostname.
String get hostname => io.headers.value(HttpHeaders.HOST); String get hostname;
final Map _injections = {}; final Map _injections = {};
Map _injectionsCache; Map _injectionsCache;
@ -44,8 +42,9 @@ class RequestContext {
/// A [Map] of singletons injected via [inject]. *Read-only*. /// A [Map] of singletons injected via [inject]. *Read-only*.
Map get injections => _injectionsCache ??= new Map.unmodifiable(_injections); Map get injections => _injectionsCache ??= new Map.unmodifiable(_injections);
/// The underlying [HttpRequest] instance underneath this context. /// This feature does not map to other adapters (i.e. HTTP/2), so it will be removed in a future version.
HttpRequest get io => _io; @deprecated
HttpRequest get io;
/// The user's IP. /// The user's IP.
String get ip => remoteAddress.address; String get ip => remoteAddress.address;
@ -53,10 +52,10 @@ class RequestContext {
/// This request's HTTP method. /// This request's HTTP method.
/// ///
/// This may have been processed by an override. See [originalMethod] to get the real method. /// This may have been processed by an override. See [originalMethod] to get the real method.
String get method => _override ?? originalMethod; String get method;
/// The original HTTP verb sent to the server. /// The original HTTP verb sent to the server.
String get originalMethod => io.method; String get originalMethod;
StateError _unparsed(String type, String caps) => new StateError( StateError _unparsed(String type, String caps) => new StateError(
'Cannot get the $type of an unparsed request. Use lazy${caps}() instead.'); 'Cannot get the $type of an unparsed request. Use lazy${caps}() instead.');
@ -75,7 +74,7 @@ class RequestContext {
} }
/// The content type of an incoming request. /// The content type of an incoming request.
ContentType get contentType => _contentType; ContentType get contentType;
/// Any and all files sent to the server with this request. /// Any and all files sent to the server with this request.
/// ///
@ -107,7 +106,7 @@ class RequestContext {
Map params = {}; Map params = {};
/// The requested path. /// The requested path.
String get path => _path; String get path;
/// The parsed request query string. /// The parsed request query string.
/// ///
@ -123,80 +122,22 @@ class RequestContext {
} }
/// The remote address requesting this resource. /// The remote address requesting this resource.
InternetAddress get remoteAddress => io.connectionInfo.remoteAddress; InternetAddress get remoteAddress;
/// The user's HTTP session. /// The user's HTTP session.
HttpSession get session => io.session; HttpSession get session;
/// The [Uri] instance representing the path this request is responding to. /// The [Uri] instance representing the path this request is responding to.
Uri get uri => io.uri; Uri get uri;
/// Is this an **XMLHttpRequest**? /// Is this an **XMLHttpRequest**?
bool get xhr => bool get xhr;
io.headers.value("X-Requested-With")?.trim()?.toLowerCase() ==
'xmlhttprequest';
/// Returns the file extension of the requested path, if any. /// Returns the file extension of the requested path, if any.
/// ///
/// Includes the leading `.`, if there is one. /// Includes the leading `.`, if there is one.
String get extension => _extensionCache ??= p.extension(uri.path); String get extension => _extensionCache ??= p.extension(uri.path);
/// Magically transforms an [HttpRequest] into a [RequestContext].
static Future<RequestContext> from(
HttpRequest request, Angel app, String path) async {
RequestContext ctx = new RequestContext();
String override = request.method;
if (app.allowMethodOverrides == true)
override =
request.headers.value('x-http-method-override')?.toUpperCase() ??
request.method;
ctx.app = app;
ctx._contentType = request.headers.contentType;
ctx._override = override;
/*
// Faster way to get path
List<int> _path = [];
// Go up until we reach a ?
for (int ch in request.uri.toString().codeUnits) {
if (ch != $question)
_path.add(ch);
else
break;
}
// Remove trailing slashes
int lastSlash = -1;
for (int i = _path.length - 1; i >= 0; i--) {
if (_path[i] == $slash)
lastSlash = i;
else
break;
}
if (lastSlash > -1)
ctx._path = new String.fromCharCodes(_path.take(lastSlash));
else
ctx._path = new String.fromCharCodes(_path);
*/
ctx._path = path;
ctx._io = request;
if (app.lazyParseBodies != true) {
ctx._body = (await parseBody(request,
storeOriginalBuffer: app.storeOriginalBuffer == true)) ??
{};
}
return ctx;
}
/// Grabs an object by key or type from [params], [_injections], or /// Grabs an object by key or type from [params], [_injections], or
/// [app].container. Use this to perform dependency injection /// [app].container. Use this to perform dependency injection
/// within a service hook. /// within a service hook.
@ -248,6 +189,7 @@ class RequestContext {
? contentType.mimeType ? contentType.mimeType
: contentType?.toString(); : contentType?.toString();
// Change to assert
if (contentTypeString == null) if (contentTypeString == null)
throw new ArgumentError( throw new ArgumentError(
'RequestContext.accepts expects the `contentType` parameter to NOT be null.'); 'RequestContext.accepts expects the `contentType` parameter to NOT be null.');
@ -293,18 +235,18 @@ class RequestContext {
return _body; return _body;
else else
_provisionalQuery = null; _provisionalQuery = null;
return _body = await parseBody(io, return _body = await parseOnce();
storeOriginalBuffer: app.storeOriginalBuffer == true);
} }
/// Override this method to one-time parse an incoming request.
@virtual
Future<BodyParseResult> parseOnce();
/// Disposes of all resources. /// Disposes of all resources.
Future close() async { Future close() async {
_body = null; _body = null;
_acceptsAllCache = null; _acceptsAllCache = null;
_acceptHeaderCache = null; _acceptHeaderCache = null;
_io = null;
_override = _path = null;
_contentType = null;
_provisionalQuery?.clear(); _provisionalQuery?.clear();
properties.clear(); properties.clear();
_injections.clear(); _injections.clear();