# optimization
CFLAGS="$CFLAGS -O"
# inline functions declared with __inline
- CFLAGS="$CFLAGS -Ob1"
+ #CFLAGS="$CFLAGS -Ob1"
# inline any function, at the compiler's discretion
- #CFLAGS="$CFLAGS -Ob2"
+ CFLAGS="$CFLAGS -Ob2"
+
+ # single-file IP optimizations
+ #IPO="-ip"
+ # multi-file IP optimizations
+ IPO="-ipo -ipo_obj"
+ CFLAGS="$CFLAGS $IPO"
+ CORE_LINK="$CORE_LINK $IPO"
+ CORE_LINK="$CORE_LINK -opt_report_file=$OBJS/opt_report_file"
case $CPU in
pentium)
CFLAGS="$CFLAGS $CPU_OPT"
if [ ".$PCRE_OPT" = "." ]; then
- PCRE_OPT="-O $CPU_OPT"
+ PCRE_OPT="-O $IPO $CPU_OPT"
fi
if [ ".$MD5_OPT" = "." ]; then
- MD5_OPT="-O $CPU_OPT"
+ MD5_OPT="-O $IPO $CPU_OPT"
fi
if [ ".$ZLIB_OPT" = "." ]; then
- ZLIB_OPT="-O $CPU_OPT"
+ ZLIB_OPT="-O $IPO $CPU_OPT"
fi
# warnings
# stop on warning
CFLAGS="$CFLAGS -Werror"
+ # debug
+ CFLAGS="$CFLAGS -g"
+
have=HAVE_C99_VARIADIC_MACROS . auto/have
LINK="\$(CC)"
CORE_LIBS="$CORE_LIBS $MD5/md5.lib"
;;
+ *icc)
+ LINK_DEPS="$LINK_DEPS $MD5/libmd5.a"
+
+ # to allow -ipo optimization we link with the *.o but not library
+ CORE_LIBS="$CORE_LIBS $MD5/md5_dgst.o"
+
+ if [ $MD5_ASM = YES ]; then
+ CORE_LIBS="$CORE_LIBS $MD5/asm/mx86-elf.o"
+ fi
+ ;;
+
*)
LINK_DEPS="$LINK_DEPS $MD5/libmd5.a"
CORE_LIBS="$CORE_LIBS -L $MD5 -lmd5"
cl)
have=HAVE_PCRE . auto/have
have=PCRE_STATIC . auto/have
- CORE_DEPS="$CORE_DEPS $PCRE/pcre.lib"
+ CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"
+ LINK_DEPS="$LINK_DEPS $PCRE/pcre.lib"
CORE_LIBS="$CORE_LIBS pcre.lib"
CORE_LINK="$CORE_LINK -libpath:$PCRE"
;;
wcl386)
have=HAVE_PCRE . auto/have
have=PCRE_STATIC . auto/have
- CORE_DEPS="$CORE_DEPS $PCRE/pcre.lib"
+ CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"
+ LINK_DEPS="$LINK_DEPS $PCRE/pcre.lib"
CORE_LIBS="$CORE_LIBS $PCRE/pcre.lib"
;;
+ *icc)
+ have=HAVE_PCRE . auto/have
+ CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"
+
+ LINK_DEPS="$LINK_DEPS $PCRE/.libs/libpcre.a"
+
+ # to allow -ipo optimization we link with the *.o but not library
+ CORE_LIBS="$CORE_LIBS $PCRE/maketables.o"
+ CORE_LIBS="$CORE_LIBS $PCRE/get.o"
+ CORE_LIBS="$CORE_LIBS $PCRE/study.o"
+ CORE_LIBS="$CORE_LIBS $PCRE/pcre.o"
+ ;;
+
*)
have=HAVE_PCRE . auto/have
CORE_DEPS="$CORE_DEPS $PCRE/pcre.h"
cp auto/lib/pcre/patch.config.in $PCRE
cp auto/lib/pcre/$makefile $PCRE
- echo "$PCRE/pcre.lib:" >> $MAKEFILE
+ echo "$PCRE/pcre.h:" >> $MAKEFILE
+ echo " cd $PCRE" >> $MAKEFILE
+ echo " \$(MAKE) -f $makefile pcre.h" >> $MAKEFILE
+ echo " cd ..\\..\\.." >> $MAKEFILE
+ echo >> $MAKEFILE
+ echo "$PCRE/pcre.lib: $PCRE/pcre.h" >> $MAKEFILE
echo " cd $PCRE" >> $MAKEFILE
echo " \$(MAKE) -f $makefile CPU_OPT=$CPU_OPT LIBC=$LIBC">> $MAKEFILE
echo " cd ..\\..\\.." >> $MAKEFILE
PCREFLAGS = -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10
-pcre.lib:
- patch -o pcre.h pcre.in patch.pcre.in
- patch -o config.h config.in patch.config.in
-
+pcre.lib: pcre.h
cl -Fedftables dftables.c
dftables > chartables.c
link -lib -out:pcre.lib -verbose:lib \
maketables.obj get.obj study.obj pcre.obj
+
+pcre.h:
+ patch -o pcre.h pcre.in patch.pcre.in
+ patch -o config.h config.in patch.config.in
PCREFLAGS = -DPCRE_STATIC -DPOSIX_MALLOC_THRESHOLD=10
-pcre.lib:
- patch -o pcre.h pcre.in patch.pcre.in
- patch -o config.h config.in patch.config.in
-
+pcre.lib: pcre.h
wcl386 -zq -bt=nt -l=nt -fe=dftables dftables.c
dftables > chartables.c
wcl386 $(CFLAGS) $(PCREFLAGS) maketables.c get.c study.c pcre.c
wlib -n pcre.lib maketables.obj get.obj study.obj pcre.obj
+
+
+pcre.h:
+ patch -o pcre.h pcre.in patch.pcre.in
+ patch -o config.h config.in patch.config.in
CORE_LIBS="$CORE_LIBS $ZLIB/zlib.lib"
;;
+ *icc)
+ LINK_DEPS="$LINK_DEPS $ZLIB/libz.a"
+
+ # to allow -ipo optimization we link with the *.o but not library
+ CORE_LIBS="$CORE_LIBS $ZLIB/adler32.o"
+ CORE_LIBS="$CORE_LIBS $ZLIB/crc32.o"
+ CORE_LIBS="$CORE_LIBS $ZLIB/deflate.o"
+ CORE_LIBS="$CORE_LIBS $ZLIB/trees.o"
+ CORE_LIBS="$CORE_LIBS $ZLIB/zutil.o"
+
+ if [ $ZLIB_ASM != NO ]; then
+ CORE_LIBS="$CORE_LIBS $ZLIB/match.o"
+ fi
+ ;;
+
*)
LINK_DEPS="$LINK_DEPS $ZLIB/libz.a"
CORE_LIBS="$CORE_LIBS -L $ZLIB -lz"
HTTP_GZIP_FILTER_MODULE=ngx_http_gzip_filter_module
HTTP_GZIP_SRCS=src/http/modules/ngx_http_gzip_filter.c
-HTTP_GZIP_UNIX_LIBS=-lz
-HTTP_GZIP_WIN_LIBS=zlib.lib
HTTP_SSI_FILTER_MODULE=ngx_http_ssi_filter_module
#if !(WIN32)
|| err == NGX_EPIPE
#endif
- || err == NGX_ENOTCONN)
+ || err == NGX_ENOTCONN
+ || err == NGX_ECONNREFUSED
+ || err == NGX_EHOSTUNREACH)
{
switch (c->log_error) {
#define ngx_strncasecmp strnicmp
#define ngx_strcasecmp stricmp
-#define ngx_strncmp strncmp
-#define ngx_strcmp strcmp
-
-#define ngx_strstr strstr
-#define ngx_strlen strlen
#define ngx_snprintf _snprintf
#define ngx_vsnprintf _vsnprintf
#define ngx_strncasecmp strncasecmp
#define ngx_strcasecmp strcasecmp
-#define ngx_strncmp strncmp
-#define ngx_strcmp strcmp
-
-#define ngx_strstr strstr
-#define ngx_strlen strlen
#define ngx_snprintf snprintf
#define ngx_vsnprintf vsnprintf
#endif
+
+#define ngx_strncmp strncmp
+
+/* msvc and icc compile strcmp() to inline loop */
+#define ngx_strcmp strcmp
+
+#define ngx_strstr strstr
+#define ngx_strlen strlen
+
/*
* msvc and icc compile memset() to inline "rep stos"
* while ZeroMemory and bzero are calls.
+ *
+ * icc can also inline mov's of a zeroed register for small blocks.
*/
#define ngx_memzero(buf, n) memset(buf, 0, n)
offsetof(ngx_iocp_conf_t, threads),
NULL},
- {ngx_string("acceptex"),
+ {ngx_string("post_acceptex"),
NGX_EVENT_CONF|NGX_CONF_TAKE1,
ngx_conf_set_num_slot,
0,
- offsetof(ngx_iocp_conf_t, acceptex),
+ offsetof(ngx_iocp_conf_t, post_acceptex),
NULL},
{ngx_string("acceptex_read"),
NGX_CONF_ERROR);
cf->threads = NGX_CONF_UNSET;
- cf->acceptex = NGX_CONF_UNSET;
+ cf->post_acceptex = NGX_CONF_UNSET;
cf->acceptex_read = NGX_CONF_UNSET;
return cf;
ngx_iocp_conf_t *cf = conf;
ngx_conf_init_value(cf->threads, 0);
- ngx_conf_init_value(cf->acceptex, 10);
+ ngx_conf_init_value(cf->post_acceptex, 10);
ngx_conf_init_value(cf->acceptex_read, 1);
return NGX_CONF_OK;
typedef struct {
int threads;
- int acceptex;
+ int post_acceptex;
int acceptex_read;
} ngx_iocp_conf_t;
}
iocpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module);
- if (ngx_event_post_acceptex(&s[i], iocpcf->acceptex) == NGX_ERROR) {
+ if (ngx_event_post_acceptex(&s[i], iocpcf->post_acceptex)
+ == NGX_ERROR)
+ {
return NGX_ERROR;
}
c->fd = s;
+ c->log_error = pc->log_error;
+
pc->connection = c;
/*
if (rc == -1) {
err = ngx_socket_errno;
- /* Winsock returns WSAEWOULDBLOCK */
+ /* Winsock returns WSAEWOULDBLOCK (NGX_EAGAIN) */
if (err != NGX_EINPROGRESS && err != NGX_EAGAIN) {
- ngx_log_error(NGX_LOG_ERR, pc->log, err, "connect() failed");
+ ngx_connection_error(c, err, "connect() failed");
if (ngx_close_socket(s) == -1) {
ngx_log_error(NGX_LOG_ALERT, pc->log, ngx_socket_errno,
ngx_log_t *log;
unsigned cached:1;
+ unsigned log_error:2; /* ngx_connection_log_error_e */
} ngx_peer_connection_t;
int ngx_http_index_handler(ngx_http_request_t *r)
{
char *name;
- uint32_t crc;
size_t len;
ngx_fd_t fd;
ngx_int_t rc;
ngx_http_index_ctx_t *ctx;
ngx_http_core_loc_conf_t *clcf;
ngx_http_index_loc_conf_t *ilcf;
+#if (NGX_HTTP_CACHE)
+ uint32_t crc;
+#endif
if (r->uri.data[r->uri.len - 1] != '/') {
return NGX_DECLINED;
static ngx_int_t ngx_http_static_handler(ngx_http_request_t *r)
{
char *last;
- uint32_t file_crc, redirect_crc;
ngx_fd_t fd;
ngx_int_t rc;
ngx_uint_t level;
ngx_hunk_t *h;
ngx_chain_t out;
ngx_file_info_t fi;
- ngx_http_cache_t *file, *redirect;
ngx_http_cleanup_t *file_cleanup, *redirect_cleanup;
ngx_http_log_ctx_t *ctx;
ngx_http_core_loc_conf_t *clcf;
ngx_http_static_loc_conf_t *slcf;
+#if (NGX_HTTP_CACHE)
+ uint32_t file_crc, redirect_crc;
+ ngx_http_cache_t *file, *redirect;
+#endif
if (r->uri.data[r->uri.len - 1] == '/') {
return NGX_DECLINED;
offsetof(ngx_http_proxy_loc_conf_t, send_timeout),
NULL },
+ { ngx_string("proxy_preserve_host"),
+ NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
+ ngx_conf_set_flag_slot,
+ NGX_HTTP_LOC_CONF_OFFSET,
+ offsetof(ngx_http_proxy_loc_conf_t, preserve_host),
+ NULL },
+
{ ngx_string("proxy_set_x_real_ip"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
ngx_conf_set_flag_slot,
conf->connect_timeout = NGX_CONF_UNSET;
conf->send_timeout = NGX_CONF_UNSET;
+ conf->preserve_host = NGX_CONF_UNSET;
conf->set_x_real_ip = NGX_CONF_UNSET;
conf->add_x_forwarded_for = NGX_CONF_UNSET;
prev->connect_timeout, 60000);
ngx_conf_merge_msec_value(conf->send_timeout, prev->send_timeout, 30000);
+ ngx_conf_merge_value(conf->preserve_host, prev->preserve_host, 0);
ngx_conf_merge_value(conf->set_x_real_ip, prev->set_x_real_ip, 0);
ngx_conf_merge_value(conf->add_x_forwarded_for,
prev->add_x_forwarded_for, 0);
}
if (u->port_text.data == NULL) {
+ u->default_port = 1;
u->port = htons(80);
u->port_text.len = 2;
u->port_text.data = "80";
u->uri.len = 1;
if (u->port_text.data == NULL) {
+ u->default_port = 1;
u->port = htons(80);
u->port_text.len = 2;
u->port_text.data = "80";
ngx_str_t port_text;
ngx_str_t *location;
int port;
+ unsigned default_port:1;
} ngx_http_proxy_upstream_conf_t;
ngx_flag_t cache;
+ ngx_flag_t preserve_host;
ngx_flag_t set_x_real_ip;
ngx_flag_t add_x_forwarded_for;
p->upstream = u;
+ u->peer.log_error = NGX_ERROR_ERR;
u->peer.peers = p->lcf->peers;
u->peer.tries = p->lcf->peers->number;
+ r->uri.len - uc->location->len
+ 1 + r->args.len /* 1 is for "?" */
+ sizeof(http_version) - 1
- + sizeof(host_header) - 1 + uc->host_header.len + 2
- /* 2 is for "\r\n" */
+ sizeof(connection_close_header) - 1
+ 2; /* 2 is for "\r\n" at the header end */
- if (p->lcf->set_x_real_ip) {
- /* 2 is for "\r\n" */
+
+ if (p->lcf->preserve_host) {
+ len += sizeof(host_header) - 1
+ + r->headers_in.host_name_len
+ + 1 /* 1 is for ":" */
+ + uc->port_text.len
+ + 2; /* 2 is for "\r\n" */
+ } else { /* 2 is for "\r\n" */
+ len += sizeof(host_header) - 1 + uc->host_header.len + 2;
+ }
+
+
+ if (p->lcf->set_x_real_ip) { /* 2 is for "\r\n" */
len += sizeof(x_real_ip_header) - 1 + INET_ADDRSTRLEN - 1 + 2;
}
if (p->lcf->add_x_forwarded_for) {
if (r->headers_in.x_forwarded_for) {
- len += r->headers_in.x_forwarded_for->key.len
- + 2 /* 2 is ofr ": " */
+ len += sizeof(x_forwarded_for_header) - 1
+ r->headers_in.x_forwarded_for->value.len
+ 2 /* 2 is ofr ", " */
+ INET_ADDRSTRLEN - 1
h->last = ngx_cpymem(h->last, http_version, sizeof(http_version) - 1);
+ /* the "Connection: close" header */
+
+ h->last = ngx_cpymem(h->last, connection_close_header,
+ sizeof(connection_close_header) - 1);
+
+
/* the "Host" header */
h->last = ngx_cpymem(h->last, host_header, sizeof(host_header) - 1);
- h->last = ngx_cpymem(h->last, uc->host_header.data, uc->host_header.len);
- *(h->last++) = CR; *(h->last++) = LF;
+ if (p->lcf->preserve_host) {
+ h->last = ngx_cpymem(h->last, r->headers_in.host->value.data,
+ r->headers_in.host_name_len);
- /* the "Connection: close" header */
+ if (!uc->default_port) {
+ *(h->last++) = ':';
+ h->last = ngx_cpymem(h->last, uc->port_text.data,
+ uc->port_text.len);
+ }
- h->last = ngx_cpymem(h->last, connection_close_header,
- sizeof(connection_close_header) - 1);
+ } else {
+ h->last = ngx_cpymem(h->last, uc->host_header.data,
+ uc->host_header.len);
+ }
+ *(h->last++) = CR; *(h->last++) = LF;
/* the "X-Real-IP" header */
if (p->lcf->add_x_forwarded_for) {
if (r->headers_in.x_forwarded_for) {
- h->last = ngx_cpymem(h->last,
- r->headers_in.x_forwarded_for->key.data,
- r->headers_in.x_forwarded_for->key.len);
-
- *(h->last++) = ':'; *(h->last++) = ' ';
+ h->last = ngx_cpymem(h->last, x_forwarded_for_header,
+ sizeof(x_forwarded_for_header) - 1);
h->last = ngx_cpymem(h->last,
r->headers_in.x_forwarded_for->value.data,
void ngx_http_proxy_upstream_busy_lock(ngx_http_proxy_ctx_t *p)
{
- int rc, ft_type;
+ ngx_int_t rc;
+#if (NGX_HTTP_CACHE)
+ ngx_int_t ft_type;
+#endif
if (p->busy_lock.time == 0) {
p->busy_lock.event = p->request->connection->read;
ngx_http_busy_unlock(p->lcf->busy_lock, &p->busy_lock);
+#if (NGX_HTTP_CACHE)
+
if (rc == NGX_DONE) {
ft_type = NGX_HTTP_PROXY_FT_BUSY_LOCK;
ft_type = NGX_HTTP_PROXY_FT_MAX_WAITING;
}
-#if (NGX_HTTP_CACHE)
-
if (p->stale && (p->lcf->use_stale & ft_type)) {
ngx_http_proxy_finalize_request(p,
ngx_http_proxy_send_cached_response(p));
ep->pool = r->pool;
ep->log = r->connection->log;
+ ep->cachable = p->cachable;
+
if (!(ep->temp_file = ngx_pcalloc(r->pool, sizeof(ngx_temp_file_t)))) {
ngx_http_proxy_finalize_request(p, 0);
return;
}
- ep->cachable = p->cachable;
-
ep->temp_file->file.fd = NGX_INVALID_FILE;
ep->temp_file->file.log = r->connection->log;
ep->temp_file->path = p->lcf->temp_path;
#define NGX_ECONNRESET ECONNRESET
#define NGX_ENOTCONN ENOTCONN
#define NGX_ETIMEDOUT ETIMEDOUT
+#define NGX_ECONNREFUSED ECONNREFUSED
+#define NGX_EHOSTUNREACH EHOSTUNREACH
#define NGX_ECANCELED ECANCELED
#define NGX_ENOMOREFILES 0
#define NGX_ECONNRESET WSAECONNRESET
#define NGX_ENOTCONN WSAENOTCONN
#define NGX_ETIMEDOUT WSAETIMEDOUT
+#define NGX_ECONNREFUSED WSAECONNREFUSED
+#define NGX_EHOSTUNREACH WSAEHOSTUNREACH
#define NGX_ENOMOREFILES ERROR_NO_MORE_FILES
#define NGX_EALREADY WSAEALREADY