+4
This commit is contained in:
parent
3fcb195d8c
commit
e3e25453b6
12 changed files with 344 additions and 313 deletions
|
@ -2,10 +2,18 @@
|
|||
<project version="4">
|
||||
<component name="ChangeListManager">
|
||||
<list default="true" id="7b89ff1e-1260-4dcf-9c3d-345de0471ea1" name="Default" comment="">
|
||||
<change type="NEW" beforePath="" afterPath="$PROJECT_DIR$/lib/src/http/injection.dart" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/CHANGELOG.md" afterPath="$PROJECT_DIR$/CHANGELOG.md" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/angel_base.dart" afterPath="$PROJECT_DIR$/lib/src/http/angel_base.dart" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/controller.dart" afterPath="$PROJECT_DIR$/lib/src/http/controller.dart" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/request_context.dart" afterPath="$PROJECT_DIR$/lib/src/http/request_context.dart" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/routable.dart" afterPath="$PROJECT_DIR$/lib/src/http/routable.dart" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/lib/src/http/server.dart" afterPath="$PROJECT_DIR$/lib/src/http/server.dart" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/pubspec.yaml" afterPath="$PROJECT_DIR$/pubspec.yaml" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/test/precontained_test.dart" afterPath="$PROJECT_DIR$/test/precontained_test.dart" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/test/server_test.dart" afterPath="$PROJECT_DIR$/test/server_test.dart" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/test/util_test.dart" afterPath="$PROJECT_DIR$/test/util_test.dart" />
|
||||
</list>
|
||||
<ignored path="$PROJECT_DIR$/.tmp/" />
|
||||
<ignored path="$PROJECT_DIR$/temp/" />
|
||||
|
@ -28,47 +36,50 @@
|
|||
</component>
|
||||
<component name="FileEditorManager">
|
||||
<leaf SIDE_TABS_SIZE_LIMIT_KEY="375">
|
||||
<file leaf-file-name="pubspec.yaml" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/pubspec.yaml">
|
||||
<file leaf-file-name="request_context.dart" pinned="false" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/request_context.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="15">
|
||||
<caret line="1" column="22" lean-forward="false" selection-start-line="1" selection-start-column="22" selection-end-line="1" selection-end-column="22" />
|
||||
<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="197">
|
||||
<caret line="84" column="18" lean-forward="true" selection-start-line="84" selection-start-column="18" selection-end-line="84" selection-end-column="18" />
|
||||
<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="263">
|
||||
<caret line="528" column="18" lean-forward="false" selection-start-line="528" selection-start-column="18" selection-end-line="528" selection-end-column="18" />
|
||||
<state relative-caret-position="249">
|
||||
<caret line="43" column="63" lean-forward="false" selection-start-line="43" selection-start-column="63" selection-end-line="43" selection-end-column="63" />
|
||||
<folding>
|
||||
<element signature="e#38#58#0" expanded="true" />
|
||||
<element signature="e#47#67#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="CHANGELOG.md" pinned="false" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/CHANGELOG.md">
|
||||
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
|
||||
<state split_layout="SPLIT">
|
||||
<first_editor relative-caret-position="30">
|
||||
<caret line="2" column="72" lean-forward="false" selection-start-line="2" selection-start-column="72" selection-end-line="2" selection-end-column="72" />
|
||||
<folding />
|
||||
</first_editor>
|
||||
<second_editor />
|
||||
<file leaf-file-name="controller.dart" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/controller.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-786">
|
||||
<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#42#62#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="routable.dart" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/routable.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-1166">
|
||||
<caret line="13" column="0" lean-forward="true" selection-start-line="13" selection-start-column="0" selection-end-line="13" selection-end-column="0" />
|
||||
<folding>
|
||||
<element signature="e#40#60#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="service.dart" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/service.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#39#59#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
|
@ -76,35 +87,13 @@
|
|||
<file leaf-file-name="response_context.dart" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/response_context.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-618">
|
||||
<state relative-caret-position="6345">
|
||||
<caret line="432" column="10" lean-forward="false" selection-start-line="432" selection-start-column="10" selection-end-line="432" selection-end-column="10" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="main.dart" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/performance/hello/main.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="165">
|
||||
<caret line="14" column="20" lean-forward="false" selection-start-line="14" selection-start-column="20" selection-end-line="14" selection-end-column="20" />
|
||||
<folding>
|
||||
<element signature="e#75#92#0" expanded="true" />
|
||||
</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="360">
|
||||
<caret line="29" column="0" lean-forward="false" selection-start-line="29" selection-start-column="0" selection-end-line="32" selection-end-column="6" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
</leaf>
|
||||
</component>
|
||||
<component name="FileTemplateManagerImpl">
|
||||
|
@ -116,10 +105,6 @@
|
|||
</component>
|
||||
<component name="FindInProjectRecents">
|
||||
<findStrings>
|
||||
<find>handleContaine</find>
|
||||
<find>_handlerC</find>
|
||||
<find>angel(</find>
|
||||
<find>depre</find>
|
||||
<find>deprecated</find>
|
||||
<find>close!</find>
|
||||
<find>close(</find>
|
||||
|
@ -146,6 +131,10 @@
|
|||
<find>handleRequ</find>
|
||||
<find>aNGEL(</find>
|
||||
<find>Routa</find>
|
||||
<find>properties</find>
|
||||
<find>noSuchM</find>
|
||||
<find>preInj</find>
|
||||
<find>REQU</find>
|
||||
</findStrings>
|
||||
<replaceStrings>
|
||||
<replace>_isClosed</replace>
|
||||
|
@ -167,6 +156,7 @@
|
|||
<dir>C:\Users\thosa\Source\Angel\framework\lib\src\http</dir>
|
||||
<dir>C:\Users\thosa\Source\Angel\framework\test</dir>
|
||||
<dir>$PROJECT_DIR$/lib</dir>
|
||||
<dir>$PROJECT_DIR$/lib/src</dir>
|
||||
</dirStrings>
|
||||
</component>
|
||||
<component name="Git.Settings">
|
||||
|
@ -180,7 +170,6 @@
|
|||
<component name="IdeDocumentHistory">
|
||||
<option name="CHANGED_PATHS">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/lib/src/http/memory_service.dart" />
|
||||
<option value="$PROJECT_DIR$/test/precontained_test.dart" />
|
||||
<option value="$PROJECT_DIR$/test/general_test.dart" />
|
||||
<option value="$PROJECT_DIR$/README.md" />
|
||||
|
@ -196,7 +185,6 @@
|
|||
<option value="$PROJECT_DIR$/lib/src/safe_stream_controller.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/extensible.dart" />
|
||||
<option value="$PROJECT_DIR$/test/util_test.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/angel_base.dart" />
|
||||
<option value="$PROJECT_DIR$/performance/hello/raw.dart" />
|
||||
<option value="$PROJECT_DIR$/performance/hello/angel.md" />
|
||||
<option value="$PROJECT_DIR$/performance/hello/raw.md" />
|
||||
|
@ -205,13 +193,11 @@
|
|||
<option value="$PROJECT_DIR$/test/routing_test.dart" />
|
||||
<option value="$PROJECT_DIR$/tool/travis.sh" />
|
||||
<option value="$PROJECT_DIR$/test/repeat_request_test.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/controller.dart" />
|
||||
<option value="$PROJECT_DIR$/test/all.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/metadata.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/fatal_error.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/angel_http_exception.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/angel_framework.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/request_context.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/hooks.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/base_middleware.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/fast_name_from_symbol.dart" />
|
||||
|
@ -227,10 +213,14 @@
|
|||
<option value="$PROJECT_DIR$/test/streaming_test.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/routable.dart" />
|
||||
<option value="$PROJECT_DIR$/performance/hello/main.dart" />
|
||||
<option value="$PROJECT_DIR$/pubspec.yaml" />
|
||||
<option value="$PROJECT_DIR$/test/encoders_buffer_test.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/angel_base.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/controller.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/injection.dart" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/server.dart" />
|
||||
<option value="$PROJECT_DIR$/CHANGELOG.md" />
|
||||
<option value="$PROJECT_DIR$/pubspec.yaml" />
|
||||
<option value="$PROJECT_DIR$/lib/src/http/request_context.dart" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
|
@ -265,8 +255,6 @@
|
|||
</navigator>
|
||||
<panes>
|
||||
<pane id="Scratches" />
|
||||
<pane id="AndroidView" />
|
||||
<pane id="PackagesPane" />
|
||||
<pane id="Scope">
|
||||
<subPane subId="Project Files">
|
||||
<expand>
|
||||
|
@ -311,7 +299,9 @@
|
|||
<select />
|
||||
</subPane>
|
||||
</pane>
|
||||
<pane id="PackagesPane" />
|
||||
<pane id="ProjectPane" />
|
||||
<pane id="AndroidView" />
|
||||
</panes>
|
||||
</component>
|
||||
<component name="PropertiesComponent">
|
||||
|
@ -583,7 +573,8 @@
|
|||
<workItem from="1506050384140" duration="5198000" />
|
||||
<workItem from="1506088028663" duration="997000" />
|
||||
<workItem from="1506090042437" duration="1751000" />
|
||||
<workItem from="1506275395906" duration="390000" />
|
||||
<workItem from="1506275395906" duration="424000" />
|
||||
<workItem from="1506281553143" duration="624000" />
|
||||
</task>
|
||||
<task id="LOCAL-00001" summary="Re-designed exception">
|
||||
<created>1481237183504</created>
|
||||
|
@ -837,13 +828,17 @@
|
|||
<option name="project" value="LOCAL" />
|
||||
<updated>1506092186428</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="37" />
|
||||
<task id="LOCAL-00037" summary="+3">
|
||||
<created>1506275793202</created>
|
||||
<option name="number" value="00037" />
|
||||
<option name="presentableId" value="LOCAL-00037" />
|
||||
<option name="project" value="LOCAL" />
|
||||
<updated>1506275793202</updated>
|
||||
</task>
|
||||
<option name="localTasksCounter" value="38" />
|
||||
<servers />
|
||||
</component>
|
||||
<component name="TestHistory">
|
||||
<history-entry file="All_Tests - 2017.09.24 at 13h 52m 04s.xml">
|
||||
<configuration name="All Tests" configurationId="DartTestRunConfigurationType" />
|
||||
</history-entry>
|
||||
<history-entry file="All_Tests - 2017.09.24 at 13h 52m 57s.xml">
|
||||
<configuration name="All Tests" configurationId="DartTestRunConfigurationType" />
|
||||
</history-entry>
|
||||
|
@ -859,6 +854,9 @@
|
|||
<history-entry file="All_Tests - 2017.09.24 at 13h 55m 47s.xml">
|
||||
<configuration name="All Tests" configurationId="DartTestRunConfigurationType" />
|
||||
</history-entry>
|
||||
<history-entry file="All_Tests - 2017.09.24 at 15h 41m 37s.xml">
|
||||
<configuration name="All Tests" configurationId="DartTestRunConfigurationType" />
|
||||
</history-entry>
|
||||
<history-entry file="only_uses_one_encoder_in_encoders_buffer_test_dart - 2017.09.24 at 13h 55m 12s.xml">
|
||||
<configuration name="only uses one encoder in encoders_buffer_test.dart" configurationId="DartTestRunConfigurationType" />
|
||||
</history-entry>
|
||||
|
@ -873,7 +871,7 @@
|
|||
</history-entry>
|
||||
</component>
|
||||
<component name="TimeTrackingManager">
|
||||
<option name="totallyTimeSpent" value="56170000" />
|
||||
<option name="totallyTimeSpent" value="56828000" />
|
||||
</component>
|
||||
<component name="TodoView">
|
||||
<todo-panel id="selected-file">
|
||||
|
@ -896,14 +894,15 @@
|
|||
<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="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.34188035" sideWeight="0.5035524" order="7" side_tool="true" content_ui="tabs" />
|
||||
<window_info id="Maven Projects" 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="Dart Analysis" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32621083" 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.34188035" sideWeight="0.4964476" order="2" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Dart Analysis" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.37154695" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Run" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.34188035" sideWeight="0.4964476" order="2" 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="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.56837606" 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.48246676" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Capture Tool" 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="Designer" 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="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.26820603" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Database" 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="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="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="UI Designer" 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" />
|
||||
|
@ -920,7 +919,6 @@
|
|||
<window_info id="DB Browser" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32998413" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Coverage" 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="true" 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" />
|
||||
</layout>
|
||||
</component>
|
||||
<component name="TypeScriptGeneratedFilesManager">
|
||||
|
@ -930,7 +928,6 @@
|
|||
<option name="myLimit" value="2678400000" />
|
||||
</component>
|
||||
<component name="VcsManagerConfiguration">
|
||||
<MESSAGE value="+3" />
|
||||
<MESSAGE value="Coverage start..." />
|
||||
<MESSAGE value="1.0.3" />
|
||||
<MESSAGE value="+1" />
|
||||
|
@ -955,14 +952,14 @@
|
|||
<MESSAGE value="Logging support" />
|
||||
<MESSAGE value="Updated `use`" />
|
||||
<MESSAGE value="+2" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="+2" />
|
||||
<MESSAGE value="+3" />
|
||||
<option name="LAST_COMMIT_MESSAGE" value="+3" />
|
||||
</component>
|
||||
<component name="XDebuggerManager">
|
||||
<breakpoint-manager />
|
||||
<watches-manager />
|
||||
</component>
|
||||
<component name="editorHistoryManager">
|
||||
<entry file="file://$USER_HOME$/AppData/Roaming/Pub/Cache/hosted/pub.dartlang.org/angel_route-1.0.5/lib/src/extensible.dart" />
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/extensible.dart" />
|
||||
<entry file="file://$PROJECT_DIR$/test/precontained_test.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
|
@ -1100,13 +1097,6 @@
|
|||
</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="2640">
|
||||
<caret line="181" column="46" lean-forward="false" selection-start-line="181" selection-start-column="46" selection-end-line="181" selection-end-column="46" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/angel_http_exception.dart" />
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/map_service.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
|
@ -1115,20 +1105,6 @@
|
|||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/service.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="60">
|
||||
<caret line="4" column="64" lean-forward="false" selection-start-line="4" selection-start-column="64" selection-end-line="4" selection-end-column="64" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/angel_base.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-133">
|
||||
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/fatal_error.dart" />
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/hooked_service.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
|
@ -1186,13 +1162,6 @@
|
|||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/controller.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="527">
|
||||
<caret line="229" column="26" lean-forward="false" selection-start-line="229" selection-start-column="26" selection-end-line="229" selection-end-column="26" />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/test/hooked_test.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="360">
|
||||
|
@ -1205,7 +1174,6 @@
|
|||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="271">
|
||||
<caret line="361" column="0" lean-forward="true" selection-start-line="361" selection-start-column="0" selection-end-line="361" selection-end-column="0" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
|
@ -1223,20 +1191,12 @@
|
|||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/routable.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="299">
|
||||
<caret line="97" column="6" lean-forward="false" selection-start-line="97" selection-start-column="6" selection-end-line="97" selection-end-column="6" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/performance/hello/main.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="165">
|
||||
<caret line="14" column="20" lean-forward="false" selection-start-line="14" selection-start-column="20" selection-end-line="14" selection-end-column="20" />
|
||||
<folding>
|
||||
<element signature="e#75#92#0" expanded="true" />
|
||||
<element signature="e#75#92#0" expanded="false" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
|
@ -1245,18 +1205,76 @@
|
|||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="225">
|
||||
<caret line="57" column="12" lean-forward="false" selection-start-line="57" selection-start-column="12" selection-end-line="57" selection-end-column="12" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/response_context.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-618">
|
||||
<state relative-caret-position="6345">
|
||||
<caret line="432" column="10" lean-forward="false" selection-start-line="432" selection-start-column="10" selection-end-line="432" selection-end-column="10" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/service.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#39#59#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/angel_base.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="195">
|
||||
<caret line="16" column="0" lean-forward="true" selection-start-line="16" selection-start-column="0" selection-end-line="16" selection-end-column="0" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/controller.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-786">
|
||||
<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#42#62#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/CHANGELOG.md">
|
||||
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
|
||||
<state split_layout="SPLIT">
|
||||
<first_editor relative-caret-position="30">
|
||||
<caret line="2" column="57" lean-forward="false" selection-start-line="2" selection-start-column="57" selection-end-line="2" selection-end-column="57" />
|
||||
<folding />
|
||||
</first_editor>
|
||||
<second_editor />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/injection.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="222">
|
||||
<caret line="59" column="41" lean-forward="true" selection-start-line="59" selection-start-column="41" selection-end-line="59" selection-end-column="41" />
|
||||
<folding>
|
||||
<element signature="e#4016#4950#0" expanded="false" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/routable.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="-1166">
|
||||
<caret line="13" column="0" lean-forward="true" selection-start-line="13" selection-start-column="0" selection-end-line="13" selection-end-column="0" />
|
||||
<folding>
|
||||
<element signature="e#40#60#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/pubspec.yaml">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="15">
|
||||
|
@ -1267,30 +1285,29 @@
|
|||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/test/encoders_buffer_test.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="197">
|
||||
<caret line="84" column="18" lean-forward="true" selection-start-line="84" selection-start-column="18" selection-end-line="84" selection-end-column="18" />
|
||||
<state relative-caret-position="903">
|
||||
<caret line="84" column="18" lean-forward="false" selection-start-line="84" selection-start-column="18" selection-end-line="84" selection-end-column="18" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/server.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="263">
|
||||
<caret line="528" column="18" lean-forward="false" selection-start-line="528" selection-start-column="18" selection-end-line="528" selection-end-column="18" />
|
||||
<state relative-caret-position="8085">
|
||||
<caret line="539" column="8" lean-forward="false" selection-start-line="539" selection-start-column="8" selection-end-line="539" selection-end-column="8" />
|
||||
<folding>
|
||||
<element signature="e#38#58#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/CHANGELOG.md">
|
||||
<provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]">
|
||||
<state split_layout="SPLIT">
|
||||
<first_editor relative-caret-position="30">
|
||||
<caret line="2" column="72" lean-forward="false" selection-start-line="2" selection-start-column="72" selection-end-line="2" selection-end-column="72" />
|
||||
<folding />
|
||||
</first_editor>
|
||||
<second_editor />
|
||||
<entry file="file://$PROJECT_DIR$/lib/src/http/request_context.dart">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="249">
|
||||
<caret line="43" column="63" lean-forward="false" selection-start-line="43" selection-start-column="63" selection-end-line="43" selection-end-column="63" />
|
||||
<folding>
|
||||
<element signature="e#47#67#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
# 1.1.0-alpha+4
|
||||
* Made `injections` in `RequestContext` private.
|
||||
* Renamed `properties` in `AngelBase` to `configuration`.
|
||||
|
||||
# 1.1.0-alpha+3
|
||||
* Fixed a bug where `encoders` would cause a malformed response to be sent.
|
||||
* Fixed a bug where `encoders` would not always use the correct encoder.
|
||||
|
|
|
@ -13,7 +13,7 @@ typedef Future<String> ViewGenerator(String path, [Map data]);
|
|||
class AngelBase extends Routable {
|
||||
Container _container = new Container();
|
||||
|
||||
final Map properties = {};
|
||||
final Map configuration = {};
|
||||
|
||||
/// When set to true, the request body will not be parsed
|
||||
/// automatically. You can call `req.parse()` manually,
|
||||
|
@ -33,18 +33,18 @@ class AngelBase extends Routable {
|
|||
ViewGenerator viewGenerator = (String view, [Map data]) async =>
|
||||
"No view engine has been configured yet.";
|
||||
|
||||
operator [](key) => properties[key];
|
||||
operator []=(key, value) => properties[key] = value;
|
||||
operator [](key) => configuration[key];
|
||||
operator []=(key, value) => configuration[key] = value;
|
||||
|
||||
noSuchMethod(Invocation invocation) {
|
||||
if (invocation.memberName != null) {
|
||||
String name = fastNameFromSymbol(invocation.memberName);
|
||||
|
||||
if (invocation.isMethod) {
|
||||
return Function.apply(properties[name], invocation.positionalArguments,
|
||||
return Function.apply(configuration[name], invocation.positionalArguments,
|
||||
invocation.namedArguments);
|
||||
} else if (invocation.isGetter) {
|
||||
return properties[name];
|
||||
return configuration[name];
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -8,34 +8,7 @@ import 'metadata.dart';
|
|||
import 'request_context.dart';
|
||||
import 'response_context.dart';
|
||||
import 'routable.dart';
|
||||
import 'server.dart' show Angel, preInject;
|
||||
|
||||
const List<Type> _primitiveTypes = const [String, int, num, double, Null];
|
||||
|
||||
/// Contains a list of the data required for a DI-enabled method to run.
|
||||
///
|
||||
/// This improves performance by removing the necessity to reflect a method
|
||||
/// every time it is requested.
|
||||
///
|
||||
/// Regular request handlers can also skip DI entirely, lowering response time
|
||||
/// and memory use.
|
||||
class InjectionRequest {
|
||||
/// Optional, typed data that can be passed to a DI-enabled method.
|
||||
final Map<String, Type> named;
|
||||
|
||||
/// A list of the arguments required for a DI-enabled method to run.
|
||||
final List required;
|
||||
|
||||
/// A list of the arguments that can be null in a DI-enabled method.
|
||||
final List<String> optional;
|
||||
|
||||
const InjectionRequest.constant({this.named, this.required, this.optional});
|
||||
|
||||
InjectionRequest()
|
||||
: named = {},
|
||||
required = [],
|
||||
optional = [];
|
||||
}
|
||||
import 'server.dart' show Angel;
|
||||
|
||||
/// Supports grouping routes with shared functionality.
|
||||
class Controller {
|
||||
|
@ -144,90 +117,3 @@ class Controller {
|
|||
.map((m) => m.reflectee)
|
||||
.firstWhere((r) => r is Expose, orElse: () => null);
|
||||
}
|
||||
|
||||
/// Shortcut for calling [preInject], and then [handleContained].
|
||||
///
|
||||
/// Use this to instantly create a request handler for a DI-enabled method.
|
||||
RequestHandler createDynamicHandler(handler,
|
||||
{Iterable<String> optional: const []}) {
|
||||
var injection = preInject(handler);
|
||||
injection.optional.addAll(optional ?? []);
|
||||
return handleContained(handler, injection);
|
||||
}
|
||||
|
||||
/// Handles a request with a DI-enabled handler.
|
||||
RequestHandler handleContained(handler, InjectionRequest injection) {
|
||||
return (RequestContext req, ResponseContext res) async {
|
||||
List args = [];
|
||||
|
||||
void inject(requirement) {
|
||||
var propFromApp;
|
||||
|
||||
if (requirement == RequestContext) {
|
||||
args.add(req);
|
||||
} else if (requirement == ResponseContext) {
|
||||
args.add(res);
|
||||
} else if (requirement is String) {
|
||||
if (req.params.containsKey(requirement)) {
|
||||
args.add(req.params[requirement]);
|
||||
} else if (req.injections.containsKey(requirement))
|
||||
args.add(req.injections[requirement]);
|
||||
else if (req.properties.containsKey(requirement))
|
||||
args.add(req.properties[requirement]);
|
||||
else if ((propFromApp = req.app.findProperty(requirement)) != null)
|
||||
args.add(propFromApp);
|
||||
else if (injection.optional.contains(requirement))
|
||||
args.add(null);
|
||||
else {
|
||||
throw new ArgumentError(
|
||||
"Cannot resolve parameter '$requirement' within handler.");
|
||||
}
|
||||
} else if (requirement is List &&
|
||||
requirement.length == 2 &&
|
||||
requirement.first is String &&
|
||||
requirement.last is Type) {
|
||||
String key = requirement.first;
|
||||
Type type = requirement.last;
|
||||
if (req.params.containsKey(key) ||
|
||||
req.injections.containsKey(key) ||
|
||||
req.properties.containsKey(key) ||
|
||||
req.app.properties.containsKey(key) ||
|
||||
_primitiveTypes.contains(type)) {
|
||||
inject(key);
|
||||
} else
|
||||
inject(type);
|
||||
} else if (requirement is Type && requirement != dynamic) {
|
||||
if (req.injections.containsKey(requirement))
|
||||
args.add(req.injections[requirement]);
|
||||
else
|
||||
args.add(req.app.container.make(requirement));
|
||||
} else {
|
||||
throw new ArgumentError(
|
||||
'$requirement cannot be injected into a request handler.');
|
||||
}
|
||||
}
|
||||
|
||||
Map<Symbol, dynamic> named = {};
|
||||
injection.required.forEach(inject);
|
||||
|
||||
injection.named.forEach((k, v) {
|
||||
var name = new Symbol(k);
|
||||
if (req.params.containsKey(k))
|
||||
named[name] = v;
|
||||
else if (req.injections.containsKey(k))
|
||||
named[name] = v;
|
||||
else if (req.injections.containsKey(v) && v != dynamic)
|
||||
named[name] = v;
|
||||
else {
|
||||
try {
|
||||
named[name] = req.app.container.make(v);
|
||||
} catch (e) {
|
||||
named[name] = null;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var result = Function.apply(handler, args, named);
|
||||
return result is Future ? await result : result;
|
||||
};
|
||||
}
|
||||
|
|
150
lib/src/http/injection.dart
Normal file
150
lib/src/http/injection.dart
Normal file
|
@ -0,0 +1,150 @@
|
|||
part of angel_framework.http.request_context;
|
||||
|
||||
const List<Type> _primitiveTypes = const [String, int, num, double, Null];
|
||||
|
||||
/// Shortcut for calling [preInject], and then [handleContained].
|
||||
///
|
||||
/// Use this to instantly create a request handler for a DI-enabled method.
|
||||
RequestHandler createDynamicHandler(handler,
|
||||
{Iterable<String> optional: const []}) {
|
||||
var injection = preInject(handler);
|
||||
injection.optional.addAll(optional ?? []);
|
||||
return handleContained(handler, injection);
|
||||
}
|
||||
|
||||
/// Handles a request with a DI-enabled handler.
|
||||
RequestHandler handleContained(handler, InjectionRequest injection) {
|
||||
return (RequestContext req, ResponseContext res) async {
|
||||
List args = [];
|
||||
|
||||
void inject(requirement) {
|
||||
var propFromApp;
|
||||
|
||||
if (requirement == RequestContext) {
|
||||
args.add(req);
|
||||
} else if (requirement == ResponseContext) {
|
||||
args.add(res);
|
||||
} else if (requirement is String) {
|
||||
if (req.params.containsKey(requirement)) {
|
||||
args.add(req.params[requirement]);
|
||||
} else if (req._injections.containsKey(requirement))
|
||||
args.add(req._injections[requirement]);
|
||||
else if (req.properties.containsKey(requirement))
|
||||
args.add(req.properties[requirement]);
|
||||
else if ((propFromApp = req.app.findProperty(requirement)) != null)
|
||||
args.add(propFromApp);
|
||||
else if (injection.optional.contains(requirement))
|
||||
args.add(null);
|
||||
else {
|
||||
throw new ArgumentError(
|
||||
"Cannot resolve parameter '$requirement' within handler.");
|
||||
}
|
||||
} else if (requirement is List &&
|
||||
requirement.length == 2 &&
|
||||
requirement.first is String &&
|
||||
requirement.last is Type) {
|
||||
String key = requirement.first;
|
||||
Type type = requirement.last;
|
||||
if (req.params.containsKey(key) ||
|
||||
req._injections.containsKey(key) ||
|
||||
req.properties.containsKey(key) ||
|
||||
req.app.configuration.containsKey(key) ||
|
||||
_primitiveTypes.contains(type)) {
|
||||
inject(key);
|
||||
} else
|
||||
inject(type);
|
||||
} else if (requirement is Type && requirement != dynamic) {
|
||||
if (req._injections.containsKey(requirement))
|
||||
args.add(req._injections[requirement]);
|
||||
else
|
||||
args.add(req.app.container.make(requirement));
|
||||
} else {
|
||||
throw new ArgumentError(
|
||||
'$requirement cannot be injected into a request handler.');
|
||||
}
|
||||
}
|
||||
|
||||
Map<Symbol, dynamic> named = {};
|
||||
injection.required.forEach(inject);
|
||||
|
||||
injection.named.forEach((k, v) {
|
||||
var name = new Symbol(k);
|
||||
if (req.params.containsKey(k))
|
||||
named[name] = v;
|
||||
else if (req._injections.containsKey(k))
|
||||
named[name] = v;
|
||||
else if (req._injections.containsKey(v) && v != dynamic)
|
||||
named[name] = v;
|
||||
else {
|
||||
try {
|
||||
named[name] = req.app.container.make(v);
|
||||
} catch (e) {
|
||||
named[name] = null;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
var result = Function.apply(handler, args, named);
|
||||
return result is Future ? await result : result;
|
||||
};
|
||||
}
|
||||
|
||||
/// Contains a list of the data required for a DI-enabled method to run.
|
||||
///
|
||||
/// This improves performance by removing the necessity to reflect a method
|
||||
/// every time it is requested.
|
||||
///
|
||||
/// Regular request handlers can also skip DI entirely, lowering response time
|
||||
/// and memory use.
|
||||
class InjectionRequest {
|
||||
/// Optional, typed data that can be passed to a DI-enabled method.
|
||||
final Map<String, Type> named;
|
||||
|
||||
/// A list of the arguments required for a DI-enabled method to run.
|
||||
final List required;
|
||||
|
||||
/// A list of the arguments that can be null in a DI-enabled method.
|
||||
final List<String> optional;
|
||||
|
||||
const InjectionRequest.constant({this.named, this.required, this.optional});
|
||||
|
||||
InjectionRequest()
|
||||
: named = {},
|
||||
required = [],
|
||||
optional = [];
|
||||
}
|
||||
|
||||
/// Predetermines what needs to be injected for a handler to run.
|
||||
InjectionRequest preInject(Function handler) {
|
||||
var injection = new InjectionRequest();
|
||||
|
||||
ClosureMirror closureMirror = reflect(handler);
|
||||
|
||||
if (closureMirror.function.parameters.isEmpty) return injection;
|
||||
|
||||
// Load parameters
|
||||
for (var parameter in closureMirror.function.parameters) {
|
||||
var name = MirrorSystem.getName(parameter.simpleName);
|
||||
var type = parameter.type.reflectedType;
|
||||
|
||||
if (!parameter.isNamed) {
|
||||
if (parameter.isOptional) injection.optional.add(name);
|
||||
|
||||
if (type == RequestContext || type == ResponseContext) {
|
||||
injection.required.add(type);
|
||||
} else if (name == 'req') {
|
||||
injection.required.add(RequestContext);
|
||||
} else if (name == 'res') {
|
||||
injection.required.add(ResponseContext);
|
||||
} else if (type == dynamic) {
|
||||
injection.required.add(name);
|
||||
} else {
|
||||
injection.required.add([name, type]);
|
||||
}
|
||||
} else {
|
||||
injection.named[name] = type;
|
||||
}
|
||||
}
|
||||
|
||||
return injection;
|
||||
}
|
|
@ -2,10 +2,14 @@ library angel_framework.http.request_context;
|
|||
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'dart:mirrors';
|
||||
import 'package:body_parser/body_parser.dart';
|
||||
import 'package:charcode/charcode.dart';
|
||||
import '../fast_name_from_symbol.dart';
|
||||
import 'response_context.dart';
|
||||
import 'routable.dart';
|
||||
import 'server.dart' show Angel;
|
||||
part 'injection.dart';
|
||||
|
||||
/// A convenience wrapper around an incoming HTTP request.
|
||||
@proxy
|
||||
|
@ -35,8 +39,10 @@ class RequestContext {
|
|||
/// The requested hostname.
|
||||
String get hostname => io.headers.value(HttpHeaders.HOST);
|
||||
|
||||
/// A [Map] of values that should be DI'd.
|
||||
final Map injections = {};
|
||||
final Map _injections = {};
|
||||
|
||||
/// A [Map] of singletons injected via [inject]. *Read-only*.
|
||||
Map get injections => new Map.unmodifiable(_injections);
|
||||
|
||||
/// The underlying [HttpRequest] instance underneath this context.
|
||||
HttpRequest get io => _io;
|
||||
|
@ -181,14 +187,14 @@ class RequestContext {
|
|||
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
|
||||
/// within a service hook.
|
||||
T grab<T>(key) {
|
||||
if (params.containsKey(key))
|
||||
return params[key];
|
||||
else if (injections.containsKey(key))
|
||||
return injections[key];
|
||||
else if (_injections.containsKey(key))
|
||||
return _injections[key];
|
||||
else if (properties.containsKey(key))
|
||||
return properties[key];
|
||||
else {
|
||||
|
@ -206,9 +212,9 @@ class RequestContext {
|
|||
}
|
||||
}
|
||||
|
||||
/// Shorthand to add to [injections].
|
||||
/// Shorthand to add to [_injections].
|
||||
void inject(type, value) {
|
||||
injections[type] = value;
|
||||
_injections[type] = value;
|
||||
}
|
||||
|
||||
/// Returns `true` if the client's `Accept` header indicates that the given [contentType] is considered a valid response.
|
||||
|
|
|
@ -37,7 +37,7 @@ RequestMiddleware waterfall(List handlers) {
|
|||
class Routable extends Router {
|
||||
final Map<Pattern, Controller> _controllers = {};
|
||||
final Map<Pattern, Service> _services = {};
|
||||
final Map properties = {};
|
||||
final Map configuration = {};
|
||||
|
||||
Routable({bool debug: false}) : super(debug: debug);
|
||||
|
||||
|
@ -134,9 +134,9 @@ class Routable extends Router {
|
|||
|
||||
// Also copy properties...
|
||||
if (router is Routable) {
|
||||
Map copiedProperties = new Map.from(router.properties);
|
||||
Map copiedProperties = new Map.from(router.configuration);
|
||||
for (String propertyName in copiedProperties.keys) {
|
||||
properties.putIfAbsent("$middlewarePrefix$propertyName",
|
||||
configuration.putIfAbsent("$middlewarePrefix$propertyName",
|
||||
() => copiedMiddleware[propertyName]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,6 @@ library angel_framework.http.server;
|
|||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
import 'dart:mirrors';
|
||||
import 'package:angel_http_exception/angel_http_exception.dart';
|
||||
import 'package:angel_route/angel_route.dart' hide Extensible;
|
||||
import 'package:charcode/charcode.dart';
|
||||
|
@ -290,7 +289,8 @@ class Angel extends AngelBase {
|
|||
|
||||
Future<RequestContext> createRequestContext(HttpRequest request) {
|
||||
return RequestContext.from(request, this).then((req) {
|
||||
return req..injections.addAll(_injections ?? {});
|
||||
_injections.forEach(req.inject);
|
||||
return req;
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -309,7 +309,7 @@ class Angel extends AngelBase {
|
|||
|
||||
/// Attempts to find a property by the given name within this application.
|
||||
findProperty(key) {
|
||||
if (properties.containsKey(key)) return properties[key];
|
||||
if (configuration.containsKey(key)) return configuration[key];
|
||||
return parent != null ? parent.findProperty(key) : null;
|
||||
}
|
||||
|
||||
|
@ -538,10 +538,13 @@ class Angel extends AngelBase {
|
|||
|
||||
return finalizers.then((_) => request.response.close()).then((_) {
|
||||
if (logger != null) {
|
||||
var sw = req.injections[Stopwatch];
|
||||
sw?.stop();
|
||||
logger.info(
|
||||
"${res.statusCode} ${req.method} ${req.uri} (${sw?.elapsedMilliseconds ?? 'unknown'} ms)");
|
||||
var sw = req.grab<Stopwatch>(Stopwatch);
|
||||
|
||||
if (sw.isRunning) {
|
||||
sw?.stop();
|
||||
logger.info("${res.statusCode} ${req.method} ${req.uri} (${sw
|
||||
?.elapsedMilliseconds ?? 'unknown'} ms)");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -670,38 +673,3 @@ class Angel extends AngelBase {
|
|||
return new Angel.fromSecurityContext(serverContext);
|
||||
}
|
||||
}
|
||||
|
||||
/// Predetermines what needs to be injected for a handler to run.
|
||||
InjectionRequest preInject(Function handler) {
|
||||
var injection = new InjectionRequest();
|
||||
|
||||
ClosureMirror closureMirror = reflect(handler);
|
||||
|
||||
if (closureMirror.function.parameters.isEmpty) return injection;
|
||||
|
||||
// Load parameters
|
||||
for (var parameter in closureMirror.function.parameters) {
|
||||
var name = MirrorSystem.getName(parameter.simpleName);
|
||||
var type = parameter.type.reflectedType;
|
||||
|
||||
if (!parameter.isNamed) {
|
||||
if (parameter.isOptional) injection.optional.add(name);
|
||||
|
||||
if (type == RequestContext || type == ResponseContext) {
|
||||
injection.required.add(type);
|
||||
} else if (name == 'req') {
|
||||
injection.required.add(RequestContext);
|
||||
} else if (name == 'res') {
|
||||
injection.required.add(ResponseContext);
|
||||
} else if (type == dynamic) {
|
||||
injection.required.add(name);
|
||||
} else {
|
||||
injection.required.add([name, type]);
|
||||
}
|
||||
} else {
|
||||
injection.named[name] = type;
|
||||
}
|
||||
}
|
||||
|
||||
return injection;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
name: angel_framework
|
||||
version: 1.1.0-alpha+3
|
||||
version: 1.1.0-alpha+4
|
||||
description: A high-powered HTTP server with DI, routing and more.
|
||||
author: Tobe O <thosakwe@gmail.com>
|
||||
homepage: https://github.com/angel-dart/angel_framework
|
||||
|
|
|
@ -6,7 +6,7 @@ import 'package:test/test.dart';
|
|||
main() {
|
||||
test('preinjects functions', () async {
|
||||
var app = new Angel()
|
||||
..properties['foo'] = 'bar'
|
||||
..configuration['foo'] = 'bar'
|
||||
..get('/foo', echoAppFoo);
|
||||
app.optimizeForProduction(force: true);
|
||||
print(app.preContained);
|
||||
|
|
|
@ -21,7 +21,7 @@ main() {
|
|||
});
|
||||
|
||||
group('scoping', () {
|
||||
var parent = new Angel()..properties['two'] = 2;
|
||||
var parent = new Angel()..configuration['two'] = 2;
|
||||
var child = new Angel();
|
||||
parent.use('/child', child);
|
||||
|
||||
|
@ -66,10 +66,10 @@ main() {
|
|||
test('plug-ins run on startup', () async {
|
||||
var app = new Angel();
|
||||
app.startupHooks.add((app) async {
|
||||
app.properties['two'] = 2;
|
||||
app.configuration['two'] = 2;
|
||||
});
|
||||
await app.startServer();
|
||||
expect(app.properties['two'], 2);
|
||||
expect(app.configuration['two'], 2);
|
||||
await app.close();
|
||||
});
|
||||
|
||||
|
|
|
@ -21,9 +21,9 @@ main() {
|
|||
});
|
||||
|
||||
test('can use app.properties like members', () {
|
||||
app.properties['hello'] = 'world';
|
||||
app.properties['foo'] = () => 'bar';
|
||||
app.properties['Foo'] = new Foo('bar');
|
||||
app.configuration['hello'] = 'world';
|
||||
app.configuration['foo'] = () => 'bar';
|
||||
app.configuration['Foo'] = new Foo('bar');
|
||||
|
||||
expect(app.hello, equals('world'));
|
||||
expect(app.foo(), equals('bar'));
|
||||
|
|
Loading…
Reference in a new issue