Opened 10 years ago

Closed 10 years ago

#725 closed defect (invalid)

spdy + return <code> "some text" = Could not parse Spdy Control Frame Header

Reported by: Slava Sterling Owned by:
Priority: blocker Milestone: 1.7.10
Component: nginx-module Version: 1.7.x
Keywords: spdy Cc:
uname -a: Linux 3.17.7-gentoo #1 SMP Tue Dec 30 10:17:38 EST 2014 x86_64 Intel(R) Xeon(R) CPU E3-1245 V2 @ 3.40GHz GenuineIntel GNU/Linux
nginx -V: nginx version: nginx/1.7.10
TLS SNI support enabled
configure arguments: --prefix=/usr --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error_log --pid-path=/run/nginx.pid --lock-path=/run/lock/nginx.lock --with-cc-opt=-I/usr/include --with-ld-opt=-L/usr/lib64 --http-log-path=/var/log/nginx/access_log --http-client-body-temp-path=//var/lib/nginx/tmp/client --http-proxy-temp-path=//var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=//var/lib/nginx/tmp/fastcgi --http-scgi-temp-path=//var/lib/nginx/tmp/scgi --http-uwsgi-temp-path=//var/lib/nginx/tmp/uwsgi --with-pcre --without-http_browser_module --without-http_empty_gif_module --without-http_geo_module --without-http_limit_req_module --without-http_limit_conn_module --without-http_map_module --without-http_memcached_module --without-http_referer_module --without-http_scgi_module --without-http_ssi_module --without-http_split_clients_module --without-http_upstream_ip_hash_module --without-http_userid_module --without-http_uwsgi_module --with-http_flv_module --with-http_spdy_module --with-http_realip_module --with-http_ssl_module --without-mail_imap_module --without-mail_pop3_module --without-mail_smtp_module --user=nginx --group=nginx

Description

Minimal basic configuration:

server {
  server_name example.com;
  listen ...:443 ssl spdy;
  ssl_certificate ...;
  ssl_certificate_key ...;
  return 404;
}

Works fine when requested with SPDY.

Replacing return 404; with

  return 404 "foo bar";

Getting SPDY errors in Google Chrome and Safari (whatever supports SPDY):

t=133076 [st=    0]  SPDY_SESSION_PING
                     --> is_ack = false
                     --> type = "sent"
                     --> unique_id = 1
t=133076 [st=    0]  SPDY_SESSION_SYN_STREAM
                     --> fin = true
                     --> :host: example.com
                         :method: GET
                         :path: /?
                         :scheme: https
                         :version: HTTP/1.1
                         accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
                         accept-encoding: gzip, deflate, sdch
                         accept-language: en-US,en;q=0.8,ru;q=0.6
                         cache-control: max-age=0
                         cookie: [31 bytes were stripped]
                         dnt: 1
                         user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36
                     --> spdy_priority = 0
                     --> stream_id = 5
                     --> unidirectional = false
t=133110 [st=   34]  SPDY_SESSION_SEND_RST_STREAM
                     --> description = "Could not parse Spdy Control Frame Header."
                     --> status = 1
                     --> stream_id = 5
t=133110 [st=   34]  SPDY_SESSION_RECV_DATA
                     --> fin = false
                     --> size = 1026
                     --> stream_id = 5
t=133110 [st=   34]  SPDY_SESSION_UPDATE_RECV_WINDOW
                     --> delta = -1026
                     --> window_size = 10484734
t=133110 [st=   34]  SPDY_STREAM_UPDATE_RECV_WINDOW
                     --> delta = 1026
                     --> window_size = 10485760
t=133110 [st=   34]  SPDY_SESSION_RECV_DATA
                     --> fin = true
                     --> size = 0
                     --> stream_id = 5
t=133110 [st=   34]  SPDY_SESSION_PING
                     --> is_ack = false
                     --> type = "received"
                     --> unique_id = 1
t=163197 [st=30121]  SPDY_SESSION_CLOSE
                     --> description = "Connection closed"
                     --> net_error = -100 (ERR_CONNECTION_CLOSED)
t=163197 [st=30121]  SPDY_SESSION_POOL_REMOVE_SESSION
                     --> source_dependency = 56010 (SPDY_SESSION)
t=163197 [st=30121] -SPDY_SESSION

Now let's do 200 instead of 404:

  return 200 "foo bar";

That one works just fine.

Finally, let's add:

  add_header "Content-Type" "text/html";

Boom, "Could not parse Spdy Control Frame Header" again.

Change History (2)

in reply to:  description comment:1 by Valentin V. Bartenev, 10 years ago

Could you please provide your full config or/and clear steps how to reproduce it?

The config below works just fine for me:

events { }

http {
    include       build/conf/mime.types;
    default_type  text/plain;

    server {
        listen 443 ssl spdy;

        server_name localhost;

        ssl_certificate server-ca.crt;
        ssl_certificate_key server.key;

        return 404 "foo bar";
    }
}

Replying to Slava Sterling <ngi...ousov.net>:

[...]
Finally, let's add:

  add_header "Content-Type" "text/html";

Boom, "Could not parse Spdy Control Frame Header" again.

Of course! It's expected behaviour. You should never do that, see: #691

Version 1, edited 10 years ago by Valentin V. Bartenev (previous) (next) (diff)

comment:2 by Maxim Dounin, 10 years ago

Resolution: invalid
Status: newclosed

Closing this.

Note: See TracTickets for help on using tickets.