| <?xml version="1.0" encoding="UTF-8"?> | ||
| <project version="4"> | ||
| <component name="Encoding"> | ||
| <file url="PROJECT" charset="UTF-8" /> | ||
| </component> | ||
| </project> |
| <?xml version="1.0" encoding="UTF-8"?> | ||
| <project version="4"> | ||
| <component name="ProjectModuleManager"> | ||
| <modules> | ||
| <module fileurl="file://$PROJECT_DIR$/.idea/node-tunnel.iml" filepath="$PROJECT_DIR$/.idea/node-tunnel.iml" /> | ||
| </modules> | ||
| </component> | ||
| </project> |
Sorry, the diff of this file is not supported yet
| <?xml version="1.0" encoding="UTF-8"?> | ||
| <project version="4"> | ||
| <component name="VcsDirectoryMappings"> | ||
| <mapping directory="$PROJECT_DIR$" vcs="Git" /> | ||
| </component> | ||
| </project> |
| <?xml version="1.0" encoding="UTF-8"?> | ||
| <project version="4"> | ||
| <component name="ChangeListManager"> | ||
| <list default="true" id="3caed8aa-31ae-4b3d-ad18-6f9796663516" name="Default" comment=""> | ||
| <change type="MODIFICATION" beforePath="$PROJECT_DIR$/.travis.yml" afterPath="$PROJECT_DIR$/.travis.yml" /> | ||
| <change type="MODIFICATION" beforePath="$PROJECT_DIR$/CHANGELOG.md" afterPath="$PROJECT_DIR$/CHANGELOG.md" /> | ||
| </list> | ||
| <ignored path="$PROJECT_DIR$/.tmp/" /> | ||
| <ignored path="$PROJECT_DIR$/temp/" /> | ||
| <ignored path="$PROJECT_DIR$/tmp/" /> | ||
| <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" /> | ||
| <option name="TRACKING_ENABLED" value="true" /> | ||
| <option name="SHOW_DIALOG" value="false" /> | ||
| <option name="HIGHLIGHT_CONFLICTS" value="true" /> | ||
| <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> | ||
| <option name="LAST_RESOLUTION" value="IGNORE" /> | ||
| </component> | ||
| <component name="FileEditorManager"> | ||
| <leaf SIDE_TABS_SIZE_LIMIT_KEY="300"> | ||
| <file leaf-file-name="package.json" pinned="false" current-in-tab="false"> | ||
| <entry file="file://$PROJECT_DIR$/package.json"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="34"> | ||
| <caret line="2" column="19" lean-forward="false" selection-start-line="2" selection-start-column="19" selection-end-line="2" selection-end-column="19" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| </file> | ||
| <file leaf-file-name="README.md" pinned="false" current-in-tab="false"> | ||
| <entry file="file://$PROJECT_DIR$/README.md"> | ||
| <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]"> | ||
| <state split_layout="SPLIT"> | ||
| <first_editor relative-caret-position="2312"> | ||
| <caret line="136" column="67" lean-forward="false" selection-start-line="136" selection-start-column="67" selection-end-line="136" selection-end-column="67" /> | ||
| <folding> | ||
| <marker date="1497272379133" expanded="true" signature="590:646" ph="{...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="601:644" ph="{"host": 'localhost'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="674:737" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="884:1330" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="964:1328" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1103:1192" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="1290:1324" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1357:1419" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1514:2209" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1540:1623" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="1842:2207" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1981:2070" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="2168:2202" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2237:2300" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2395:3180" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2475:3178" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2615:2704" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="2802:2836" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3207:3269" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3366:4398" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3392:3475" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="3694:4396" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3834:3923" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="4021:4055" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="4426:4489" ph="{"host": 'example.com'...}" /> | ||
| </folding> | ||
| </first_editor> | ||
| <second_editor /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| </file> | ||
| <file leaf-file-name=".travis.yml" pinned="false" current-in-tab="true"> | ||
| <entry file="file://$PROJECT_DIR$/.travis.yml"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="102"> | ||
| <caret line="6" column="0" lean-forward="true" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| </file> | ||
| <file leaf-file-name="tunnel.js" pinned="false" current-in-tab="false"> | ||
| <entry file="file://$PROJECT_DIR$/lib/tunnel.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="697"> | ||
| <caret line="41" column="19" lean-forward="false" selection-start-line="41" selection-start-column="19" selection-end-line="41" selection-end-column="19" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| </file> | ||
| <file leaf-file-name="http-over-http-error.js" pinned="false" current-in-tab="false"> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-http-error.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="935"> | ||
| <caret line="55" column="26" lean-forward="true" selection-start-line="55" selection-start-column="26" selection-end-line="55" selection-end-column="26" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| </file> | ||
| <file leaf-file-name="http-over-http-error2.js" pinned="false" current-in-tab="false"> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-http-error2.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="1207"> | ||
| <caret line="71" column="0" lean-forward="false" selection-start-line="71" selection-start-column="0" selection-end-line="71" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| </file> | ||
| <file leaf-file-name="https-over-http.js" pinned="false" current-in-tab="false"> | ||
| <entry file="file://$PROJECT_DIR$/test/https-over-http.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="1479"> | ||
| <caret line="87" column="0" lean-forward="false" selection-start-line="87" selection-start-column="0" selection-end-line="87" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| </file> | ||
| <file leaf-file-name="https-over-https.js" pinned="false" current-in-tab="false"> | ||
| <entry file="file://$PROJECT_DIR$/test/https-over-https.js"> | ||
| <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 /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| </file> | ||
| <file leaf-file-name="http-over-http.js" pinned="false" current-in-tab="false"> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-http.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="1088"> | ||
| <caret line="64" column="26" lean-forward="true" selection-start-line="64" selection-start-column="26" selection-end-line="64" selection-end-column="26" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| </file> | ||
| <file leaf-file-name="CHANGELOG.md" pinned="false" current-in-tab="false"> | ||
| <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="102"> | ||
| <caret line="6" column="0" lean-forward="false" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" /> | ||
| <folding /> | ||
| </first_editor> | ||
| <second_editor /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| </file> | ||
| </leaf> | ||
| </component> | ||
| <component name="FileTemplateManagerImpl"> | ||
| <option name="RECENT_TEMPLATES"> | ||
| <list> | ||
| <option value="JavaScript File" /> | ||
| </list> | ||
| </option> | ||
| </component> | ||
| <component name="FindInProjectRecents"> | ||
| <findStrings> | ||
| <find>max</find> | ||
| <find>onconne</find> | ||
| </findStrings> | ||
| </component> | ||
| <component name="Git.Settings"> | ||
| <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> | ||
| </component> | ||
| <component name="IdeDocumentHistory"> | ||
| <option name="CHANGED_PATHS"> | ||
| <list> | ||
| <option value="$PROJECT_DIR$/test/http-over-http-error.js" /> | ||
| <option value="$PROJECT_DIR$/README.md" /> | ||
| <option value="$PROJECT_DIR$/package.json" /> | ||
| <option value="$PROJECT_DIR$/test/http-over-http-error2.js" /> | ||
| <option value="$PROJECT_DIR$/test/https-over-http-localaddress.js" /> | ||
| <option value="$PROJECT_DIR$/test/https-over-http.js" /> | ||
| <option value="$PROJECT_DIR$/lib/tunnel.js" /> | ||
| <option value="$PROJECT_DIR$/CHANGELOG.md" /> | ||
| <option value="$PROJECT_DIR$/.travis.yml" /> | ||
| </list> | ||
| </option> | ||
| </component> | ||
| <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" /> | ||
| <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER"> | ||
| <package-json value="$PROJECT_DIR$/package.json" /> | ||
| </component> | ||
| <component name="JsFlowSettings"> | ||
| <service-enabled>false</service-enabled> | ||
| <exe-path /> | ||
| <annotation-enable>false</annotation-enable> | ||
| <other-services-enabled>false</other-services-enabled> | ||
| <auto-save>true</auto-save> | ||
| </component> | ||
| <component name="JsGulpfileManager"> | ||
| <detection-done>true</detection-done> | ||
| <sorting>DEFINITION_ORDER</sorting> | ||
| </component> | ||
| <component name="NodeModulesDirectoryManager"> | ||
| <handled-path value="$PROJECT_DIR$/node_modules" /> | ||
| </component> | ||
| <component name="ProjectFrameBounds"> | ||
| <option name="x" value="785" /> | ||
| <option name="y" value="40" /> | ||
| <option name="width" value="1788" /> | ||
| <option name="height" value="1407" /> | ||
| </component> | ||
| <component name="ProjectView"> | ||
| <navigator currentView="ProjectPane" proportions="" version="1"> | ||
| <flattenPackages /> | ||
| <showMembers /> | ||
| <showModules /> | ||
| <showLibraryContents /> | ||
| <hideEmptyPackages /> | ||
| <abbreviatePackageNames /> | ||
| <autoscrollToSource /> | ||
| <autoscrollFromSource ProjectPane="true" /> | ||
| <sortByType /> | ||
| <manualOrder /> | ||
| <foldersAlwaysOnTop value="true" /> | ||
| </navigator> | ||
| <panes> | ||
| <pane id="Scope" /> | ||
| <pane id="Scratches" /> | ||
| <pane id="ProjectPane"> | ||
| <subPane> | ||
| <expand> | ||
| <path> | ||
| <item name="node-tunnel" type="b2602c69:ProjectViewProjectNode" /> | ||
| <item name="node-tunnel" type="462c0819:PsiDirectoryNode" /> | ||
| </path> | ||
| <path> | ||
| <item name="node-tunnel" type="b2602c69:ProjectViewProjectNode" /> | ||
| <item name="node-tunnel" type="462c0819:PsiDirectoryNode" /> | ||
| <item name="lib" type="462c0819:PsiDirectoryNode" /> | ||
| </path> | ||
| <path> | ||
| <item name="node-tunnel" type="b2602c69:ProjectViewProjectNode" /> | ||
| <item name="node-tunnel" type="462c0819:PsiDirectoryNode" /> | ||
| <item name="test" type="462c0819:PsiDirectoryNode" /> | ||
| </path> | ||
| </expand> | ||
| <select /> | ||
| </subPane> | ||
| </pane> | ||
| </panes> | ||
| </component> | ||
| <component name="PropertiesComponent"> | ||
| <property name="WebServerToolWindowFactoryState" value="false" /> | ||
| <property name="last_opened_file_path" value="$PROJECT_DIR$" /> | ||
| <property name="HbShouldOpenHtmlAsHb" value="" /> | ||
| <property name="nodejs_interpreter_path" value="$PROJECT_DIR$/../../nvmw/v6.10.3/node" /> | ||
| </component> | ||
| <component name="RecentsManager"> | ||
| <key name="CopyFile.RECENT_KEYS"> | ||
| <recent name="C:\Users\koichik\git\koichik\node-tunnel\test" /> | ||
| </key> | ||
| </component> | ||
| <component name="RunDashboard"> | ||
| <option name="ruleStates"> | ||
| <list> | ||
| <RuleState> | ||
| <option name="name" value="ConfigurationTypeDashboardGroupingRule" /> | ||
| </RuleState> | ||
| <RuleState> | ||
| <option name="name" value="StatusDashboardGroupingRule" /> | ||
| </RuleState> | ||
| </list> | ||
| </option> | ||
| </component> | ||
| <component name="RunManager"> | ||
| <configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js"> | ||
| <node-interpreter>project</node-interpreter> | ||
| <node-options /> | ||
| <gulpfile /> | ||
| <tasks /> | ||
| <arguments /> | ||
| <envs /> | ||
| </configuration> | ||
| <configuration default="true" type="DartCommandLineRunConfigurationType" factoryName="Dart Command Line Application"> | ||
| <method /> | ||
| </configuration> | ||
| <configuration default="true" type="DartTestRunConfigurationType" factoryName="Dart Test"> | ||
| <method /> | ||
| </configuration> | ||
| <configuration default="true" type="JavaScriptTestRunnerJest" factoryName="Jest"> | ||
| <node-interpreter value="project" /> | ||
| <working-dir value="" /> | ||
| <envs /> | ||
| <scope-kind value="ALL" /> | ||
| <method /> | ||
| </configuration> | ||
| <configuration default="true" type="JavaScriptTestRunnerKarma" factoryName="Karma"> | ||
| <config-file value="" /> | ||
| <node-interpreter value="project" /> | ||
| <envs /> | ||
| <method /> | ||
| </configuration> | ||
| <configuration default="true" type="JavaScriptTestRunnerProtractor" factoryName="Protractor"> | ||
| <config-file value="" /> | ||
| <node-interpreter value="project" /> | ||
| <envs /> | ||
| <method /> | ||
| </configuration> | ||
| <configuration default="true" type="JavascriptDebugType" factoryName="JavaScript Debug"> | ||
| <method /> | ||
| </configuration> | ||
| <configuration default="true" type="NodeJSConfigurationType" factoryName="Node.js" path-to-node="project" working-dir=""> | ||
| <method /> | ||
| </configuration> | ||
| <configuration default="true" type="cucumber.js" factoryName="Cucumber.js"> | ||
| <option name="cucumberJsArguments" value="" /> | ||
| <option name="executablePath" /> | ||
| <option name="filePath" /> | ||
| <method /> | ||
| </configuration> | ||
| <configuration default="true" type="js.build_tools.npm" factoryName="npm"> | ||
| <command value="run" /> | ||
| <scripts /> | ||
| <node-interpreter value="project" /> | ||
| <envs /> | ||
| <method /> | ||
| </configuration> | ||
| <configuration default="true" type="mocha-javascript-test-runner" factoryName="Mocha"> | ||
| <node-interpreter>project</node-interpreter> | ||
| <node-options /> | ||
| <working-directory /> | ||
| <pass-parent-env>true</pass-parent-env> | ||
| <envs /> | ||
| <ui /> | ||
| <extra-mocha-options /> | ||
| <test-kind>DIRECTORY</test-kind> | ||
| <test-directory /> | ||
| <recursive>false</recursive> | ||
| <method /> | ||
| </configuration> | ||
| </component> | ||
| <component name="ShelveChangesManager" show_recycled="false"> | ||
| <option name="remove_strategy" value="false" /> | ||
| </component> | ||
| <component name="SvnConfiguration"> | ||
| <configuration /> | ||
| </component> | ||
| <component name="TaskManager"> | ||
| <task active="true" id="Default" summary="Default task"> | ||
| <changelist id="3caed8aa-31ae-4b3d-ad18-6f9796663516" name="Default" comment="" /> | ||
| <created>1497256565348</created> | ||
| <option name="number" value="Default" /> | ||
| <option name="presentableId" value="Default" /> | ||
| <updated>1497256565348</updated> | ||
| <workItem from="1497256566573" duration="8794000" /> | ||
| <workItem from="1497272051717" duration="2328000" /> | ||
| <workItem from="1536577850117" duration="8708000" /> | ||
| <workItem from="1536636907096" duration="739000" /> | ||
| </task> | ||
| <servers /> | ||
| </component> | ||
| <component name="TimeTrackingManager"> | ||
| <option name="totallyTimeSpent" value="20569000" /> | ||
| </component> | ||
| <component name="ToolWindowManager"> | ||
| <frame x="785" y="40" width="1788" height="1407" extended-state="0" /> | ||
| <editor active="true" /> | ||
| <layout> | ||
| <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" /> | ||
| <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" /> | ||
| <window_info id="SvgViewer" 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.33" sideWeight="0.5" order="7" side_tool="true" 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.33" sideWeight="0.5" 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="true" show_stripe_button="true" weight="0.32967034" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> | ||
| <window_info id="npm" 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="true" 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="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" /> | ||
| <window_info id="Debug" 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="3" side_tool="false" content_ui="tabs" /> | ||
| <window_info id="Favorites" 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="true" content_ui="tabs" /> | ||
| <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" /> | ||
| <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" /> | ||
| <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" 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="Hierarchy" 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="2" side_tool="false" content_ui="combo" /> | ||
| <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" 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" /> | ||
| </layout> | ||
| </component> | ||
| <component name="TypeScriptGeneratedFilesManager"> | ||
| <option name="version" value="1" /> | ||
| </component> | ||
| <component name="VcsContentAnnotationSettings"> | ||
| <option name="myLimit" value="2678400000" /> | ||
| </component> | ||
| <component name="XDebuggerManager"> | ||
| <breakpoint-manager /> | ||
| <watches-manager /> | ||
| </component> | ||
| <component name="editorHistoryManager"> | ||
| <entry file="file://$PROJECT_DIR$/package.json"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="34"> | ||
| <caret line="2" column="19" lean-forward="false" selection-start-line="2" selection-start-column="19" selection-end-line="2" selection-end-column="19" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/README.md"> | ||
| <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]"> | ||
| <state split_layout="SPLIT"> | ||
| <first_editor relative-caret-position="2312"> | ||
| <caret line="136" column="67" lean-forward="false" selection-start-line="136" selection-start-column="67" selection-end-line="136" selection-end-column="67" /> | ||
| <folding> | ||
| <marker date="1497272379133" expanded="true" signature="590:646" ph="{...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="601:644" ph="{"host": 'localhost'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="674:737" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="884:1330" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="964:1328" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1103:1192" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="1290:1324" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1357:1419" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1514:2209" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1540:1623" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="1842:2207" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1981:2070" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="2168:2202" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2237:2300" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2395:3180" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2475:3178" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2615:2704" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="2802:2836" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3207:3269" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3366:4398" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3392:3475" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="3694:4396" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3834:3923" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="4021:4055" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="4426:4489" ph="{"host": 'example.com'...}" /> | ||
| </folding> | ||
| </first_editor> | ||
| <second_editor /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/.travis.yml"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="102"> | ||
| <caret line="6" column="0" lean-forward="true" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-http-error.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="935"> | ||
| <caret line="55" column="26" lean-forward="true" selection-start-line="55" selection-start-column="26" selection-end-line="55" selection-end-column="26" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-http-error2.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="1207"> | ||
| <caret line="71" column="0" lean-forward="false" selection-start-line="71" selection-start-column="0" selection-end-line="71" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/https-over-http.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="1479"> | ||
| <caret line="87" column="0" lean-forward="false" selection-start-line="87" selection-start-column="0" selection-end-line="87" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/https-over-https.js"> | ||
| <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 /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-http.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="1088"> | ||
| <caret line="64" column="26" lean-forward="true" selection-start-line="64" selection-start-column="26" selection-end-line="64" selection-end-column="26" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/lib/tunnel.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="697"> | ||
| <caret line="41" column="19" lean-forward="false" selection-start-line="41" selection-start-column="19" selection-end-line="41" selection-end-column="19" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/package.json"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="34"> | ||
| <caret line="2" column="19" lean-forward="false" selection-start-line="2" selection-start-column="19" selection-end-line="2" selection-end-column="19" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/README.md"> | ||
| <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]"> | ||
| <state split_layout="SPLIT"> | ||
| <first_editor relative-caret-position="2312"> | ||
| <caret line="136" column="67" lean-forward="false" selection-start-line="136" selection-start-column="67" selection-end-line="136" selection-end-column="67" /> | ||
| <folding> | ||
| <marker date="1497272379133" expanded="true" signature="590:646" ph="{...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="601:644" ph="{"host": 'localhost'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="674:737" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="884:1330" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="964:1328" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1103:1192" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="1290:1324" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1357:1419" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1514:2209" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1540:1623" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="1842:2207" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1981:2070" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="2168:2202" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2237:2300" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2395:3180" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2475:3178" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2615:2704" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="2802:2836" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3207:3269" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3366:4398" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3392:3475" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="3694:4396" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3834:3923" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="4021:4055" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="4426:4489" ph="{"host": 'example.com'...}" /> | ||
| </folding> | ||
| </first_editor> | ||
| <second_editor /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/lib/tunnel.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="2550"> | ||
| <caret line="150" column="0" lean-forward="false" selection-start-line="150" selection-start-column="0" selection-end-line="150" selection-end-column="0" /> | ||
| <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="51"> | ||
| <caret line="3" column="21" lean-forward="false" selection-start-line="3" selection-start-column="21" selection-end-line="3" selection-end-column="21" /> | ||
| <folding /> | ||
| </first_editor> | ||
| <second_editor /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/.travis.yml"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="119"> | ||
| <caret line="7" column="0" lean-forward="true" selection-start-line="7" selection-start-column="0" selection-end-line="7" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/package.json"> | ||
| <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 /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/README.md"> | ||
| <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]"> | ||
| <state split_layout="SPLIT"> | ||
| <first_editor 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> | ||
| <marker date="1497272379133" expanded="true" signature="590:646" ph="{...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="601:644" ph="{"host": 'localhost'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="674:737" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="884:1330" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="964:1328" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1103:1192" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="1290:1324" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1357:1419" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1514:2209" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1540:1623" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="1842:2207" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1981:2070" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="2168:2202" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2237:2300" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2395:3180" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2475:3178" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2615:2704" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="2802:2836" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3207:3269" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3366:4398" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3392:3475" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="3694:4396" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3834:3923" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="4021:4055" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="4426:4489" ph="{"host": 'example.com'...}" /> | ||
| </folding> | ||
| </first_editor> | ||
| <second_editor /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/.travis.yml"> | ||
| <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 /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/lib/tunnel.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="2550"> | ||
| <caret line="150" column="0" lean-forward="false" selection-start-line="150" selection-start-column="0" selection-end-line="150" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/https-over-https.js"> | ||
| <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 /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/https-over-https-error.js"> | ||
| <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" /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-http.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="136"> | ||
| <caret line="8" column="0" lean-forward="false" selection-start-line="7" selection-start-column="0" selection-end-line="8" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-http-error.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="1309"> | ||
| <caret line="77" column="0" lean-forward="false" selection-start-line="77" selection-start-column="0" selection-end-line="77" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-https.js"> | ||
| <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" /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-https.js"> | ||
| <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" /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/https-over-https-error.js"> | ||
| <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" /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/README.md"> | ||
| <provider selected="true" editor-type-id="split-provider[text-editor;markdown-preview-editor]"> | ||
| <state split_layout="SPLIT"> | ||
| <first_editor relative-caret-position="2312"> | ||
| <caret line="136" column="67" lean-forward="false" selection-start-line="136" selection-start-column="67" selection-end-line="136" selection-end-column="67" /> | ||
| <folding> | ||
| <marker date="1497272379133" expanded="true" signature="590:646" ph="{...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="601:644" ph="{"host": 'localhost'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="674:737" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="884:1330" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="964:1328" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1103:1192" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="1290:1324" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1357:1419" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1514:2209" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1540:1623" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="1842:2207" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="1981:2070" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="2168:2202" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2237:2300" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2395:3180" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2475:3178" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="2615:2704" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="2802:2836" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3207:3269" ph="{"host": 'example.com'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3366:4398" ph="{"maxSockets": poolSize...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3392:3475" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="3694:4396" ph="{"host": proxyHost...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="3834:3923" ph="//..." /> | ||
| <marker date="1497272379133" expanded="true" signature="4021:4055" ph="{"User-Agent": 'Node'...}" /> | ||
| <marker date="1497272379133" expanded="true" signature="4426:4489" ph="{"host": 'example.com'...}" /> | ||
| </folding> | ||
| </first_editor> | ||
| <second_editor /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/package.json"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="34"> | ||
| <caret line="2" column="19" lean-forward="false" selection-start-line="2" selection-start-column="19" selection-end-line="2" selection-end-column="19" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-http-error.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="935"> | ||
| <caret line="55" column="26" lean-forward="true" selection-start-line="55" selection-start-column="26" selection-end-line="55" selection-end-column="26" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-http-error2.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="1207"> | ||
| <caret line="71" column="0" lean-forward="false" selection-start-line="71" selection-start-column="0" selection-end-line="71" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/https-over-http-localaddress.js" /> | ||
| <entry file="file://$PROJECT_DIR$/test/https-over-https.js"> | ||
| <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 /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/http-over-http.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="1088"> | ||
| <caret line="64" column="26" lean-forward="true" selection-start-line="64" selection-start-column="26" selection-end-line="64" selection-end-column="26" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/test/https-over-http.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="1479"> | ||
| <caret line="87" column="0" lean-forward="false" selection-start-line="87" selection-start-column="0" selection-end-line="87" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/lib/tunnel.js"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="697"> | ||
| <caret line="41" column="19" lean-forward="false" selection-start-line="41" selection-start-column="19" selection-end-line="41" selection-end-column="19" /> | ||
| <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="102"> | ||
| <caret line="6" column="0" lean-forward="false" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" /> | ||
| <folding /> | ||
| </first_editor> | ||
| <second_editor /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| <entry file="file://$PROJECT_DIR$/.travis.yml"> | ||
| <provider selected="true" editor-type-id="text-editor"> | ||
| <state relative-caret-position="102"> | ||
| <caret line="6" column="0" lean-forward="true" selection-start-line="6" selection-start-column="0" selection-end-line="6" selection-end-column="0" /> | ||
| <folding /> | ||
| </state> | ||
| </provider> | ||
| </entry> | ||
| </component> | ||
| </project> |
+1
-2
| language: node_js | ||
| node_js: | ||
| - "0.10" | ||
| - "0.12" | ||
| - "4" | ||
| - "6" | ||
| - "8" | ||
| - "10" |
+6
-0
| # Changelog | ||
| - 0.0.6 (2018/09/11) | ||
| - Fix `localAddress` not working (#25) | ||
| - Fix `Host:` header for CONNECT method by @tmurakam (#29, #30) | ||
| - Fix default port for https (#32) | ||
| - Fix error handling when the proxy send illegal response body (#33) | ||
| - 0.0.5 (2017/06/12) | ||
@@ -4,0 +10,0 @@ - Fix socket leak. |
+25
-9
@@ -28,2 +28,3 @@ 'use strict'; | ||
| agent.createSocket = createSecureSocket; | ||
| agent.defaultPort = 443; | ||
| return agent; | ||
@@ -42,2 +43,3 @@ } | ||
| agent.createSocket = createSecureSocket; | ||
| agent.defaultPort = 443; | ||
| return agent; | ||
@@ -111,4 +113,10 @@ } | ||
| path: options.host + ':' + options.port, | ||
| agent: false | ||
| agent: false, | ||
| headers: { | ||
| host: options.host + ':' + options.port | ||
| } | ||
| }); | ||
| if (options.localAddress) { | ||
| connectOptions.localAddress = options.localAddress; | ||
| } | ||
| if (connectOptions.proxyAuth) { | ||
@@ -145,17 +153,25 @@ connectOptions.headers = connectOptions.headers || {}; | ||
| if (res.statusCode === 200) { | ||
| assert.equal(head.length, 0); | ||
| debug('tunneling connection has established'); | ||
| self.sockets[self.sockets.indexOf(placeholder)] = socket; | ||
| cb(socket); | ||
| } else { | ||
| if (res.statusCode !== 200) { | ||
| debug('tunneling socket could not be established, statusCode=%d', | ||
| res.statusCode); | ||
| res.statusCode); | ||
| socket.destroy(); | ||
| var error = new Error('tunneling socket could not be established, ' + | ||
| 'statusCode=' + res.statusCode); | ||
| 'statusCode=' + res.statusCode); | ||
| error.code = 'ECONNRESET'; | ||
| options.request.emit('error', error); | ||
| self.removeSocket(placeholder); | ||
| return; | ||
| } | ||
| if (head.length > 0) { | ||
| debug('got illegal response body from proxy'); | ||
| socket.destroy(); | ||
| var error = new Error('got illegal response body from proxy'); | ||
| error.code = 'ECONNRESET'; | ||
| options.request.emit('error', error); | ||
| self.removeSocket(placeholder); | ||
| return; | ||
| } | ||
| debug('tunneling connection has established'); | ||
| self.sockets[self.sockets.indexOf(placeholder)] = socket; | ||
| return cb(socket); | ||
| } | ||
@@ -162,0 +178,0 @@ |
+3
-3
| { | ||
| "name": "tunnel", | ||
| "version": "0.0.5", | ||
| "version": "0.0.6", | ||
| "description": "Node HTTP/HTTPS Agents for tunneling proxies", | ||
@@ -28,4 +28,4 @@ "keywords": [ | ||
| "devDependencies": { | ||
| "mocha": "*", | ||
| "should": "*" | ||
| "mocha": "^5.2.0", | ||
| "should": "^13.2.3" | ||
| }, | ||
@@ -32,0 +32,0 @@ "engines": { |
Sorry, the diff of this file is not supported yet
| var http = require('http'); | ||
| var net = require('net'); | ||
| var should = require('should'); | ||
| var tunnel = require('../index'); | ||
| describe('HTTP over HTTP internal server error', function() { | ||
| it('should finish without error', function(done) { | ||
| var serverPort = 3010; | ||
| var proxyPort = 3011; | ||
| var poolSize = 3; | ||
| var proxyConnect = 0; | ||
| var clientConnect = 0; | ||
| var proxyClosed = false; | ||
| var clientClosed = false; | ||
| var clientGotSocket = false; | ||
| var clientGotError = false; | ||
| var proxy; | ||
| var agent; | ||
| proxy = http.createServer(function(req, res) { | ||
| should.fail(); | ||
| }); | ||
| proxy.on('upgrade', onConnect); // for v0.6 | ||
| proxy.on('connect', onConnect); // for v0.7 or later | ||
| function onConnect(req, clientSocket, head) { | ||
| tunnel.debug('PROXY: got CONNECT request'); | ||
| req.method.should.equal('CONNECT'); | ||
| req.url.should.equal('localhost:' + serverPort); | ||
| req.headers.should.not.have.property('transfer-encoding'); | ||
| req.headers.should.have.property('proxy-authorization', | ||
| 'Basic ' + new Buffer('user:password').toString('base64')); | ||
| ++proxyConnect; | ||
| clientSocket.on('close', function() { | ||
| proxyClosed = true; | ||
| proxy.close(); | ||
| }); | ||
| tunnel.debug('PROXY: returning 500'); | ||
| clientSocket.write('HTTP/1.1 500 Internal Server Error\r\n\r\n'); | ||
| clientSocket.end(); | ||
| } | ||
| proxy.listen(proxyPort, setupClient); | ||
| function setupClient() { | ||
| agent = tunnel.httpOverHttp({ | ||
| maxSockets: poolSize, | ||
| proxy: { | ||
| port: proxyPort, | ||
| proxyAuth: 'user:password' | ||
| } | ||
| }); | ||
| tunnel.debug('CLIENT: Making HTTP request'); | ||
| var req = http.get({ | ||
| port: serverPort, | ||
| path: '/', | ||
| agent: agent | ||
| }, function(res) { | ||
| tunnel.debug('CLIENT: got HTTP response'); | ||
| ++clientConnect; | ||
| }); | ||
| req.on('socket', function(socket) { | ||
| clientGotSocket = true; | ||
| }); | ||
| req.on('error', function(err) { | ||
| clientGotError = true; | ||
| err.code.should.equal('ECONNRESET'); | ||
| }); | ||
| } | ||
| proxy.on('close', function() { | ||
| proxyConnect.should.equal(1); | ||
| proxyClosed.should.ok(); | ||
| clientConnect.should.equal(0); | ||
| clientGotSocket.should.not.ok(); | ||
| clientGotError.should.ok(); | ||
| agent.sockets.should.be.empty; | ||
| agent.requests.should.be.empty; | ||
| done(); | ||
| }); | ||
| }); | ||
| }); |
| var http = require('http'); | ||
| var net = require('net'); | ||
| var should = require('should'); | ||
| var tunnel = require('../index'); | ||
| describe('HTTP over HTTP', function() { | ||
| it('should finish without error', function(done) { | ||
| var serverPort = 3000; | ||
| var proxyPort = 3001; | ||
| var poolSize = 3; | ||
| var N = 10; | ||
| var serverConnect = 0; | ||
| var proxyConnect = 0; | ||
| var clientConnect = 0; | ||
| var server; | ||
| var proxy; | ||
| var agent; | ||
| server = http.createServer(function(req, res) { | ||
| tunnel.debug('SERVER: got request'); | ||
| ++serverConnect; | ||
| res.writeHead(200); | ||
| res.end('Hello' + req.url); | ||
| tunnel.debug('SERVER: sending response'); | ||
| }); | ||
| server.listen(serverPort, setupProxy); | ||
| function setupProxy() { | ||
| proxy = http.createServer(function(req, res) { | ||
| should.fail(); | ||
| }); | ||
| proxy.on('upgrade', onConnect); // for v0.6 | ||
| proxy.on('connect', onConnect); // for v0.7 or later | ||
| function onConnect(req, clientSocket, head) { | ||
| tunnel.debug('PROXY: got CONNECT request'); | ||
| req.method.should.equal('CONNECT'); | ||
| req.url.should.equal('localhost:' + serverPort); | ||
| req.headers.should.not.have.property('transfer-encoding'); | ||
| req.headers.should.have.property('proxy-authorization', | ||
| 'Basic ' + new Buffer('user:password').toString('base64')); | ||
| ++proxyConnect; | ||
| tunnel.debug('PROXY: creating a tunnel'); | ||
| var serverSocket = net.connect(serverPort, function() { | ||
| tunnel.debug('PROXY: replying to client CONNECT request'); | ||
| clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n'); | ||
| clientSocket.pipe(serverSocket); | ||
| serverSocket.write(head); | ||
| serverSocket.pipe(clientSocket); | ||
| // workaround, see joyent/node#2524 | ||
| serverSocket.on('end', function() { | ||
| clientSocket.end(); | ||
| }); | ||
| }); | ||
| } | ||
| proxy.listen(proxyPort, setupClient); | ||
| } | ||
| function setupClient() { | ||
| agent = tunnel.httpOverHttp({ | ||
| maxSockets: poolSize, | ||
| proxy: { | ||
| port: proxyPort, | ||
| proxyAuth: 'user:password' | ||
| } | ||
| }); | ||
| for (var i = 0; i < N; ++i) { | ||
| doClientRequest(i); | ||
| } | ||
| function doClientRequest(i) { | ||
| tunnel.debug('CLIENT: Making HTTP request (%d)', i); | ||
| var req = http.get({ | ||
| port: serverPort, | ||
| path: '/' + i, | ||
| agent: agent | ||
| }, function(res) { | ||
| tunnel.debug('CLIENT: got HTTP response (%d)', i); | ||
| res.setEncoding('utf8'); | ||
| res.on('data', function(data) { | ||
| data.should.equal('Hello/' + i); | ||
| }); | ||
| res.on('end', function() { | ||
| ++clientConnect; | ||
| if (clientConnect === N) { | ||
| proxy.close(); | ||
| server.close(); | ||
| } | ||
| }); | ||
| }); | ||
| } | ||
| } | ||
| server.on('close', function() { | ||
| serverConnect.should.equal(N); | ||
| proxyConnect.should.equal(poolSize); | ||
| clientConnect.should.equal(N); | ||
| agent.sockets.should.be.empty; | ||
| agent.requests.should.be.empty; | ||
| done(); | ||
| }); | ||
| }); | ||
| }); |
| var http = require('http'); | ||
| var https = require('https'); | ||
| var net = require('net'); | ||
| var fs = require('fs'); | ||
| var path = require('path'); | ||
| var should = require('should'); | ||
| var tunnel = require('../index'); | ||
| function readPem(file) { | ||
| return fs.readFileSync(path.join('test/keys', file + '.pem')); | ||
| } | ||
| var proxyKey = readPem('proxy1-key'); | ||
| var proxyCert = readPem('proxy1-cert'); | ||
| var proxyCA = readPem('ca2-cert'); | ||
| var clientKey = readPem('client1-key'); | ||
| var clientCert = readPem('client1-cert'); | ||
| var clientCA = readPem('ca3-cert'); | ||
| describe('HTTP over HTTPS', function() { | ||
| it('should finish without error', function(done) { | ||
| var serverPort = 3004; | ||
| var proxyPort = 3005; | ||
| var poolSize = 3; | ||
| var N = 10; | ||
| var serverConnect = 0; | ||
| var proxyConnect = 0; | ||
| var clientConnect = 0; | ||
| var server; | ||
| var proxy; | ||
| var agent; | ||
| server = http.createServer(function(req, res) { | ||
| tunnel.debug('SERVER: got request'); | ||
| ++serverConnect; | ||
| res.writeHead(200); | ||
| res.end('Hello' + req.url); | ||
| tunnel.debug('SERVER: sending response'); | ||
| }); | ||
| server.listen(serverPort, setupProxy); | ||
| function setupProxy() { | ||
| proxy = https.createServer({ | ||
| key: proxyKey, | ||
| cert: proxyCert, | ||
| ca: [clientCA], | ||
| requestCert: true, | ||
| rejectUnauthorized: true | ||
| }, function(req, res) { | ||
| should.fail(); | ||
| }); | ||
| proxy.on('upgrade', onConnect); // for v0.6 | ||
| proxy.on('connect', onConnect); // for v0.7 or later | ||
| function onConnect(req, clientSocket, head) { | ||
| tunnel.debug('PROXY: got CONNECT request'); | ||
| req.method.should.equal('CONNECT'); | ||
| req.url.should.equal('localhost:' + serverPort); | ||
| req.headers.should.not.have.property('transfer-encoding'); | ||
| ++proxyConnect; | ||
| tunnel.debug('PROXY: creating a tunnel'); | ||
| var serverSocket = net.connect(serverPort, function() { | ||
| tunnel.debug('PROXY: replying to client CONNECT request'); | ||
| clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n'); | ||
| clientSocket.pipe(serverSocket); | ||
| serverSocket.write(head); | ||
| serverSocket.pipe(clientSocket); | ||
| // workaround, see joyent/node#2524 | ||
| serverSocket.on('end', function() { | ||
| clientSocket.end(); | ||
| }); | ||
| }); | ||
| } | ||
| proxy.listen(proxyPort, setupClient); | ||
| } | ||
| function setupClient() { | ||
| agent = tunnel.httpOverHttps({ | ||
| maxSockets: poolSize, | ||
| proxy: { | ||
| port: proxyPort, | ||
| key: clientKey, | ||
| cert: clientCert, | ||
| ca: [proxyCA], | ||
| rejectUnauthorized: true | ||
| } | ||
| }); | ||
| for (var i = 0; i < N; ++i) { | ||
| doClientRequest(i); | ||
| } | ||
| function doClientRequest(i) { | ||
| tunnel.debug('CLIENT: Making HTTP request (%d)', i); | ||
| var req = http.get({ | ||
| port: serverPort, | ||
| path: '/' + i, | ||
| agent: agent | ||
| }, function(res) { | ||
| tunnel.debug('CLIENT: got HTTP response (%d)', i); | ||
| res.setEncoding('utf8'); | ||
| res.on('data', function(data) { | ||
| data.should.equal('Hello/' + i); | ||
| }); | ||
| res.on('end', function() { | ||
| ++clientConnect; | ||
| if (clientConnect === N) { | ||
| proxy.close(); | ||
| server.close(); | ||
| } | ||
| }); | ||
| }); | ||
| } | ||
| } | ||
| server.on('close', function() { | ||
| serverConnect.should.equal(N); | ||
| proxyConnect.should.equal(poolSize); | ||
| clientConnect.should.equal(N); | ||
| var name = 'localhost:' + serverPort; | ||
| agent.sockets.should.be.empty; | ||
| agent.requests.should.be.empty; | ||
| done(); | ||
| }); | ||
| }); | ||
| }); |
| var http = require('http'); | ||
| var https = require('https'); | ||
| var net = require('net'); | ||
| var fs = require('fs'); | ||
| var path = require('path'); | ||
| var should = require('should'); | ||
| var tunnel = require('../index'); | ||
| function readPem(file) { | ||
| return fs.readFileSync(path.join('test/keys', file + '.pem')); | ||
| } | ||
| var serverKey = readPem('server1-key'); | ||
| var serverCert = readPem('server1-cert'); | ||
| var serverCA = readPem('ca1-cert'); | ||
| var clientKey = readPem('client1-key'); | ||
| var clientCert = readPem('client1-cert'); | ||
| var clientCA = readPem('ca3-cert'); | ||
| describe('HTTPS over HTTP', function() { | ||
| it('should finish without error', function(done) { | ||
| var serverPort = 3002; | ||
| var proxyPort = 3003; | ||
| var poolSize = 3; | ||
| var N = 10; | ||
| var serverConnect = 0; | ||
| var proxyConnect = 0; | ||
| var clientConnect = 0; | ||
| var server; | ||
| var proxy; | ||
| var agent; | ||
| server = https.createServer({ | ||
| key: serverKey, | ||
| cert: serverCert, | ||
| ca: [clientCA], | ||
| requestCert: true, | ||
| rejectUnauthorized: true | ||
| }, function(req, res) { | ||
| tunnel.debug('SERVER: got request'); | ||
| ++serverConnect; | ||
| res.writeHead(200); | ||
| res.end('Hello' + req.url); | ||
| tunnel.debug('SERVER: sending response'); | ||
| }); | ||
| server.listen(serverPort, setupProxy); | ||
| function setupProxy() { | ||
| proxy = http.createServer(function(req, res) { | ||
| should.fail(); | ||
| }); | ||
| proxy.on('upgrade', onConnect); // for v0.6 | ||
| proxy.on('connect', onConnect); // for v0.7 or later | ||
| function onConnect(req, clientSocket, head) { | ||
| tunnel.debug('PROXY: got CONNECT request'); | ||
| req.method.should.equal('CONNECT'); | ||
| req.url.should.equal('localhost:' + serverPort); | ||
| req.headers.should.not.have.property('transfer-encoding'); | ||
| ++proxyConnect; | ||
| var serverSocket = net.connect(serverPort, function() { | ||
| tunnel.debug('PROXY: replying to client CONNECT request'); | ||
| clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n'); | ||
| clientSocket.pipe(serverSocket); | ||
| serverSocket.write(head); | ||
| serverSocket.pipe(clientSocket); | ||
| // workaround, see joyent/node#2524 | ||
| serverSocket.on('end', function() { | ||
| clientSocket.end(); | ||
| }); | ||
| }); | ||
| } | ||
| proxy.listen(proxyPort, setupClient); | ||
| } | ||
| function setupClient() { | ||
| agent = tunnel.httpsOverHttp({ | ||
| maxSockets: poolSize, | ||
| key: clientKey, | ||
| cert: clientCert, | ||
| ca: [serverCA], | ||
| rejectUnauthorized: true, | ||
| proxy: { | ||
| port: proxyPort | ||
| } | ||
| }); | ||
| for (var i = 0; i < N; ++i) { | ||
| doClientRequest(i); | ||
| } | ||
| function doClientRequest(i) { | ||
| tunnel.debug('CLIENT: Making HTTPS request (%d)', i); | ||
| var req = https.get({ | ||
| port: serverPort, | ||
| path: '/' + i, | ||
| agent: agent | ||
| }, function(res) { | ||
| tunnel.debug('CLIENT: got HTTPS response (%d)', i); | ||
| res.setEncoding('utf8'); | ||
| res.on('data', function(data) { | ||
| data.should.equal('Hello/' + i); | ||
| }); | ||
| res.on('end', function() { | ||
| ++clientConnect; | ||
| if (clientConnect === N) { | ||
| proxy.close(); | ||
| server.close(); | ||
| } | ||
| }); | ||
| }); | ||
| } | ||
| } | ||
| server.on('close', function() { | ||
| serverConnect.should.equal(N); | ||
| proxyConnect.should.equal(poolSize); | ||
| clientConnect.should.equal(N); | ||
| var name = 'localhost:' + serverPort; | ||
| agent.sockets.should.be.empty; | ||
| agent.requests.should.be.empty; | ||
| done(); | ||
| }); | ||
| }); | ||
| }); |
| var http = require('http'); | ||
| var https = require('https'); | ||
| var net = require('net'); | ||
| var fs = require('fs'); | ||
| var path = require('path'); | ||
| var should = require('should'); | ||
| var tunnel = require('../index'); | ||
| function readPem(file) { | ||
| return fs.readFileSync(path.join('test/keys', file + '.pem')); | ||
| } | ||
| var serverKey = readPem('server2-key'); | ||
| var serverCert = readPem('server2-cert'); | ||
| var serverCA = readPem('ca1-cert'); | ||
| var proxyKey = readPem('proxy2-key'); | ||
| var proxyCert = readPem('proxy2-cert'); | ||
| var proxyCA = readPem('ca2-cert'); | ||
| var client1Key = readPem('client1-key'); | ||
| var client1Cert = readPem('client1-cert'); | ||
| var client1CA = readPem('ca3-cert'); | ||
| var client2Key = readPem('client2-key'); | ||
| var client2Cert = readPem('client2-cert'); | ||
| var client2CA = readPem('ca4-cert'); | ||
| describe('HTTPS over HTTPS authentication failed', function() { | ||
| it('should finish without error', function(done) { | ||
| var serverPort = 3008; | ||
| var proxyPort = 3009; | ||
| var serverConnect = 0; | ||
| var proxyConnect = 0; | ||
| var clientRequest = 0; | ||
| var clientConnect = 0; | ||
| var clientError = 0; | ||
| var server; | ||
| var proxy; | ||
| server = https.createServer({ | ||
| key: serverKey, | ||
| cert: serverCert, | ||
| ca: [client1CA], | ||
| requestCert: true, | ||
| rejectUnauthorized: true | ||
| }, function(req, res) { | ||
| tunnel.debug('SERVER: got request', req.url); | ||
| ++serverConnect; | ||
| req.on('data', function(data) { | ||
| }); | ||
| req.on('end', function() { | ||
| res.writeHead(200); | ||
| res.end('Hello, ' + serverConnect); | ||
| tunnel.debug('SERVER: sending response'); | ||
| }); | ||
| req.resume(); | ||
| }); | ||
| //server.addContext('server2', { | ||
| // key: serverKey, | ||
| // cert: serverCert, | ||
| // ca: [client1CA], | ||
| //}); | ||
| server.listen(serverPort, setupProxy); | ||
| function setupProxy() { | ||
| proxy = https.createServer({ | ||
| key: proxyKey, | ||
| cert: proxyCert, | ||
| ca: [client2CA], | ||
| requestCert: true, | ||
| rejectUnauthorized: true | ||
| }, function(req, res) { | ||
| should.fail(); | ||
| }); | ||
| //proxy.addContext('proxy2', { | ||
| // key: proxyKey, | ||
| // cert: proxyCert, | ||
| // ca: [client2CA], | ||
| //}); | ||
| proxy.on('upgrade', onConnect); // for v0.6 | ||
| proxy.on('connect', onConnect); // for v0.7 or later | ||
| function onConnect(req, clientSocket, head) { | ||
| req.method.should.equal('CONNECT'); | ||
| req.url.should.equal('localhost:' + serverPort); | ||
| req.headers.should.not.have.property('transfer-encoding'); | ||
| ++proxyConnect; | ||
| var serverSocket = net.connect(serverPort, function() { | ||
| tunnel.debug('PROXY: replying to client CONNECT request'); | ||
| clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n'); | ||
| clientSocket.pipe(serverSocket); | ||
| serverSocket.write(head); | ||
| serverSocket.pipe(clientSocket); | ||
| // workaround, see #2524 | ||
| serverSocket.on('end', function() { | ||
| clientSocket.end(); | ||
| }); | ||
| }); | ||
| } | ||
| proxy.listen(proxyPort, setupClient); | ||
| } | ||
| function setupClient() { | ||
| function doRequest(name, options, host) { | ||
| tunnel.debug('CLIENT: Making HTTPS request (%s)', name); | ||
| ++clientRequest; | ||
| var agent = tunnel.httpsOverHttps(options); | ||
| var req = https.get({ | ||
| host: 'localhost', | ||
| port: serverPort, | ||
| path: '/' + encodeURIComponent(name), | ||
| headers: { | ||
| host: host ? host : 'localhost', | ||
| }, | ||
| rejectUnauthorized: true, | ||
| agent: agent | ||
| }, function(res) { | ||
| tunnel.debug('CLIENT: got HTTPS response (%s)', name); | ||
| ++clientConnect; | ||
| res.on('data', function(data) { | ||
| }); | ||
| res.on('end', function() { | ||
| req.emit('finish'); | ||
| }); | ||
| res.resume(); | ||
| }); | ||
| req.on('error', function(err) { | ||
| tunnel.debug('CLIENT: failed HTTP response (%s)', name, err); | ||
| ++clientError; | ||
| req.emit('finish'); | ||
| }); | ||
| req.on('finish', function() { | ||
| if (clientConnect + clientError === clientRequest) { | ||
| proxy.close(); | ||
| server.close(); | ||
| } | ||
| }); | ||
| } | ||
| doRequest('no cert origin nor proxy', { // invalid | ||
| maxSockets: 1, | ||
| ca: [serverCA], | ||
| rejectUnauthorized: true, | ||
| // no certificate for origin server | ||
| proxy: { | ||
| port: proxyPort, | ||
| ca: [proxyCA], | ||
| rejectUnauthorized: true, | ||
| headers: { | ||
| host: 'proxy2' | ||
| } | ||
| // no certificate for proxy | ||
| } | ||
| }, 'server2'); | ||
| doRequest('no cert proxy', { // invalid | ||
| maxSockets: 1, | ||
| ca: [serverCA], | ||
| rejectUnauthorized: true, | ||
| // client certification for origin server | ||
| key: client1Key, | ||
| cert: client1Cert, | ||
| proxy: { | ||
| port: proxyPort, | ||
| ca: [proxyCA], | ||
| rejectUnauthorized: true, | ||
| headers: { | ||
| host: 'proxy2' | ||
| } | ||
| // no certificate for proxy | ||
| } | ||
| }, 'server2'); | ||
| doRequest('no cert origin', { // invalid | ||
| maxSockets: 1, | ||
| ca: [serverCA], | ||
| rejectUnauthorized: true, | ||
| // no certificate for origin server | ||
| proxy: { | ||
| port: proxyPort, | ||
| servername: 'proxy2', | ||
| ca: [proxyCA], | ||
| rejectUnauthorized: true, | ||
| headers: { | ||
| host: 'proxy2' | ||
| }, | ||
| // client certification for proxy | ||
| key: client2Key, | ||
| cert: client2Cert | ||
| } | ||
| }, 'server2'); | ||
| doRequest('invalid proxy server name', { // invalid | ||
| maxSockets: 1, | ||
| ca: [serverCA], | ||
| rejectUnauthorized: true, | ||
| // client certification for origin server | ||
| key: client1Key, | ||
| cert: client1Cert, | ||
| proxy: { | ||
| port: proxyPort, | ||
| ca: [proxyCA], | ||
| rejectUnauthorized: true, | ||
| // client certification for proxy | ||
| key: client2Key, | ||
| cert: client2Cert, | ||
| } | ||
| }, 'server2'); | ||
| doRequest('invalid origin server name', { // invalid | ||
| maxSockets: 1, | ||
| ca: [serverCA], | ||
| rejectUnauthorized: true, | ||
| // client certification for origin server | ||
| key: client1Key, | ||
| cert: client1Cert, | ||
| proxy: { | ||
| port: proxyPort, | ||
| servername: 'proxy2', | ||
| ca: [proxyCA], | ||
| rejectUnauthorized: true, | ||
| headers: { | ||
| host: 'proxy2' | ||
| }, | ||
| // client certification for proxy | ||
| key: client2Key, | ||
| cert: client2Cert | ||
| } | ||
| }); | ||
| doRequest('valid', { // valid | ||
| maxSockets: 1, | ||
| ca: [serverCA], | ||
| rejectUnauthorized: true, | ||
| // client certification for origin server | ||
| key: client1Key, | ||
| cert: client1Cert, | ||
| proxy: { | ||
| port: proxyPort, | ||
| servername: 'proxy2', | ||
| ca: [proxyCA], | ||
| rejectUnauthorized: true, | ||
| headers: { | ||
| host: 'proxy2' | ||
| }, | ||
| // client certification for proxy | ||
| key: client2Key, | ||
| cert: client2Cert | ||
| } | ||
| }, 'server2'); | ||
| } | ||
| server.on('close', function() { | ||
| serverConnect.should.equal(1); | ||
| proxyConnect.should.equal(3); | ||
| clientConnect.should.equal(1); | ||
| clientError.should.equal(5); | ||
| done(); | ||
| }); | ||
| }); | ||
| }); |
| var http = require('http'); | ||
| var https = require('https'); | ||
| var net = require('net'); | ||
| var fs = require('fs'); | ||
| var path = require('path'); | ||
| var should = require('should'); | ||
| var tunnel = require('../index.js'); | ||
| function readPem(file) { | ||
| return fs.readFileSync(path.join('test/keys', file + '.pem')); | ||
| } | ||
| var serverKey = readPem('server1-key'); | ||
| var serverCert = readPem('server1-cert'); | ||
| var serverCA = readPem('ca1-cert'); | ||
| var proxyKey = readPem('proxy1-key'); | ||
| var proxyCert = readPem('proxy1-cert'); | ||
| var proxyCA = readPem('ca2-cert'); | ||
| var client1Key = readPem('client1-key'); | ||
| var client1Cert = readPem('client1-cert'); | ||
| var client1CA = readPem('ca3-cert'); | ||
| var client2Key = readPem('client2-key'); | ||
| var client2Cert = readPem('client2-cert'); | ||
| var client2CA = readPem('ca4-cert'); | ||
| describe('HTTPS over HTTPS', function() { | ||
| it('should finish without error', function(done) { | ||
| var serverPort = 3006; | ||
| var proxyPort = 3007; | ||
| var poolSize = 3; | ||
| var N = 5; | ||
| var serverConnect = 0; | ||
| var proxyConnect = 0; | ||
| var clientConnect = 0; | ||
| var server; | ||
| var proxy; | ||
| var agent; | ||
| server = https.createServer({ | ||
| key: serverKey, | ||
| cert: serverCert, | ||
| ca: [client1CA], | ||
| requestCert: true, | ||
| rejectUnauthorized: true | ||
| }, function(req, res) { | ||
| tunnel.debug('SERVER: got request'); | ||
| ++serverConnect; | ||
| res.writeHead(200); | ||
| res.end('Hello' + req.url); | ||
| tunnel.debug('SERVER: sending response'); | ||
| }); | ||
| server.listen(serverPort, setupProxy); | ||
| function setupProxy() { | ||
| proxy = https.createServer({ | ||
| key: proxyKey, | ||
| cert: proxyCert, | ||
| ca: [client2CA], | ||
| requestCert: true, | ||
| rejectUnauthorized: true | ||
| }, function(req, res) { | ||
| should.fail(); | ||
| }); | ||
| proxy.on('upgrade', onConnect); // for v0.6 | ||
| proxy.on('connect', onConnect); // for v0.7 or later | ||
| function onConnect(req, clientSocket, head) { | ||
| tunnel.debug('PROXY: got CONNECT request'); | ||
| req.method.should.equal('CONNECT'); | ||
| req.url.should.equal('localhost:' + serverPort); | ||
| req.headers.should.not.have.property('transfer-encoding'); | ||
| ++proxyConnect; | ||
| var serverSocket = net.connect(serverPort, function() { | ||
| tunnel.debug('PROXY: replying to client CONNECT request'); | ||
| clientSocket.write('HTTP/1.1 200 Connection established\r\n\r\n'); | ||
| clientSocket.pipe(serverSocket); | ||
| serverSocket.write(head); | ||
| serverSocket.pipe(clientSocket); | ||
| // workaround, see joyent/node#2524 | ||
| serverSocket.on('end', function() { | ||
| clientSocket.end(); | ||
| }); | ||
| }); | ||
| } | ||
| proxy.listen(proxyPort, setupClient); | ||
| } | ||
| function setupClient() { | ||
| agent = tunnel.httpsOverHttps({ | ||
| maxSockets: poolSize, | ||
| // client certification for origin server | ||
| key: client1Key, | ||
| cert: client1Cert, | ||
| ca: [serverCA], | ||
| rejectUnauthroized: true, | ||
| proxy: { | ||
| port: proxyPort, | ||
| // client certification for proxy | ||
| key: client2Key, | ||
| cert: client2Cert, | ||
| ca: [proxyCA], | ||
| rejectUnauthroized: true | ||
| } | ||
| }); | ||
| for (var i = 0; i < N; ++i) { | ||
| doClientRequest(i); | ||
| } | ||
| function doClientRequest(i) { | ||
| tunnel.debug('CLIENT: Making HTTPS request (%d)', i); | ||
| var req = https.get({ | ||
| port: serverPort, | ||
| path: '/' + i, | ||
| agent: agent | ||
| }, function(res) { | ||
| tunnel.debug('CLIENT: got HTTPS response (%d)', i); | ||
| res.setEncoding('utf8'); | ||
| res.on('data', function(data) { | ||
| data.should.equal('Hello/' + i); | ||
| }); | ||
| res.on('end', function() { | ||
| ++clientConnect; | ||
| if (clientConnect === N) { | ||
| proxy.close(); | ||
| server.close(); | ||
| } | ||
| }); | ||
| }); | ||
| } | ||
| } | ||
| server.on('close', function() { | ||
| serverConnect.should.equal(N); | ||
| proxyConnect.should.equal(poolSize); | ||
| clientConnect.should.equal(N); | ||
| var name = 'localhost:' + serverPort; | ||
| agent.sockets.should.be.empty; | ||
| agent.requests.should.be.empty; | ||
| done(); | ||
| }); | ||
| }); | ||
| }); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
| R 380729182912Z 110314182914Z 8306BE7DE1BB099A unknown /C=US/ST=CA/L=SF/O=Joyent/OU=Node.js/CN=agent4/emailAddress=ry@tinyclouds.org |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
| all: server1-cert.pem server2-cert.pem proxy1-cert.pem proxy2-cert.pem client1-cert.pem client2-cert.pem | ||
| # | ||
| # Create Certificate Authority: ca1 | ||
| # ('password' is used for the CA password.) | ||
| # | ||
| ca1-cert.pem: ca1.cnf | ||
| openssl req -new -x509 -days 9999 -config ca1.cnf -keyout ca1-key.pem -out ca1-cert.pem | ||
| # | ||
| # Create Certificate Authority: ca2 | ||
| # ('password' is used for the CA password.) | ||
| # | ||
| ca2-cert.pem: ca2.cnf | ||
| openssl req -new -x509 -days 9999 -config ca2.cnf -keyout ca2-key.pem -out ca2-cert.pem | ||
| # | ||
| # Create Certificate Authority: ca3 | ||
| # ('password' is used for the CA password.) | ||
| # | ||
| ca3-cert.pem: ca3.cnf | ||
| openssl req -new -x509 -days 9999 -config ca3.cnf -keyout ca3-key.pem -out ca3-cert.pem | ||
| # | ||
| # Create Certificate Authority: ca4 | ||
| # ('password' is used for the CA password.) | ||
| # | ||
| ca4-cert.pem: ca4.cnf | ||
| openssl req -new -x509 -days 9999 -config ca4.cnf -keyout ca4-key.pem -out ca4-cert.pem | ||
| # | ||
| # server1 is signed by ca1. | ||
| # | ||
| server1-key.pem: | ||
| openssl genrsa -out server1-key.pem 1024 | ||
| server1-csr.pem: server1.cnf server1-key.pem | ||
| openssl req -new -config server1.cnf -key server1-key.pem -out server1-csr.pem | ||
| server1-cert.pem: server1-csr.pem ca1-cert.pem ca1-key.pem | ||
| openssl x509 -req \ | ||
| -days 9999 \ | ||
| -passin "pass:password" \ | ||
| -in server1-csr.pem \ | ||
| -CA ca1-cert.pem \ | ||
| -CAkey ca1-key.pem \ | ||
| -CAcreateserial \ | ||
| -out server1-cert.pem | ||
| # | ||
| # server2 is signed by ca1. | ||
| # | ||
| server2-key.pem: | ||
| openssl genrsa -out server2-key.pem 1024 | ||
| server2-csr.pem: server2.cnf server2-key.pem | ||
| openssl req -new -config server2.cnf -key server2-key.pem -out server2-csr.pem | ||
| server2-cert.pem: server2-csr.pem ca1-cert.pem ca1-key.pem | ||
| openssl x509 -req \ | ||
| -days 9999 \ | ||
| -passin "pass:password" \ | ||
| -in server2-csr.pem \ | ||
| -CA ca1-cert.pem \ | ||
| -CAkey ca1-key.pem \ | ||
| -CAcreateserial \ | ||
| -out server2-cert.pem | ||
| server2-verify: server2-cert.pem ca1-cert.pem | ||
| openssl verify -CAfile ca1-cert.pem server2-cert.pem | ||
| # | ||
| # proxy1 is signed by ca2. | ||
| # | ||
| proxy1-key.pem: | ||
| openssl genrsa -out proxy1-key.pem 1024 | ||
| proxy1-csr.pem: proxy1.cnf proxy1-key.pem | ||
| openssl req -new -config proxy1.cnf -key proxy1-key.pem -out proxy1-csr.pem | ||
| proxy1-cert.pem: proxy1-csr.pem ca2-cert.pem ca2-key.pem | ||
| openssl x509 -req \ | ||
| -days 9999 \ | ||
| -passin "pass:password" \ | ||
| -in proxy1-csr.pem \ | ||
| -CA ca2-cert.pem \ | ||
| -CAkey ca2-key.pem \ | ||
| -CAcreateserial \ | ||
| -out proxy1-cert.pem | ||
| # | ||
| # proxy2 is signed by ca2. | ||
| # | ||
| proxy2-key.pem: | ||
| openssl genrsa -out proxy2-key.pem 1024 | ||
| proxy2-csr.pem: proxy2.cnf proxy2-key.pem | ||
| openssl req -new -config proxy2.cnf -key proxy2-key.pem -out proxy2-csr.pem | ||
| proxy2-cert.pem: proxy2-csr.pem ca2-cert.pem ca2-key.pem | ||
| openssl x509 -req \ | ||
| -days 9999 \ | ||
| -passin "pass:password" \ | ||
| -in proxy2-csr.pem \ | ||
| -CA ca2-cert.pem \ | ||
| -CAkey ca2-key.pem \ | ||
| -CAcreateserial \ | ||
| -out proxy2-cert.pem | ||
| proxy2-verify: proxy2-cert.pem ca2-cert.pem | ||
| openssl verify -CAfile ca2-cert.pem proxy2-cert.pem | ||
| # | ||
| # client1 is signed by ca3. | ||
| # | ||
| client1-key.pem: | ||
| openssl genrsa -out client1-key.pem 1024 | ||
| client1-csr.pem: client1.cnf client1-key.pem | ||
| openssl req -new -config client1.cnf -key client1-key.pem -out client1-csr.pem | ||
| client1-cert.pem: client1-csr.pem ca3-cert.pem ca3-key.pem | ||
| openssl x509 -req \ | ||
| -days 9999 \ | ||
| -passin "pass:password" \ | ||
| -in client1-csr.pem \ | ||
| -CA ca3-cert.pem \ | ||
| -CAkey ca3-key.pem \ | ||
| -CAcreateserial \ | ||
| -out client1-cert.pem | ||
| # | ||
| # client2 is signed by ca4. | ||
| # | ||
| client2-key.pem: | ||
| openssl genrsa -out client2-key.pem 1024 | ||
| client2-csr.pem: client2.cnf client2-key.pem | ||
| openssl req -new -config client2.cnf -key client2-key.pem -out client2-csr.pem | ||
| client2-cert.pem: client2-csr.pem ca4-cert.pem ca4-key.pem | ||
| openssl x509 -req \ | ||
| -days 9999 \ | ||
| -passin "pass:password" \ | ||
| -in client2-csr.pem \ | ||
| -CA ca4-cert.pem \ | ||
| -CAkey ca4-key.pem \ | ||
| -CAcreateserial \ | ||
| -out client2-cert.pem | ||
| clean: | ||
| rm -f *.pem *.srl | ||
| test: client-verify server2-verify proxy1-verify proxy2-verify client-verify |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
| var fs = require('fs'); | ||
| var tls = require('tls'); | ||
| var server1Key = fs.readFileSync(__dirname + '/server1-key.pem'); | ||
| var server1Cert = fs.readFileSync(__dirname + '/server1-cert.pem'); | ||
| var clientKey = fs.readFileSync(__dirname + '/client-key.pem'); | ||
| var clientCert = fs.readFileSync(__dirname + '/client-cert.pem'); | ||
| var ca1Cert = fs.readFileSync(__dirname + '/ca1-cert.pem'); | ||
| var ca3Cert = fs.readFileSync(__dirname + '/ca3-cert.pem'); | ||
| var server = tls.createServer({ | ||
| key: server1Key, | ||
| cert: server1Cert, | ||
| ca: [ca3Cert], | ||
| requestCert: true, | ||
| rejectUnauthorized: true, | ||
| }, function(s) { | ||
| console.log('connected on server'); | ||
| s.on('data', function(chunk) { | ||
| console.log('S:' + chunk); | ||
| s.write(chunk); | ||
| }); | ||
| s.setEncoding('utf8'); | ||
| }).listen(3000, function() { | ||
| var c = tls.connect({ | ||
| host: 'localhost', | ||
| port: 3000, | ||
| key: clientKey, | ||
| cert: clientCert, | ||
| ca: [ca1Cert], | ||
| rejectUnauthorized: true | ||
| }, function() { | ||
| console.log('connected on client'); | ||
| c.on('data', function(chunk) { | ||
| console.log('C:' + chunk); | ||
| }); | ||
| c.setEncoding('utf8'); | ||
| c.write('Hello'); | ||
| }); | ||
| c.on('error', function(err) { | ||
| console.log(err); | ||
| }); | ||
| }); |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 4 instances in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 4 instances in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
2
-71.43%5
-76.19%64886
-19.31%12
-84.21%231
-77.72%