Mercurial > hg > nginx-quic
view src/core/ngx_inet.h @ 8456:c72d8839f427
Mail: fixed SMTP pipelining to send the response immediately.
Previously, if there were some pipelined SMTP data in the buffer when
a proxied connection with the backend was established, nginx called
ngx_mail_proxy_handler() to send these data, and not tried to send the
response to the last command. In most cases, this response was later sent
along with the response to the pipelined command, but if for some reason
client decides to wait for the response before finishing the next command
this might result in a connection hang.
Fix is to always call ngx_mail_proxy_handler() to send the response, and
additionally post an event to send the pipelined data if needed.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Wed, 19 May 2021 03:13:12 +0300 |
parents | d9c3917c7f90 |
children |
line wrap: on
line source
/* * Copyright (C) Igor Sysoev * Copyright (C) Nginx, Inc. */ #ifndef _NGX_INET_H_INCLUDED_ #define _NGX_INET_H_INCLUDED_ #include <ngx_config.h> #include <ngx_core.h> #define NGX_INET_ADDRSTRLEN (sizeof("255.255.255.255") - 1) #define NGX_INET6_ADDRSTRLEN \ (sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") - 1) #define NGX_UNIX_ADDRSTRLEN \ (sizeof("unix:") - 1 + \ sizeof(struct sockaddr_un) - offsetof(struct sockaddr_un, sun_path)) #if (NGX_HAVE_UNIX_DOMAIN) #define NGX_SOCKADDR_STRLEN NGX_UNIX_ADDRSTRLEN #elif (NGX_HAVE_INET6) #define NGX_SOCKADDR_STRLEN (NGX_INET6_ADDRSTRLEN + sizeof("[]:65535") - 1) #else #define NGX_SOCKADDR_STRLEN (NGX_INET_ADDRSTRLEN + sizeof(":65535") - 1) #endif /* compatibility */ #define NGX_SOCKADDRLEN sizeof(ngx_sockaddr_t) typedef union { struct sockaddr sockaddr; struct sockaddr_in sockaddr_in; #if (NGX_HAVE_INET6) struct sockaddr_in6 sockaddr_in6; #endif #if (NGX_HAVE_UNIX_DOMAIN) struct sockaddr_un sockaddr_un; #endif } ngx_sockaddr_t; typedef struct { in_addr_t addr; in_addr_t mask; } ngx_in_cidr_t; #if (NGX_HAVE_INET6) typedef struct { struct in6_addr addr; struct in6_addr mask; } ngx_in6_cidr_t; #endif typedef struct { ngx_uint_t family; union { ngx_in_cidr_t in; #if (NGX_HAVE_INET6) ngx_in6_cidr_t in6; #endif } u; } ngx_cidr_t; typedef struct { struct sockaddr *sockaddr; socklen_t socklen; ngx_str_t name; } ngx_addr_t; typedef struct { ngx_str_t url; ngx_str_t host; ngx_str_t port_text; ngx_str_t uri; in_port_t port; in_port_t default_port; in_port_t last_port; int family; unsigned listen:1; unsigned uri_part:1; unsigned no_resolve:1; unsigned no_port:1; unsigned wildcard:1; socklen_t socklen; ngx_sockaddr_t sockaddr; ngx_addr_t *addrs; ngx_uint_t naddrs; char *err; } ngx_url_t; in_addr_t ngx_inet_addr(u_char *text, size_t len); #if (NGX_HAVE_INET6) ngx_int_t ngx_inet6_addr(u_char *p, size_t len, u_char *addr); size_t ngx_inet6_ntop(u_char *p, u_char *text, size_t len); #endif size_t ngx_sock_ntop(struct sockaddr *sa, socklen_t socklen, u_char *text, size_t len, ngx_uint_t port); size_t ngx_inet_ntop(int family, void *addr, u_char *text, size_t len); ngx_int_t ngx_ptocidr(ngx_str_t *text, ngx_cidr_t *cidr); ngx_int_t ngx_cidr_match(struct sockaddr *sa, ngx_array_t *cidrs); ngx_int_t ngx_parse_addr(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, size_t len); ngx_int_t ngx_parse_addr_port(ngx_pool_t *pool, ngx_addr_t *addr, u_char *text, size_t len); ngx_int_t ngx_parse_url(ngx_pool_t *pool, ngx_url_t *u); ngx_int_t ngx_inet_resolve_host(ngx_pool_t *pool, ngx_url_t *u); ngx_int_t ngx_cmp_sockaddr(struct sockaddr *sa1, socklen_t slen1, struct sockaddr *sa2, socklen_t slen2, ngx_uint_t cmp_port); in_port_t ngx_inet_get_port(struct sockaddr *sa); void ngx_inet_set_port(struct sockaddr *sa, in_port_t port); ngx_uint_t ngx_inet_wildcard(struct sockaddr *sa); #endif /* _NGX_INET_H_INCLUDED_ */