Date | Commit message (Collapse) |
|
Instance variables are expensive and we'd be encouraging
something like a thread-safe mentality for using ivars
when dealing with things that are global to the entire
process.
|
|
Since file descriptors are only private to a process,
do not treat them as Object-specific.
|
|
This leads to a ~10% improvement in test/benchmark/request.rb
Some of these changes will need to be reworked for
multi-threaded servers (Mongrel); but Unicorn will always be
single-threaded.
|
|
* commit 'v0.5.4':
unicorn 0.5.4
Fix data corruption with small uploads via browsers
Conflicts:
lib/unicorn/http_request.rb
|
|
|
|
I've experienced occasional problems with this so it's
probably best to stay on the safe side.
|
|
|
|
It was just a waste of space and would've caused line wrapping.
This reinstates the "unicorn" prefix when we create tempfiles,
too.
|
|
|
|
StringIO.new(partial_body) does not update the offset for new
writes. So instead create the StringIO object and then syswrite
to it and try to follow the same code path used by large uploads
which use Tempfiles.
|
|
StringIO.new(partial_body) does not update the offset for new
writes. So instead create the StringIO object and then syswrite
to it and try to follow the same code path used by large uploads
which use Tempfiles.
|
|
Installation dependencies weren't being resolved correctly
(since "install-test") wasn't .PHONY. Removed the
"install-test" target entirely since it should never
be invoked by hand.
On the other hand, "ragel" can be useful to invoke by hand
so add a target for that.
|
|
|
|
|
|
They aren't common, but apparently there exist
URLs with them, so we'll support them.
|
|
It's pointless to support multiple instances of it since
this is per-process. However, the constant itself is now
modifiable if anybody needs to tweak things for reexecution
using a before_exec hook.
|
|
We no longer have anything outside of SocketHelper module in
that file, so just give it a more obvious name.
|
|
This removes the #unicorn_peeraddr methods from TCPSocket and
UNIXSocket core classes. Instead, just move that logic into the
only place it needs to be used in HttpRequest.
|
|
This avoids creating yet another binding. socket.syswrite()
should really only be called once since we use blocking sockets,
but just in case, we emulate a do+while loop with begin+while
|
|
We now parse the scheme, host and port from Absolute URIs and
ignore them if the equivalents are specified in the other
headers.
|
|
Use the "do {} while (0)" idiom to wrap the macros we can
wrap to avoid having to worry about semi-colons when using
them.
Unfortunately DEF_MAX_LENGTH can't be wrapped with "do {} while
(0)". But we do now correctly constify the strings
DEF_MAX_LENGTH creates and also make them static to reduce
visibility.
|
|
This means "Host: foo-bar:" (trailing colon) will assume
server_port is 80, not a blank string.
|
|
While we're at it, replace a bunch of zero assignments
with a memset to avoid forgetting a struct element in
case we change the struct.
|
|
I don't see the point of using a macro here as it's never called
in a hot path. It's a very minor size reduction in the binary,
but also makes the rest of the code less noisy/screamy.
|
|
There's no point in having redefinable callbacks if they're
always going to be pointed to the same function. This reduces
the size of the http_parser structure to half its original size.
This change may actually make more sense in servers Mongrel/Thin
than Unicorn since Unicorn only has one parser per-process while
other servers can have hundreds or even thousands.
|
|
|
|
|
|
It's fast under 1.8, but 1.9 performance is really
terrible, so run the tests in parallel.
|
|
|
|
Otherwise applications can change them behind our back
and affect subsequent requests.
|
|
We don't do anything special with content length in the parser
other than forcing the headers without the "HTTP_" prefix for
Rack-compliance.
|
|
It's part of the HTTP/1.1 (rfc2616), so we might as well
handle it in there and set PATH_INFO while we're at it.
Also, make "OPTIONS *" test not fail Rack::Lint
|
|
I have a nice hook in git that complains when trailing
whitespace is present.
|
|
|
|
Remove ctype.h and stdio.h #includes. We avoid ctype.h
functions since it is locale-dependent and HTTP itself is
locale-independent.
Also, regenerate http11_parser.c against Ragel 6.4
|
|
Sockets always return binary encoded data, so when
StringIO.new(string) is called, that StringIO object inherits
the encoding of the initial string it was created with.
And yes, Ruby 1.9 still makes me seriously uncomfortable with
I/O manipulation since the encoding layer does things behind my
back. UNIX is (and should always be) just a bag of bytes!
Signed-off-by: Eric Wong <normalperson@yhbt.net>
|
|
|
|
Avoid creating new string objects and then discarding them right
away by stuffing non-constant but always-present headers into
the initial output.
|
|
We never use it anywhere explicitly for hash lookups
|
|
Oops, that was not just speculative accept(), but
spammy accept()...
|
|
Help me ensure we never forget to run tests again.
|
|
This was broken in 66841a0164bc03eddb7a6ac31e3923302dbc5146:
ensure responses always have the "Status:" header
|
|
|
|
|
|
Trailing whitespace glows *RED* every time I open
this file to edit a constant and that annoys me.
|
|
|
|
The $(test_prefix)/.stamp file must be a dependency of the
parent make process otherwise the slow %.n children won't be
able to communicate the dependency up to the other non-slow
tests.
|
|
There are weird (and possibly broken) clients out there that
require it despite being present in the first line of the
response. So be nice and accomodate them. Keep in mind that
the Rack SPEC explicitly forbids this header from being in the
headers returned by the Rack-based application; so we have to
always inject it ourselves and ignore it if the application
sets it.
|
|
Also, some minor cleanups and branch refactoring.
|
|
Ensure we always fchmod our tempfile in case of client error to
avoid getting nuked in the next request cycle. Also, kill off
some unnecessary variables since this method has too many
variables anyways and we can overload the "nr" counter to do
what "accepted" and "reopen_logs" did..
|