Changeset 7191:61d276dcd493 in nginx


Ignore:
Timestamp:
01/29/18 13:06:33 (2 years ago)
Author:
Ruslan Ermilov <ru@…>
Branch:
default
Phase:
public
Message:

HTTP/2: more style, comments, and debugging.

Location:
src/http/v2
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • src/http/v2/ngx_http_v2.c

    r7190 r7191  
    186186
    187187static ngx_http_v2_handler_pt ngx_http_v2_frame_states[] = {
    188     ngx_http_v2_state_data,
    189     ngx_http_v2_state_headers,
    190     ngx_http_v2_state_priority,
    191     ngx_http_v2_state_rst_stream,
    192     ngx_http_v2_state_settings,
    193     ngx_http_v2_state_push_promise,
    194     ngx_http_v2_state_ping,
    195     ngx_http_v2_state_goaway,
    196     ngx_http_v2_state_window_update,
    197     ngx_http_v2_state_continuation
     188    ngx_http_v2_state_data,               /* NGX_HTTP_V2_DATA_FRAME */
     189    ngx_http_v2_state_headers,            /* NGX_HTTP_V2_HEADERS_FRAME */
     190    ngx_http_v2_state_priority,           /* NGX_HTTP_V2_PRIORITY_FRAME */
     191    ngx_http_v2_state_rst_stream,         /* NGX_HTTP_V2_RST_STREAM_FRAME */
     192    ngx_http_v2_state_settings,           /* NGX_HTTP_V2_SETTINGS_FRAME */
     193    ngx_http_v2_state_push_promise,       /* NGX_HTTP_V2_PUSH_PROMISE_FRAME */
     194    ngx_http_v2_state_ping,               /* NGX_HTTP_V2_PING_FRAME */
     195    ngx_http_v2_state_goaway,             /* NGX_HTTP_V2_GOAWAY_FRAME */
     196    ngx_http_v2_state_window_update,      /* NGX_HTTP_V2_WINDOW_UPDATE_FRAME */
     197    ngx_http_v2_state_continuation        /* NGX_HTTP_V2_CONTINUATION_FRAME */
    198198};
    199199
     
    10471047    depend = 0;
    10481048    excl = 0;
    1049     weight = 16;
     1049    weight = NGX_HTTP_V2_DEFAULT_WEIGHT;
    10501050
    10511051    if (priority) {
     
    10601060
    10611061    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
    1062                    "http2 HEADERS frame sid:%ui on %ui excl:%ui weight:%ui",
     1062                   "http2 HEADERS frame sid:%ui "
     1063                   "depends on %ui excl:%ui weight:%ui",
    10631064                   h2c->state.sid, depend, excl, weight);
    10641065
     
    17891790
    17901791    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
    1791                    "http2 PRIORITY frame sid:%ui on %ui excl:%ui weight:%ui",
     1792                   "http2 PRIORITY frame sid:%ui "
     1793                   "depends on %ui excl:%ui weight:%ui",
    17921794                   h2c->state.sid, depend, excl, weight);
    17931795
     
    19861988        id = ngx_http_v2_parse_uint16(pos);
    19871989        value = ngx_http_v2_parse_uint32(&pos[2]);
     1990
     1991        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, h2c->connection->log, 0,
     1992                       "http2 setting %ui:%ui", id, value);
    19881993
    19891994        switch (id) {
     
    33443349        } else if (r->schema_start == NULL) {
    33453350            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
    3346                           "client sent no :schema header");
     3351                          "client sent no :scheme header");
    33473352
    33483353        } else {
  • src/http/v2/ngx_http_v2.h

    r7100 r7191  
    4949#define NGX_HTTP_V2_MAX_WINDOW           ((1U << 31) - 1)
    5050#define NGX_HTTP_V2_DEFAULT_WINDOW       65535
     51
     52#define NGX_HTTP_V2_DEFAULT_WEIGHT       16
    5153
    5254
     
    273275
    274276void ngx_http_v2_init(ngx_event_t *rev);
    275 void ngx_http_v2_request_headers_init(void);
    276277
    277278ngx_int_t ngx_http_v2_read_request_body(ngx_http_request_t *r);
  • src/http/v2/ngx_http_v2_filter_module.c

    r7108 r7191  
    139139    ngx_connection_t          *fc;
    140140    ngx_http_cleanup_t        *cln;
     141    ngx_http_v2_stream_t      *stream;
    141142    ngx_http_v2_out_frame_t   *frame;
    142143    ngx_http_v2_connection_t  *h2c;
     
    158159    static u_char nginx_ver_build[ngx_http_v2_literal_size(NGINX_VER_BUILD)];
    159160
    160     if (!r->stream) {
     161    stream = r->stream;
     162
     163    if (!stream) {
    161164        return ngx_http_next_header_filter(r);
    162165    }
     
    237240    }
    238241
    239     h2c = r->stream->connection;
     242    h2c = stream->connection;
    240243
    241244    len = h2c->table_update ? 1 : 0;
     
    634637    }
    635638
    636     ngx_http_v2_queue_blocked_frame(r->stream->connection, frame);
    637 
    638     r->stream->queued = 1;
     639    ngx_http_v2_queue_blocked_frame(h2c, frame);
     640
     641    stream->queued = 1;
    639642
    640643    cln = ngx_http_cleanup_add(r, 0);
     
    644647
    645648    cln->handler = ngx_http_v2_filter_cleanup;
    646     cln->data = r->stream;
     649    cln->data = stream;
    647650
    648651    fc->send_chain = ngx_http_v2_send_chain;
    649652    fc->need_last_buf = 1;
    650653
    651     return ngx_http_v2_filter_send(fc, r->stream);
    652 }
    653 
    654 
    655 static ngx_http_v2_out_frame_t *
    656 ngx_http_v2_create_trailers_frame(ngx_http_request_t *r)
    657 {
    658     u_char           *pos, *start, *tmp;
    659     size_t            len, tmp_len;
    660     ngx_uint_t        i;
    661     ngx_list_part_t  *part;
    662     ngx_table_elt_t  *header;
    663 
    664     len = 0;
    665     tmp_len = 0;
    666 
    667     part = &r->headers_out.trailers.part;
    668     header = part->elts;
    669 
    670     for (i = 0; /* void */; i++) {
    671 
    672         if (i >= part->nelts) {
    673             if (part->next == NULL) {
    674                 break;
    675             }
    676 
    677             part = part->next;
    678             header = part->elts;
    679             i = 0;
    680         }
    681 
    682         if (header[i].hash == 0) {
    683             continue;
    684         }
    685 
    686         if (header[i].key.len > NGX_HTTP_V2_MAX_FIELD) {
    687             ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
    688                           "too long response trailer name: \"%V\"",
    689                           &header[i].key);
    690             return NULL;
    691         }
    692 
    693         if (header[i].value.len > NGX_HTTP_V2_MAX_FIELD) {
    694             ngx_log_error(NGX_LOG_CRIT, r->connection->log, 0,
    695                           "too long response trailer value: \"%V: %V\"",
    696                           &header[i].key, &header[i].value);
    697             return NULL;
    698         }
    699 
    700         len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len
    701                  + NGX_HTTP_V2_INT_OCTETS + header[i].value.len;
    702 
    703         if (header[i].key.len > tmp_len) {
    704             tmp_len = header[i].key.len;
    705         }
    706 
    707         if (header[i].value.len > tmp_len) {
    708             tmp_len = header[i].value.len;
    709         }
    710     }
    711 
    712     if (len == 0) {
    713         return NGX_HTTP_V2_NO_TRAILERS;
    714     }
    715 
    716     tmp = ngx_palloc(r->pool, tmp_len);
    717     pos = ngx_pnalloc(r->pool, len);
    718 
    719     if (pos == NULL || tmp == NULL) {
    720         return NULL;
    721     }
    722 
    723     start = pos;
    724 
    725     part = &r->headers_out.trailers.part;
    726     header = part->elts;
    727 
    728     for (i = 0; /* void */; i++) {
    729 
    730         if (i >= part->nelts) {
    731             if (part->next == NULL) {
    732                 break;
    733             }
    734 
    735             part = part->next;
    736             header = part->elts;
    737             i = 0;
    738         }
    739 
    740         if (header[i].hash == 0) {
    741             continue;
    742         }
    743 
    744 #if (NGX_DEBUG)
    745         if (r->connection->log->log_level & NGX_LOG_DEBUG_HTTP) {
    746             ngx_strlow(tmp, header[i].key.data, header[i].key.len);
    747 
    748             ngx_log_debug3(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,
    749                            "http2 output trailer: \"%*s: %V\"",
    750                            header[i].key.len, tmp, &header[i].value);
    751         }
    752 #endif
    753 
    754         *pos++ = 0;
    755 
    756         pos = ngx_http_v2_write_name(pos, header[i].key.data,
    757                                      header[i].key.len, tmp);
    758 
    759         pos = ngx_http_v2_write_value(pos, header[i].value.data,
    760                                       header[i].value.len, tmp);
    761     }
    762 
    763     return ngx_http_v2_create_headers_frame(r, start, pos, 1);
     654    return ngx_http_v2_filter_send(fc, stream);
    764655}
    765656
     
    915806        return frame;
    916807    }
     808}
     809
     810
     811static ngx_http_v2_out_frame_t *
     812ngx_http_v2_create_trailers_frame(ngx_http_request_t *r)
     813{
     814    u_char            *pos, *start, *tmp;
     815    size_t             len, tmp_len;
     816    ngx_uint_t         i;
     817    ngx_list_part_t   *part;
     818    ngx_table_elt_t   *header;
     819    ngx_connection_t  *fc;
     820
     821    fc = r->connection;
     822    len = 0;
     823    tmp_len = 0;
     824
     825    part = &r->headers_out.trailers.part;
     826    header = part->elts;
     827
     828    for (i = 0; /* void */; i++) {
     829
     830        if (i >= part->nelts) {
     831            if (part->next == NULL) {
     832                break;
     833            }
     834
     835            part = part->next;
     836            header = part->elts;
     837            i = 0;
     838        }
     839
     840        if (header[i].hash == 0) {
     841            continue;
     842        }
     843
     844        if (header[i].key.len > NGX_HTTP_V2_MAX_FIELD) {
     845            ngx_log_error(NGX_LOG_CRIT, fc->log, 0,
     846                          "too long response trailer name: \"%V\"",
     847                          &header[i].key);
     848            return NULL;
     849        }
     850
     851        if (header[i].value.len > NGX_HTTP_V2_MAX_FIELD) {
     852            ngx_log_error(NGX_LOG_CRIT, fc->log, 0,
     853                          "too long response trailer value: \"%V: %V\"",
     854                          &header[i].key, &header[i].value);
     855            return NULL;
     856        }
     857
     858        len += 1 + NGX_HTTP_V2_INT_OCTETS + header[i].key.len
     859                 + NGX_HTTP_V2_INT_OCTETS + header[i].value.len;
     860
     861        if (header[i].key.len > tmp_len) {
     862            tmp_len = header[i].key.len;
     863        }
     864
     865        if (header[i].value.len > tmp_len) {
     866            tmp_len = header[i].value.len;
     867        }
     868    }
     869
     870    if (len == 0) {
     871        return NGX_HTTP_V2_NO_TRAILERS;
     872    }
     873
     874    tmp = ngx_palloc(r->pool, tmp_len);
     875    pos = ngx_pnalloc(r->pool, len);
     876
     877    if (pos == NULL || tmp == NULL) {
     878        return NULL;
     879    }
     880
     881    start = pos;
     882
     883    part = &r->headers_out.trailers.part;
     884    header = part->elts;
     885
     886    for (i = 0; /* void */; i++) {
     887
     888        if (i >= part->nelts) {
     889            if (part->next == NULL) {
     890                break;
     891            }
     892
     893            part = part->next;
     894            header = part->elts;
     895            i = 0;
     896        }
     897
     898        if (header[i].hash == 0) {
     899            continue;
     900        }
     901
     902#if (NGX_DEBUG)
     903        if (fc->log->log_level & NGX_LOG_DEBUG_HTTP) {
     904            ngx_strlow(tmp, header[i].key.data, header[i].key.len);
     905
     906            ngx_log_debug3(NGX_LOG_DEBUG_HTTP, fc->log, 0,
     907                           "http2 output trailer: \"%*s: %V\"",
     908                           header[i].key.len, tmp, &header[i].value);
     909        }
     910#endif
     911
     912        *pos++ = 0;
     913
     914        pos = ngx_http_v2_write_name(pos, header[i].key.data,
     915                                     header[i].key.len, tmp);
     916
     917        pos = ngx_http_v2_write_value(pos, header[i].value.data,
     918                                      header[i].value.len, tmp);
     919    }
     920
     921    return ngx_http_v2_create_headers_frame(r, start, pos, 1);
    917922}
    918923
     
    12411246
    12421247static ngx_inline ngx_int_t
    1243 ngx_http_v2_filter_send(ngx_connection_t *fc, ngx_http_v2_stream_t *stream)
    1244 {
    1245     stream->blocked = 1;
    1246 
    1247     if (ngx_http_v2_send_output_queue(stream->connection) == NGX_ERROR) {
    1248         fc->error = 1;
    1249         return NGX_ERROR;
    1250     }
    1251 
    1252     stream->blocked = 0;
    1253 
    1254     if (stream->queued) {
    1255         fc->buffered |= NGX_HTTP_V2_BUFFERED;
    1256         fc->write->active = 1;
    1257         fc->write->ready = 0;
    1258         return NGX_AGAIN;
    1259     }
    1260 
    1261     fc->buffered &= ~NGX_HTTP_V2_BUFFERED;
    1262 
    1263     return NGX_OK;
    1264 }
    1265 
    1266 
    1267 static ngx_inline ngx_int_t
    12681248ngx_http_v2_flow_control(ngx_http_v2_connection_t *h2c,
    12691249    ngx_http_v2_stream_t *stream)
     
    13171297}
    13181298
     1299
     1300static ngx_inline ngx_int_t
     1301ngx_http_v2_filter_send(ngx_connection_t *fc, ngx_http_v2_stream_t *stream)
     1302{
     1303    stream->blocked = 1;
     1304
     1305    if (ngx_http_v2_send_output_queue(stream->connection) == NGX_ERROR) {
     1306        fc->error = 1;
     1307        return NGX_ERROR;
     1308    }
     1309
     1310    stream->blocked = 0;
     1311
     1312    if (stream->queued) {
     1313        fc->buffered |= NGX_HTTP_V2_BUFFERED;
     1314        fc->write->active = 1;
     1315        fc->write->ready = 0;
     1316        return NGX_AGAIN;
     1317    }
     1318
     1319    fc->buffered &= ~NGX_HTTP_V2_BUFFERED;
     1320
     1321    return NGX_OK;
     1322}
    13191323
    13201324
Note: See TracChangeset for help on using the changeset viewer.