Commit Graph

268 Commits

Author SHA1 Message Date
Stephen Halter 35bbddf9b5 Merge branch 'benaadams/listener-primary-alloc' into dev 2015-11-04 10:14:52 -08:00
Stephen Halter 04b2885f10 Merge branch 'benaadams/listener-allocation' into dev 2015-11-04 10:12:33 -08:00
Stephen Halter f4be290d4a Merge branch 'benaadams/connection-allocs' into dev 2015-11-04 10:08:36 -08:00
Ben Adams cc84097016 Listener - remove closure allocation 2015-11-04 12:36:32 +00:00
Ben Adams 1d4b9d6633 ListenerPrimary - reduce closure allocation
Still captures string pipeName
2015-11-04 12:33:51 +00:00
Ben Adams d104e8a08d Reduce delegate allocation 2015-11-04 12:31:44 +00:00
Ben Adams 34c1a671f0 ListenerSecondary - reduce closure allocation 2015-11-04 12:20:00 +00:00
Ben Adams c113c0d3a2 Don't alloc array per header
i.e `new StringValues(string)` rather than `new StringValues(new [] {
string } )`
2015-11-04 07:11:55 +00:00
Ben Adams ea6f6b10dc Don't capture connection on closure 2015-11-01 13:27:17 +00:00
John Luo b466c3b7d7 Reacting to Hosting changes 2015-10-30 14:19:55 -07:00
Stephen Halter fe654598f6 Merge branch 'release' into dev 2015-10-29 14:30:02 -07:00
Troy Dai e9a6061023 Make Frame implements IHttpConnectionFeature
Provide RemoteIPAddress as well as RemotePort
2015-10-29 10:08:35 -07:00
Ben Adams bdadc8a3da Move comment into loop, remove noop 2015-10-28 22:44:35 +00:00
Ben Adams 4bba074d77 Read to null buffer
Read to null buffer rather than Stream.Null as the CopyToAsync will
create a `new byte[]` on each call
bc14660885/src/mscorlib/src/System/IO/Stream.cs (L218)
of size 81920 bytes!
bc14660885/src/mscorlib/src/System/IO/Stream.cs (L48)
2015-10-28 08:53:11 +00:00
Stephen Halter fb01ea3918 Consume the full request body when the app does not 2015-10-26 11:13:07 -07:00
Stephen Halter 094b8efbf8 Properly handle headers with empty values 2015-10-25 01:40:22 -07:00
Troy Dai 52f4fa91e3 Unescape string in memory
1. In place unescape;
1. UTF-8 verification;
2. MemoryPoolIterator2.Put
3. Tests
2015-10-23 15:26:59 -07:00
Ryan Nowak f88631efb3 React to breaking changes in StringValues 2015-10-23 15:05:09 -07:00
Pranav K dea782163d Updating packages to use generations 2015-10-22 15:18:49 -07:00
Troy Dai a1e4e022b9 Clean up 2015-10-21 22:08:03 -07:00
Stephen Halter 8f0d1179ab Allow Nagle’s algorithm to be disabled via IKestrelServerInformation.NoDelay 2015-10-19 12:44:21 -07:00
Stephen Halter c809beec18 Don't allocate Exceptions unnecessarily
- Allocate Exceptions in the ReadStart callbacks if necessary instead
  of in UvStreamHandle.
- This also fixes a bug in ListenerSecondary where it should have
  previously been looking at the error code instead of the read count.

#237
2015-10-16 15:25:37 -07:00
Stephen Halter 8e818e3549 Address PR feedback 2015-10-15 16:52:37 -07:00
Stephen Halter 7b315d2470 Close connection gracefully in Frame.ProduceEnd
- Try sending a FIN before closing the socket
- Don't attempt to send a FIN twice for the same connection
2015-10-15 15:35:40 -07:00
Stephen Halter 513abb4561 Log errors in OnStarting and OnCompleted 2015-10-15 15:35:38 -07:00
Stephen Halter b98425d3b1 Log unhandled exceptions thrown from the AppFunc 2015-10-15 15:35:36 -07:00
Stephen Halter 7c27c5c0e7 Better handle blocks not taken taken from slabs
- If the block needs to be larger than 4032 bytes it won't be backed by a slab
2015-10-14 16:05:35 -07:00
Chris R cfe6e22a29 React to IHeaderDictionary changes. 2015-10-12 09:29:34 -07:00
Stephen Halter 3eec43a0c3 Move static BitCount method to base class
- Updated comment to point to a specific commit in corefx
- This is more consistent with AppendValue since BitCount doesn't need
  to be generated
2015-10-09 17:27:33 -07:00
Stephen Halter a33a5d0f1b Merge branch 'benaadams/bitcount-fast' into dev 2015-10-09 17:17:03 -07:00
Louis DeJardin 78177e7082 Fixing rebase errors 2015-10-09 13:26:34 -07:00
Louis DeJardin 6ae0f5d505 PR feedback - code formatting 2015-10-09 13:19:10 -07:00
Louis DeJardin 29b0b124ee Moving non-changing methods into .cs partial 2015-10-09 13:19:09 -07:00
Ben Adams ccfeef6353 All features to have backing object 2015-10-09 13:18:32 -07:00
Ben Adams 8f41e47eca Remove bitfield for locally implemented interface items
Only generate type statics for cached features
2015-10-09 13:18:09 -07:00
Ben Adams 3c20053d9a Don used cached typeof for tests 2015-10-09 13:15:39 -07:00
Ben Adams 56893df7f9 Don't iterate overriden features twice 2015-10-09 13:11:48 -07:00
Louis DeJardin cbc3b4e6f5 PR Feedback
* Sorting namespaces
* Removing `as` casting for Frame's implemented interfaces
2015-10-09 13:10:27 -07:00
Ben Adams 6b0fa776ca More comment clarity 2015-10-09 12:16:54 -07:00
Ben Adams 47973541b5 Remove redundant cast 2015-10-09 12:16:53 -07:00
Ben Adams e107c47913 Add comment explanation 2015-10-09 12:16:52 -07:00
Ben Adams 05702e81e6 more typeof caching 2015-10-09 12:16:50 -07:00
Ben Adams d48a27dd59 Use bitflag for override and cache typeof in statics 2015-10-09 12:16:49 -07:00
Louis DeJardin dcf591c832 Rough implementation of feature collection optimization 2015-10-09 12:16:48 -07:00
Ben Adams 4250d35347 PR feeback 2015-10-08 01:11:41 -04:00
Ben Adams 8bf2c814d6 Add BitCount LongExtensions 2015-10-07 12:23:20 -04:00
Stephen Halter 2f3a00625a Initial work to support HTTPS using SslStream
- Add extension method "UseKestrelHttps" to IApplicationBuilder
2015-10-05 03:15:18 -07:00
Pranav K 49451fb11e Renaming Microsoft.Framework.* -> Microsoft.Extensions.* 2015-10-03 15:44:45 -07:00
Stephen Halter 6d3e5d3bf2 Merge branch 'benaadams/fastpath-header-enumerator' into dev 2015-09-28 12:21:58 -07:00
Stephen Halter f0137b7b9e Bind to specific IP addresses if provided with any
This still only applies to IPv4.

#98
2015-09-25 16:26:01 -07:00
Ben Adams 1718b69f22 Fast path header enumerator
Use strongly typed enumerable as interface's allocates.
2015-09-26 00:16:42 +01:00
damianedwards a7b65efa75 CR feedback 2015-09-25 14:59:47 -07:00
damianedwards 3c2408db68 Fix tests after rebase 2015-09-25 14:59:47 -07:00
damianedwards 7c46b2bd3b Use a timer to generate the value for the Date header in responses:
- Doing it on each request is expensive
- The Timer is started when the first request comes in and fires every second
- Every request flips a bool so the Timer knows requests are coming in
- The Timer stops itself after a period of no requests coming in (10 seconds)
- #163
2015-09-25 14:59:47 -07:00
Louis DeJardin 318f3b7145 Changing Trace.Assert to Debug.Assert
* Also Debug.Assert for unreturned memory blocks
2015-09-25 13:01:54 -07:00
Louis DeJardin 0adbbd0217 Using the well-known-header field without checking set bit 2015-09-25 12:49:29 -07:00
Stephen Halter dc902f5fc4 Update SocketOutput to not call QueueUserWorkItem unnecessarily 2015-09-25 12:49:28 -07:00
Louis DeJardin 789d5b3595 Writes which are not immediate always return completed tasks
They must always be followed with Writes which are immediate, and
returning an incomplete task put them in a state where the callback
might not have been initiated.
2015-09-25 12:49:27 -07:00
Louis DeJardin 5e678fdbaa Adding volatile keyword to stopping boolean 2015-09-25 12:49:27 -07:00
Louis DeJardin 99fc7e4e50 Moving the Start/Stop logic into Frame.
Also formalizes the relationship between the function's Task and
how it relates to graceful shutdown. Specifically how it relates
to finishing the requests currently in progress.
2015-09-25 12:49:26 -07:00
Louis DeJardin c424b8437c Renaming based on PR feedback 2015-09-25 12:49:24 -07:00
Louis DeJardin 844c791b16 Processing function should return Task 2015-09-25 12:49:23 -07:00
Louis DeJardin 091084cfe2 Refactoring MemoryPool class locations
Moving Iterator out into its own file rather than being a nested class
Moving pool classes into Infrastructure namespace instead of Http
2015-09-25 12:49:23 -07:00
Louis DeJardin 13defc5a32 Initialize Memory2 in ListenerContext
Better than initializing from multiple other classes
2015-09-25 12:49:22 -07:00
Louis DeJardin 5ba1b9fb3c Secondary listeners need to allocate their own memory pool 2015-09-25 12:49:21 -07:00
Louis DeJardin 6db3d9e645 Using specific exception types 2015-09-25 12:49:21 -07:00
Louis DeJardin 76b528e1d2 Adding comments to MemoryPool classes 2015-09-25 12:49:20 -07:00
Louis DeJardin ff0affe34d Removing _frameTask and fixing Task.Run argument 2015-09-25 12:49:19 -07:00
Louis DeJardin 30ec2cb0b1 Harden framing epilog
* Connection no longer needes Frame's processing Task
* Any exceptions from unusual processing is logged
2015-09-25 12:49:19 -07:00
Louis DeJardin 28250d9981 Providing Path to application 2015-09-25 12:49:18 -07:00
Louis DeJardin 04f6446a50 Updates for PR feedback 2015-09-25 12:49:18 -07:00
Louis DeJardin d3a87c4c14 Removing MessageBodyExchanger base class 2015-09-25 12:49:17 -07:00
Louis DeJardin 52dc37eae7 Fixing a header parsing bug
When request header data arrives with \r\n split across packets
2015-09-25 12:49:16 -07:00
Louis DeJardin e5a3bda3a2 Progress on flow control
* Dealing with race conditions
* Reworking iterator methods
* Shutdown and Close need to be passed throught the write-behind mechanism
2015-09-25 12:49:15 -07:00
Louis DeJardin 4193c92ba7 Fixing merge conflicts 2015-09-25 12:49:15 -07:00
Louis DeJardin 1f6aaebeda Changing flow control for incoming data
SocketInput is now awaitable
Input buffers are slab-allocated and pinned from large object heap
Request frame parsing is offloaded from libuv thread
2015-09-25 12:49:14 -07:00
Louis DeJardin 557f6d6993 Refactoring response control flow
- Bring through both sync and async execution paths
- Remove callback pattern from from and socketoutput write calls
2015-09-25 12:47:51 -07:00
Stephen Halter 47323a88e1 Surface errors from Listener.StartAsync better
If CreateListenSocket fails, surface the original error instead of throwing a
NullReferenceException from Listener.Dispose().

#185
2015-09-16 18:19:01 -07:00
Stephen Halter 2d01f2752b Catch and log uv_accept errors
- This is also what is done by node.js
- "tcp, pipe: don't assert on uv_accept() errors (Ben Noordhuis)"

0685707bc6
2015-09-16 18:18:58 -07:00
Stephen Halter f14af1f409 Don't swallow too many exceptions
- Swallowing too many exceptions can end up hiding issues in
  Kestrel itself. It's better to let the process die.
- If we want to handle certain exceptions we should be as
  specific as possible with our try/catch blocks.
2015-09-16 18:18:55 -07:00
Stephen Halter 1ebf98d40d Log message style changes
- Disabled some log messages for possibly being too verbose.
- Don't log ConnectionReadFin when there is an error.
2015-09-10 11:41:25 -07:00
Stephen Halter 0ef096b41c Increment connection id for logging 2015-09-10 11:41:22 -07:00
Stephen Halter dc08062545 Merge branch 'drussilla/add-logging' into dev
Conflicts:
	src/Microsoft.AspNet.Server.Kestrel/Http/Connection.cs
	src/Microsoft.AspNet.Server.Kestrel/Http/ListenerSecondary.cs
2015-09-09 11:28:09 -07:00
Ivan Derevyanko ac77c11211 Make ConnectionCallback static again. 2015-09-09 02:13:49 +02:00
Stephen Halter 2041e4d08b Prevent pipes from being closed prematurely on OS X and Linux
This change fixes the in-process marshalling of TCP handles on Mac and Linux
that is used to support having multiple threads accepting connections from
multiple loops.

On these two platforms, the ReadStart callback somtimes gets called with a
status and pipe_pending_count equal to zero. Now when the status is zero
just exit the callback without closing the pipe.

This change more closely follows the example at
https://nikhilm.github.io/uvbook/processes.html#sending-file-descriptors-over-pipes
2015-09-08 16:21:45 -07:00
Ivan Derevyanko a93a66fe7c Replace Trace.WriteLine with ITraceLogger 2015-09-09 00:26:26 +02:00
Ivan Derevyanko 6d47227975 KestrelTrace refactored and added to the ServiceContext. Close aspnet/KestrelHttpServer#141 2015-09-05 18:17:17 +02:00
Kai Ruhnau 5ee80e0155 Fix bug #191 introduced by b25d2d9 2015-09-05 12:29:00 +02:00
Stephen Halter f10c989d90 Add ServiceContext to make it easier to flow new services through ctors 2015-09-04 15:04:25 -07:00
Louis DeJardin c50aec1729 Adding comments to meaningless field names 2015-09-02 21:14:18 -07:00
Louis DeJardin 5c7007a4e9 Fixing member field name 2015-09-02 20:37:11 -07:00
Louis DeJardin 0859d82d6b Adding private keyword to private enums 2015-09-02 20:33:51 -07:00
Louis DeJardin 3bbb77f9d0 Alphabetizing using statements 2015-09-02 20:31:11 -07:00
Louis DeJardin b25d2d9772 Continued updates for #184
* Reordering members
- Fields
- Constructors
- Properties
- EverythingElse
- NestedTypes

* Removing commented code
2015-09-02 20:08:54 -07:00
Louis DeJardin 2467cf2ade Nested types must be last 2015-09-02 00:07:58 -07:00
Louis DeJardin 46604d68b3 Initial commit for style cleanup #184
* adding private keyword to fields
* one type per file
2015-09-01 22:25:51 -07:00
Stephen Halter a919ea8d0a Remove unnecessary listener interfaces 2015-08-31 10:46:46 -07:00
Stephen Halter a9b8cfa582 Remove unnecessary use of generics in listeners 2015-08-31 10:46:40 -07:00
Chris R 803ec38073 React to string[] -> StringValues changes. 2015-08-28 12:59:00 -07:00
Stephen Halter 40ca61b640 Merge branch 'release' into dev 2015-08-26 16:32:19 -07:00
Stephen Halter 2642c84bf9 Don't automatically set Content-Length: 0 in some circumstances
- When in response to a HEAD Request
- For 101, 204, 205 and 304 responses
- For non keep-alive connections
2015-08-26 16:16:35 -07:00
Stephen Halter 69759231ff Set Content-Length: 0 when an AppFunc completes without a write
- Previously an incomplete chunked response would be written instead.
- Add test to verify Content-Length: 0 is set automatically.
- Add test to verify HTTP/1.0 keep-alive isn't used if no Content-Length
  is set for the response.
- Add tests to verify errors are handled properly after chunked writes.

#173
2015-08-25 23:17:41 -07:00
Daniel Lo Nigro 9ade227abb Implement support for UNIX sockets.
The common use-case for Kestrel in production will be behind a reverse proxy such as Nginx. In cases where the reverse proxy is located on the same machine as the application, connecting via a UNIX socket is more efficient than a TCP socket, as it avoids going through the network layer. Accessing 127.0.0.1 through TCP still needs to initiate a TCP connection and perform handshaking, checksumming, etc, all of which is avoided by using UNIX sockets.

 - Moved TCP-specific stuff from Listener into new TcpListener class (same with ListenerPrimary and ListenerSecondary)
 - Made Listener abstract
 - Created new PipeListener. Note that while the use case is for UNIX sockets, this is called "Pipe" in uv, so I've called this "PipeListener" so the terminology is consistant
 - Uses "unix" URL scheme to determine whether to use socket. "http://127.0.0.1:5000" is for listening via TCP while "unix:///var/run/kestrel-test.sock" is for listening via UNIX socket

#156
2015-08-15 15:50:34 -07:00
Stephen Halter 753d64660d Ignore zero length writes when automatically chunking responses
- Zero length writes would previously be interpreted as the end of response
- Optimize writing the chunked response suffix
- Add tests for automatic response chunking
2015-08-14 15:59:47 -07:00
Stephen Halter 3fb33119ee Initial non-optimized support for automatically chunking responses 2015-08-14 15:59:39 -07:00
Stephen Halter 32c4f314b6 Lock around Connection.End to make it thread-safe 2015-08-14 12:17:06 -07:00
Stephen Halter 4f0480a4d0 Gracefully handle exceptions thrown from OnStarting callbacks
- If OnStarting is being called after the app func has completed, return a 500.
- If Onstarting is being called due to a call to write, throw from write.
2015-08-14 12:05:43 -07:00
Stephen Halter 6a01043e1a Fix ListenerSecondary so it reliably accepts new connections on Windows
Calling uv_read_start on a named pipe with a larger than necessary buffer
would cause pieces of the next uv_ipc_frame_uv_stream struct to be read into
the uv_read_start buffer when a lot of tcp handles were passed quickly over
the pipe.

This prevented the struct from properly being queued for the next call to
uv_accept to consume. The empty queue caused the call to uv_accept in
ListenerSecondary to fail and return WSAEWOULDBLOCK leaving the connection
in a zombie state.
2015-08-14 11:57:21 -07:00
Stephen Halter c0cc511b5b Prevent access to closed socket in in Connection.End 2015-08-14 11:49:45 -07:00
Stephen Halter b162202519 Properly close keep alive connections 2015-08-14 11:49:43 -07:00
Stephen Halter 0ac3c3dad6 More ConfigureAwait(false) 2015-08-11 12:46:08 -07:00
Stephen Halter 688ad9bee7 Merge branch 'benaadams/configure-awaits' into dev 2015-08-11 12:34:53 -07:00
Stephen Halter e5144e3139 Include Server and Date in the initial response header dictionary 2015-08-03 16:20:34 -07:00
Stephen Halter 7446fe4cc7 Update SocketOutputTests to account for the "immediate" Write param 2015-08-03 16:20:30 -07:00
Louis DeJardin 6ff894bb19 Using masked byte sequences to recognize well-known header names 2015-08-03 16:20:28 -07:00
Louis DeJardin b999b47218 String concatination showed up in profiler 2015-08-03 16:20:26 -07:00
Louis DeJardin f6dc72544c Response headers don't need to be queued before subsequent write 2015-08-03 16:20:24 -07:00
Louis DeJardin c0728edda7 Linq .Any() was causing enumeration 2015-08-03 16:20:22 -07:00
Louis DeJardin f9cf9f1936 Improvements to appending request header 2015-08-03 16:20:20 -07:00
Louis DeJardin 96b03ee212 Perf - enumerate with struct
Conflicts:
	src/Microsoft.AspNet.Server.Kestrel/project.json
2015-08-03 16:20:18 -07:00
Louis DeJardin 963f086eb0 Prototypeing a fast header dictionary
Conflicts:
	src/Microsoft.AspNet.Server.Kestrel/project.json
2015-08-03 16:20:14 -07:00
Stephen Halter 4a9515d2e0 Gracefully handle uncaught exceptions in user code when possible 2015-07-30 16:01:33 -07:00
Troy Dai 07de3cafd1 Clean build warnings 2015-07-30 12:14:13 -07:00
Stephen Halter 47d7f73bdc Fix SocketOutput so that it can now complete large writes
- Complete in this context means that the callback gets invoked.
- Previously, calls to write would never complete if the buffer contained
  more than 64 KB (_maxBytesPreCompleted).
- This is tested by SocketOutputTests.CanWrite1MB.
2015-07-28 16:57:24 -07:00
Stephen Halter c345849707 Don't use QueueUserWorkItem to trigger write callbacks immediately
- In this case we are off the event loop, so we can invoke the callback directly.
- Increase _maxBytesBufferedBeforeThrottling
2015-07-28 16:57:21 -07:00
Stephen Halter 74fa82bca7 Complete WriteAsync Tasks early when there are less than 64KB buffered 2015-07-28 16:57:19 -07:00
Stephen Halter d723f9da21 Reduce calls to uv_write by calling it with multiple buffers when possible 2015-07-28 16:57:16 -07:00
Louis DeJardin baeb3e7962 Fixing write2.Dispose() to avoid creating closure 2015-07-24 15:47:31 -07:00
Louis DeJardin 17a846ad8e Method not used by descendants 2015-07-24 15:44:27 -07:00
Louis DeJardin 62ec11be7e Adding internal Constants class 2015-07-24 15:43:43 -07:00
Louis DeJardin f935567cfd Read callback status is always 0 for any error and EOF 2015-07-24 15:36:45 -07:00
Louis DeJardin 3d45602513 Catch Accept because of EAGAIN 2015-07-24 14:02:42 -07:00
Louis DeJardin 42246fd51b Using named pipes to dispatch connections to multiple threads 2015-07-24 13:50:13 -07:00
Louis DeJardin ceeb4edabd Adding UvPipeHandle 2015-07-24 13:50:10 -07:00
Stephen Halter c199e5eee1 Wait on user-defined OnStarting and OnCompleted callbacks 2015-07-21 12:44:57 -07:00
Stephen Halter b9901c3bfe Surface fatal exceptions that stop the event loop
- Request an app Shutdown so KestrelEngine gets disposed
- Ensure Listener.Dispose doesn't deadlock before the engine
  can be disposed
- Rely on the existing logic to rethrow in the fatal error when
  the engine gets disposed
2015-07-21 11:58:26 -07:00
Ben Adams 23ffc3fea9 ConfigureAwait(false) 2015-07-19 15:50:42 +01:00
Pranav K 853ee00ff5 Merge remote-tracking branch 'origin/release' into dev 2015-07-16 08:43:59 -07:00
markrendle 98995132de Pre-create Continue bytes in Frame 2015-07-13 10:43:05 -07:00
Stephen Halter 0670b7ae61 Ensure all the C# files have copyright notices 2015-07-06 17:49:00 -07:00
Stephen Halter 4b66edc4fe Move non-nested classes and interfaces to their own files 2015-07-06 17:48:58 -07:00
Hao Kung f724fefbda React to HttpChanges 2015-06-25 17:28:07 -07:00
Stephen Halter a992c78548 Dispatch user defined callback so it can't block the event loop 2015-06-15 10:07:58 -07:00
Stephen Halter 7e125faa73 Dispatch user defined callback so it can't block the event loop 2015-06-12 17:02:27 -07:00
Chris R 08c0bbbd60 React to OnSendingHeaders rename. 2015-06-12 15:05:45 -07:00
N. Taylor Mullen 063fb64c8b Update LICENSE.txt and license header on files. 2015-05-01 13:53:45 -07:00
Ajay Bhargav Baaskaran c1e298b010 React to aspnet/HttpAbstractions#160 - Implementing OnResponseCompleted 2015-03-16 15:10:53 -07:00
N. Taylor Mullen 06a82669f5 Update aspnet50/aspnetcore50 => dnx451/dnxcore50. 2015-03-08 12:51:12 -07:00
Chris Ross 045a6eb4ba Add new HeadersSent API. 2014-11-06 12:10:15 -08:00
David Fowler 418f745292 Updated to use the new target framework in project.json 2014-09-04 01:52:19 -07:00