| line |
true |
false |
branch |
|
353
|
49 |
21 |
if (now == LAST_GENERATED_TIME) return; |
|
381
|
0 |
81 |
if (elt == NULL) return NULL; |
|
384
|
4 |
77 |
if (unlikely(SvMAGICAL(sv))) sv = sv_2mortal(newSVsv(sv)); |
|
385
|
3 |
78 |
if (unlikely(!SvOK(sv))) return NULL; |
|
387
|
14 |
64 |
if (unlikely(SvROK(sv))) sv = SvRV(sv); |
|
398
|
109 |
912 |
if (!c->wbuf_rinq) { |
|
407
|
0 |
912 |
if (m->count >= FEERSUM_IOMATRIX_SIZE) { |
|
412
|
109 |
912 |
if (add_iomatrix) { |
|
432
|
2 |
390 |
if (unlikely(SvMAGICAL(sv))) { |
|
435
|
0 |
390 |
else if (unlikely(SvPADTMP(sv))) { |
|
440
|
0 |
0 |
if (SvFLAGS(sv) == (SVs_PADTMP|SVf_POK|SVp_POK)) { |
|
450
|
0 |
0 |
(void)SvOK_off(sv); |
|
505
|
4 |
19 |
if (!c->is_http11) return; // nothing required |
|
595
|
0 |
0 |
if (100 <= code && code <= 199) { |
|
|
0 |
0 |
if (100 <= code && code <= 199) { |
|
598
|
0 |
0 |
else if (200 <= code && code <= 299) { |
|
|
0 |
0 |
else if (200 <= code && code <= 299) { |
|
601
|
0 |
0 |
else if (300 <= code && code <= 399) { |
|
|
0 |
0 |
else if (300 <= code && code <= 399) { |
|
604
|
0 |
0 |
else if (400 <= code && code <= 499) { |
|
|
0 |
0 |
else if (400 <= code && code <= 499) { |
|
627
|
73 |
0 |
if (likely(is_tcp)) { |
|
629
|
0 |
73 |
if (unlikely(setsockopt(fd, SOL_TCP, TCP_NODELAY, &flags, sizeof(int)))) |
|
634
|
0 |
73 |
if (unlikely(setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, &flags, sizeof(int)))) |
|
639
|
0 |
73 |
if (unlikely(setsockopt(fd, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger)))) |
|
648
|
62 |
73 |
if (unlikely(c->fd < 0)) |
|
654
|
0 |
73 |
if (unlikely(close(c->fd))) |
|
664
|
73 |
0 |
SvUPGRADE(self, SVt_PVMG); // ensures sv_bless doesn't reallocate |
|
665
|
73 |
0 |
SvGROW(self, sizeof(struct feer_conn)); |
|
|
73 |
0 |
SvGROW(self, sizeof(struct feer_conn)); |
|
705
|
0 |
222 |
if (unlikely(!sv_isa(rv,"Feersum::Connection"))) |
|
721
|
0 |
129 |
if (unlikely(!SvROK(rv))) croak("Expected a reference"); |
|
724
|
129 |
0 |
if (likely( |
|
|
39 |
90 |
if (likely( |
|
|
39 |
0 |
if (likely( |
|
|
129 |
0 |
if (likely( |
|
730
|
25 |
104 |
if (uv == 0) { |
|
731
|
6 |
19 |
if (can_croak) croak("Operation not allowed: Handle is closed."); |
|
737
|
0 |
0 |
if (can_croak) |
|
748
|
23 |
12 |
sv_bless(sv, is_writer ? feer_conn_writer_stash : feer_conn_reader_stash); |
|
784
|
1 |
10 |
if (unlikely(ev_is_active(&c->read_ev_io))) |
|
793
|
91 |
9 |
if (unlikely(!ev_is_active(&c->read_ev_io))) |
|
802
|
10 |
1 |
if (likely(!ev_is_active(&c->read_ev_timer))) { |
|
812
|
91 |
9 |
if (unlikely(!ev_is_active(&c->read_ev_timer))) |
|
821
|
26 |
98 |
if (unlikely(ev_is_active(&c->write_ev_io))) |
|
830
|
1 |
98 |
if (unlikely(!ev_is_active(&c->write_ev_io))) |
|
841
|
83 |
50 |
while (request_ready_rinq) { |
|
848
|
68 |
15 |
if (likely(c->wbuf_rinq)) { |
|
859
|
0 |
22 |
if (unlikely(revents & EV_ERROR)) { |
|
865
|
22 |
0 |
if (!ev_is_active(&accept_w) && !shutting_down) { |
|
|
22 |
0 |
if (!ev_is_active(&accept_w) && !shutting_down) { |
|
874
|
0 |
320 |
if (unlikely(revents & EV_ERROR)) { |
|
880
|
50 |
270 |
if (request_ready_rinq) |
|
887
|
0 |
43 |
if (unlikely(revents & EV_ERROR)) { |
|
893
|
0 |
43 |
if (request_ready_rinq) |
|
909
|
0 |
108 |
if (unlikely(revents & EV_ERROR && !(revents & EV_WRITE))) { |
|
|
0 |
0 |
if (unlikely(revents & EV_ERROR && !(revents & EV_WRITE))) { |
|
915
|
91 |
17 |
if (unlikely(!c->wbuf_rinq)) { |
|
916
|
0 |
17 |
if (unlikely(c->responding >= RESPOND_SHUTDOWN)) |
|
919
|
0 |
17 |
if (!c->poll_write_cb) { |
|
921
|
0 |
0 |
if (c->responding == RESPOND_STREAMING) |
|
929
|
11 |
6 |
if (c->poll_write_cb_is_io_handle) |
|
935
|
17 |
0 |
if (unlikely(!c->wbuf_rinq)) goto try_write_again; |
|
953
|
0 |
108 |
if (unlikely(wrote <= 0)) { |
|
954
|
0 |
0 |
if (unlikely(wrote == 0)) |
|
956
|
0 |
0 |
if (likely(errno == EAGAIN || errno == EINTR)) |
|
|
0 |
0 |
if (likely(errno == EAGAIN || errno == EINTR)) |
|
964
|
1020 |
108 |
for (i = m->offset; i < m->count && consume; i++) { |
|
|
1020 |
0 |
for (i = m->offset; i < m->count && consume; i++) { |
|
966
|
0 |
1020 |
if (unlikely(v->iov_len > wrote)) { |
|
979
|
476 |
544 |
if (m->sv[i]) { |
|
986
|
108 |
0 |
if (likely(m->offset >= m->count)) { |
|
990
|
108 |
0 |
if (!c->wbuf_rinq) |
|
1014
|
11 |
19 |
if (c->poll_write_cb) goto try_write_again; |
|
1028
|
16 |
62 |
if (likely(c->is_keepalive)) { |
|
1033
|
16 |
0 |
if (likely(c->req)) { |
|
1034
|
16 |
0 |
if (c->req->buf) SvREFCNT_dec(c->req->buf); |
|
1035
|
16 |
0 |
if (likely(c->req->path)) SvREFCNT_dec(c->req->path); |
|
1036
|
16 |
0 |
if (likely(c->req->query)) SvREFCNT_dec(c->req->query); |
|
1037
|
3 |
13 |
if (likely(c->req->addr)) SvREFCNT_dec(c->req->addr); |
|
1038
|
3 |
13 |
if (likely(c->req->port)) SvREFCNT_dec(c->req->port); |
|
1043
|
14 |
2 |
if (c->rbuf) { pipelined = SvCUR(c->rbuf); } |
|
1044
|
8 |
8 |
if (unlikely(pipelined > 0 && c->is_http11)) { |
|
|
8 |
0 |
if (unlikely(pipelined > 0 && c->is_http11)) { |
|
1070
|
86 |
0 |
if (likely(!req)) { |
|
1093
|
8 |
81 |
if (unlikely(c->pipelined)) goto pipelined; |
|
1097
|
0 |
81 |
if (unlikely(revents & EV_ERROR && !(revents & EV_READ))) { |
|
|
0 |
0 |
if (unlikely(revents & EV_ERROR && !(revents & EV_READ))) { |
|
1102
|
0 |
81 |
if (unlikely(c->receiving == RECEIVE_SHUTDOWN)) |
|
1107
|
75 |
6 |
if (unlikely(!c->rbuf)) { // likely = optimize for keepalive requests |
|
1114
|
6 |
75 |
if (unlikely(space_free < READ_BUFSZ)) { // unlikely = optimize for small |
|
1118
|
6 |
0 |
SvGROW(c->rbuf, new_len); |
|
|
6 |
0 |
SvGROW(c->rbuf, new_len); |
|
1125
|
2 |
79 |
if (unlikely(got_n <= 0)) { |
|
1126
|
2 |
0 |
if (unlikely(got_n == 0)) { |
|
1130
|
0 |
0 |
if (likely(errno == EAGAIN || errno == EINTR)) |
|
|
0 |
0 |
if (likely(errno == EAGAIN || errno == EINTR)) |
|
1146
|
86 |
1 |
if (likely(c->receiving <= RECEIVE_HEADERS)) { |
|
1148
|
1 |
85 |
if (ret == -1) goto try_read_bad; |
|
1150
|
1 |
84 |
if (ret == -2) goto try_read_again_reset_timer; |
|
1158
|
1 |
83 |
if (process_request_headers(c, ret)) |
|
1163
|
1 |
0 |
else if (likely(c->receiving == RECEIVE_BODY)) { |
|
1165
|
1 |
0 |
if (c->received_cl < c->expected_cl) |
|
1215
|
2 |
0 |
if (unlikely(!(revents & EV_TIMER) || c->receiving == RECEIVE_SHUTDOWN)) { |
|
|
0 |
2 |
if (unlikely(!(revents & EV_TIMER) || c->receiving == RECEIVE_SHUTDOWN)) { |
|
1217
|
0 |
0 |
if (revents & EV_ERROR) |
|
1225
|
2 |
0 |
if (likely(c->responding == RESPOND_NOT_STARTED) && c->receiving >= RECEIVE_HEADERS) { |
|
|
2 |
0 |
if (likely(c->responding == RESPOND_NOT_STARTED) && c->receiving >= RECEIVE_HEADERS) { |
|
1227
|
1 |
1 |
if (c->receiving == RECEIVE_HEADERS) { |
|
1255
|
0 |
38 |
if (unlikely(shutting_down)) { |
|
1262
|
0 |
38 |
if (unlikely(revents & EV_ERROR)) { |
|
1279
|
38 |
73 |
if (fd == -1) break; |
|
1282
|
0 |
73 |
if (unlikely(prep_socket(fd, is_tcp))) { |
|
1315
|
45 |
38 |
if (!ev_is_active(&ei)) { |
|
1335
|
23 |
61 |
c->is_keepalive = is_keepalive && c->is_http11; |
|
|
21 |
2 |
c->is_keepalive = is_keepalive && c->is_http11; |
|
1340
|
71 |
13 |
if (likely(str_eq("GET", 3, req->method, req->method_len))) { |
|
1346
|
0 |
13 |
else if (likely(str_eq("OPTIONS", 7, req->method, req->method_len))) { |
|
1349
|
13 |
0 |
else if (likely(str_eq("POST", 4, req->method, req->method_len))) { |
|
1352
|
0 |
0 |
else if (str_eq("PUT", 3, req->method, req->method_len)) { |
|
1380
|
0 |
84 |
? need : READ_INIT_FACTOR*READ_BUFSZ-1; |
|
1382
|
25 |
59 |
SV *new_rbuf = newSVpvn(need ? from : "", need); |
|
1391
|
270 |
84 |
for (i=0; i < req->num_headers; i++) { |
|
1393
|
0 |
270 |
if (!hdr->name) continue; |
|
1395
|
13 |
257 |
if (unlikely( |
|
1399
|
13 |
0 |
if (likely(g == IS_NUMBER_IN_UV)) { |
|
1400
|
0 |
13 |
if (unlikely(expected > MAX_BODY_LEN)) { |
|
1415
|
56 |
201 |
unlikely(str_case_eq("connection", 10, hdr->name, hdr->name_len))) |
|
1417
|
56 |
0 |
if (likely(c->is_http11) |
|
1418
|
5 |
51 |
&& likely(c->is_keepalive) |
|
1419
|
5 |
0 |
&& likely(str_case_eq("close", 5, hdr->value, hdr->value_len))) |
|
1425
|
0 |
51 |
likely(!c->is_http11) |
|
1426
|
0 |
0 |
&& likely(is_keepalive) |
|
1427
|
0 |
0 |
&& str_case_eq("keep-alive", 10, hdr->value, hdr->value_len)) |
|
1436
|
0 |
84 |
if (max_connection_reqs > 0 && c->reqs >= max_connection_reqs) { |
|
|
0 |
0 |
if (max_connection_reqs > 0 && c->reqs >= max_connection_reqs) { |
|
1441
|
71 |
13 |
if (likely(next_req_follows)) goto got_it_all; // optimize for GET |
|
1442
|
13 |
0 |
else if (likely(got_content_length)) goto got_cl; |
|
1444
|
0 |
0 |
if (body_is_required) { |
|
1464
|
13 |
0 |
SvGROW(c->rbuf, c->expected_cl + 1); |
|
|
0 |
13 |
SvGROW(c->rbuf, c->expected_cl + 1); |
|
1468
|
13 |
0 |
if (unlikely(c->expected_cl && c->received_cl < c->expected_cl)) { |
|
|
12 |
1 |
if (unlikely(c->expected_cl && c->received_cl < c->expected_cl)) { |
|
1484
|
145 |
113 |
if (c->in_callback) return; // defer until out of callback |
|
1486
|
65 |
48 |
if (c->write_ev_io.data == NULL) { |
|
1505
|
0 |
4 |
if (unlikely(c->responding != RESPOND_NOT_STARTED)) { |
|
1510
|
4 |
0 |
if (!msg_len) msg_len = strlen(msg); |
|
1529
|
0 |
4 |
if (c->is_keepalive) c->is_keepalive = 0; |
|
1536
|
26 |
84 |
if (a_len != b_len) return 0; |
|
1537
|
0 |
84 |
if (a == b) return 1; |
|
1539
|
265 |
84 |
for (i=0; i
|
|
|
265 |
0 |
for (i=0; i
|
|
1540
|
0 |
265 |
if (a[i] != b[i]) return 0; |
|
1551
|
894 |
155 |
if (a_len != b_len) return 0; |
|
1552
|
0 |
155 |
if (a == b) return 1; |
|
1554
|
1018 |
88 |
for (i=0; i
|
|
|
1018 |
0 |
for (i=0; i
|
|
1555
|
67 |
951 |
if (a[i] != tolower(b[i])) return 0; |
|
1563
|
16 |
2 |
if (likely('0' <= ch && ch <= '9')) |
|
|
14 |
2 |
if (likely('0' <= ch && ch <= '9')) |
|
1565
|
2 |
2 |
else if ('A' <= ch && ch <= 'F') |
|
|
1 |
1 |
else if ('A' <= ch && ch <= 'F') |
|
1567
|
1 |
2 |
else if ('a' <= ch && ch <= 'f') |
|
|
1 |
0 |
else if ('a' <= ch && ch <= 'f') |
|
1582
|
316 |
71 |
while (ptr < end) { |
|
1583
|
3 |
313 |
if (unlikely(*ptr == '%')) goto needs_decode; |
|
1594
|
28 |
3 |
for (; ptr < end; ptr++) { |
|
1595
|
9 |
19 |
if (unlikely(*ptr == '%') && likely(end - ptr >= 2)) { |
|
|
9 |
0 |
if (unlikely(*ptr == '%') && likely(end - ptr >= 2)) { |
|
1598
|
8 |
1 |
if (likely(c1 != -1 && c2 != -1)) { |
|
|
7 |
1 |
if (likely(c1 != -1 && c2 != -1)) { |
|
1665
|
110 |
6 |
return (r->minor_version == 1) ? psgi_serv11 : psgi_serv10; |
|
1672
|
423 |
6 |
while (*qpos != '?' && qpos < r->uri + r->uri_len) qpos++; |
|
|
355 |
68 |
while (*qpos != '?' && qpos < r->uri + r->uri_len) qpos++; |
|
1673
|
6 |
68 |
if (*qpos == '?') { |
|
1687
|
16 |
16 |
if (unlikely(!r->path)) feersum_set_path_and_query(aTHX_ r); |
|
1694
|
0 |
0 |
if (unlikely(!r->query)) feersum_set_path_and_query(aTHX_ r); |
|
1702
|
0 |
0 |
if (unlikely(!r->addr)) feersum_set_remote_info(aTHX_ r, c->sa); |
|
1710
|
0 |
0 |
if (unlikely(!r->port)) feersum_set_remote_info(aTHX_ r, c->sa); |
|
1778
|
16 |
42 |
if (unlikely(!feersum_tmpl_env)) |
|
1791
|
58 |
0 |
if (likely(!r->addr)) feersum_set_remote_info(aTHX_ r, c->sa); |
|
1795
|
6 |
52 |
if (unlikely(c->expected_cl > 0)) { |
|
1803
|
30 |
28 |
if (request_cb_is_psgi) { |
|
1809
|
58 |
0 |
if (likely(!r->path)) feersum_set_path_and_query(aTHX_ r); |
|
1819
|
212 |
58 |
for (i=0; inum_headers; i++) { |
|
1821
|
0 |
212 |
if (unlikely(hdr->name == NULL && val != NULL)) { |
|
|
0 |
0 |
if (unlikely(hdr->name == NULL && val != NULL)) { |
|
1826
|
6 |
206 |
else if (unlikely(str_case_eq( |
|
1833
|
6 |
200 |
else if (unlikely(str_case_eq( |
|
1841
|
0 |
200 |
if (kbuflen < klen) { |
|
1846
|
1588 |
200 |
for (j=0; jname_len; j++) { |
|
1848
|
1495 |
93 |
*key++ = (n == '-') ? '_' : toupper(n); |
|
1856
|
0 |
200 |
if (unlikely(SvPOK(*val))) { |
|
1903
|
0 |
0 |
COPY_NORM_HEADER(n) |
|
|
0 |
0 |
COPY_NORM_HEADER(n) |
|
|
0 |
0 |
COPY_NORM_HEADER(n) |
|
|
0 |
0 |
COPY_NORM_HEADER(n) |
|
|
0 |
0 |
COPY_NORM_HEADER(n) |
|
|
0 |
0 |
COPY_NORM_HEADER(n) |
|
1905
|
0 |
0 |
COPY_NORM_HEADER(tolower(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER(tolower(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER(tolower(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER(tolower(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER(tolower(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER(tolower(n)) |
|
1907
|
0 |
0 |
COPY_NORM_HEADER(toupper(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER(toupper(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER(toupper(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER(toupper(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER(toupper(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER(toupper(n)) |
|
1909
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : tolower(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : tolower(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : tolower(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : tolower(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : tolower(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : tolower(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : tolower(n)) |
|
1911
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : toupper(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : toupper(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : toupper(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : toupper(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : toupper(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : toupper(n)) |
|
|
0 |
0 |
COPY_NORM_HEADER((n == '-') ? '_' : toupper(n)) |
|
1921
|
0 |
0 |
for (i = 0; i < r->num_headers; i++) { |
|
1923
|
0 |
0 |
if (hdr->name == NULL) continue; |
|
1924
|
0 |
0 |
if (unlikely(str_case_eq(SvPVX(name), SvCUR(name), hdr->name, hdr->name_len))) { |
|
1946
|
0 |
74 |
if (unlikely(c->responding != RESPOND_NOT_STARTED)) |
|
1948
|
22 |
52 |
change_responding_state(c, streaming ? RESPOND_STREAMING : RESPOND_NORMAL); |
|
1950
|
74 |
0 |
if (unlikely(!SvOK(message) || !(SvIOK(message) || SvPOK(message)))) { |
|
|
23 |
51 |
if (unlikely(!SvOK(message) || !(SvIOK(message) || SvPOK(message)))) { |
|
|
0 |
23 |
if (unlikely(!SvOK(message) || !(SvIOK(message) || SvPOK(message)))) { |
|
|
0 |
74 |
if (unlikely(!SvOK(message) || !(SvIOK(message) || SvPOK(message)))) { |
|
1955
|
0 |
74 |
if (unlikely(avl+1 % 2 == 1)) { |
|
1961
|
51 |
23 |
if (SvIOK(message)) |
|
1963
|
0 |
23 |
else if (SvUOK(message)) |
|
1967
|
0 |
23 |
if (unlikely(numtype != IS_NUMBER_IN_UV)) |
|
1972
|
0 |
74 |
if (unlikely(!code)) |
|
1976
|
23 |
51 |
if (likely(!SvPOK(message) || SvCUR(message) == 3)) { |
|
|
1 |
22 |
if (likely(!SvPOK(message) || SvCUR(message) == 3)) { |
|
1982
|
72 |
2 |
c->auto_cl = (code == 304 || code == 204 || (100 <= code && code <= 199)) ? 0 : 1; |
|
|
72 |
0 |
c->auto_cl = (code == 304 || code == 204 || (100 <= code && code <= 199)) ? 0 : 1; |
|
|
72 |
0 |
c->auto_cl = (code == 304 || code == 204 || (100 <= code && code <= 199)) ? 0 : 1; |
|
|
72 |
0 |
c->auto_cl = (code == 304 || code == 204 || (100 <= code && code <= 199)) ? 0 : 1; |
|
1984
|
70 |
4 |
add_const_to_wbuf(c, c->is_http11 ? "HTTP/1.1 " : "HTTP/1.0 ", 9); |
|
1988
|
100 |
74 |
for (i=0; i
|
|
1990
|
100 |
0 |
if (unlikely(!hdr || !SvOK(*hdr))) { |
|
|
0 |
100 |
if (unlikely(!hdr || !SvOK(*hdr))) { |
|
1996
|
100 |
0 |
if (unlikely(!val || !SvOK(*val))) { |
|
|
0 |
100 |
if (unlikely(!val || !SvOK(*val))) { |
|
2003
|
99 |
1 |
if (likely(c->auto_cl) && |
|
2004
|
2 |
97 |
unlikely(str_case_eq("content-length",14,hp,hlen))) |
|
2016
|
70 |
4 |
if (likely(c->is_http11)) { |
|
2021
|
54 |
16 |
if (unlikely(!c->is_keepalive)) |
|
2023
|
0 |
4 |
} else if (unlikely(c->is_keepalive) && !streaming) |
|
|
0 |
0 |
} else if (unlikely(c->is_keepalive) && !streaming) |
|
2026
|
22 |
52 |
if (streaming) { |
|
2027
|
18 |
4 |
if (c->is_http11) |
|
2032
|
0 |
4 |
if (unlikely(c->is_keepalive)) c->is_keepalive = 0; |
|
2047
|
0 |
52 |
if (c->responding != RESPOND_NORMAL) |
|
2050
|
0 |
52 |
if (!SvOK(body)) { |
|
2054
|
49 |
3 |
else if (SvROK(body)) { |
|
2056
|
2 |
47 |
if (SvOK(refd) && !SvROK(refd)) { |
|
|
2 |
0 |
if (SvOK(refd) && !SvROK(refd)) { |
|
2060
|
0 |
47 |
else if (SvTYPE(refd) != SVt_PVAV) { |
|
2070
|
50 |
2 |
if (likely(c->auto_cl)) |
|
2075
|
5 |
47 |
if (body_is_string) { |
|
2083
|
71 |
47 |
for (i=0; i<=amax; i++) { |
|
2085
|
1 |
70 |
if (unlikely(!sv)) continue; |
|
2092
|
50 |
2 |
if (likely(c->auto_cl)) { |
|
2108
|
0 |
14 |
PUSHMARK(SP); |
|
2109
|
0 |
14 |
mXPUSHs(feer_conn_2sv(c)); |
|
2110
|
0 |
14 |
XPUSHs(streamer); |
|
2114
|
14 |
0 |
if (unlikely(SvTRUE(ERRSV))) { |
|
|
0 |
14 |
if (unlikely(SvTRUE(ERRSV))) { |
|
2118
|
14 |
0 |
FREETMPS; |
|
2126
|
33 |
0 |
if (unlikely(!SvOK(ret) || !SvROK(ret))) { |
|
|
0 |
33 |
if (unlikely(!SvOK(ret) || !SvROK(ret))) { |
|
2127
|
0 |
0 |
sv_setpvs(ERRSV, "Invalid PSGI response (expected reference)"); |
|
2132
|
33 |
0 |
if (SvOK(ret) && unlikely(!IsArrayRef(ret))) { |
|
|
33 |
0 |
if (SvOK(ret) && unlikely(!IsArrayRef(ret))) { |
|
|
14 |
19 |
if (SvOK(ret) && unlikely(!IsArrayRef(ret))) { |
|
2133
|
14 |
0 |
if (likely(can_recurse)) { |
|
2138
|
0 |
0 |
sv_setpvs(ERRSV, "PSGI attempt to recurse in a streaming callback"); |
|
2145
|
0 |
19 |
if (unlikely(av_len(psgi_triplet)+1 != 3)) { |
|
2146
|
0 |
0 |
sv_setpvs(ERRSV, "Invalid PSGI array response (expected triplet)"); |
|
2158
|
19 |
0 |
if (IsArrayRef(hdrs)) |
|
|
19 |
0 |
if (IsArrayRef(hdrs)) |
|
2161
|
0 |
0 |
sv_setpvs(ERRSV, "PSGI Headers must be an array-ref"); |
|
2166
|
19 |
0 |
if (likely(IsArrayRef(body))) { |
|
|
14 |
5 |
if (likely(IsArrayRef(body))) { |
|
2170
|
5 |
0 |
else if (likely(SvROK(body))) { // probaby an IO::Handle-like object |
|
2177
|
0 |
0 |
sv_setpvs(ERRSV, "Expected PSGI array-ref or IO::Handle-like body"); |
|
2187
|
23 |
4 |
if (is_writer) { |
|
2189
|
0 |
23 |
if (c->poll_write_cb) { |
|
2193
|
18 |
5 |
if (c->responding < RESPOND_SHUTDOWN) { |
|
2203
|
1 |
3 |
if (c->rbuf) { |
|
2219
|
4 |
2 |
if (guard) { |
|
2220
|
2 |
2 |
if (c->ext_guard) SvREFCNT_dec(c->ext_guard); |
|
2221
|
4 |
0 |
c->ext_guard = SvOK(guard) ? newSVsv(guard) : NULL; |
|
2223
|
6 |
0 |
return c->ext_guard ? newSVsv(c->ext_guard) : &PL_sv_undef; |
|
2233
|
0 |
1 |
PUSHMARK(SP); |
|
2234
|
0 |
1 |
mXPUSHs(newSVsv(ERRSV)); |
|
|
1 |
0 |
mXPUSHs(newSVsv(ERRSV)); |
|
2240
|
1 |
0 |
sv_setsv(ERRSV, &PL_sv_undef); |
|
2256
|
0 |
83 |
PUSHMARK(SP); |
|
2258
|
30 |
53 |
if (request_cb_is_psgi) { |
|
2260
|
0 |
30 |
mXPUSHs(newRV_noinc((SV*)env)); |
|
2264
|
0 |
53 |
mXPUSHs(feer_conn_2sv(c)); |
|
2274
|
83 |
0 |
if (unlikely(SvTRUE(ERRSV))) { |
|
|
1 |
82 |
if (unlikely(SvTRUE(ERRSV))) { |
|
2280
|
30 |
53 |
if (request_cb_is_psgi && likely(returned >= 1)) { |
|
|
30 |
0 |
if (request_cb_is_psgi && likely(returned >= 1)) { |
|
2288
|
30 |
53 |
if (request_cb_is_psgi && likely(returned >= 1)) { |
|
|
30 |
0 |
if (request_cb_is_psgi && likely(returned >= 1)) { |
|
2294
|
30 |
53 |
if (request_cb_is_psgi && c->expected_cl > 0) { |
|
|
0 |
30 |
if (request_cb_is_psgi && c->expected_cl > 0) { |
|
2302
|
83 |
0 |
FREETMPS; |
|
2312
|
6 |
0 |
SV *cb = (is_write) ? c->poll_write_cb : NULL; |
|
2314
|
0 |
6 |
if (unlikely(cb == NULL)) return; |
|
2323
|
0 |
6 |
PUSHMARK(SP); |
|
2324
|
0 |
6 |
mXPUSHs(new_feer_conn_handle(aTHX_ c, is_write)); |
|
2332
|
6 |
0 |
if (unlikely(SvTRUE(ERRSV))) { |
|
|
0 |
6 |
if (unlikely(SvTRUE(ERRSV))) { |
|
2333
|
0 |
0 |
call_died(aTHX_ c, is_write ? "write poll" : "read poll"); |
|
2338
|
6 |
0 |
FREETMPS; |
|
2350
|
0 |
11 |
if (unlikely(io == NULL)) return; |
|
2364
|
0 |
11 |
PUSHMARK(SP); |
|
2365
|
0 |
11 |
XPUSHs(c->poll_write_cb); |
|
2373
|
11 |
0 |
if (unlikely(SvTRUE(ERRSV))) { |
|
|
0 |
11 |
if (unlikely(SvTRUE(ERRSV))) { |
|
2379
|
11 |
0 |
if (returned > 0) |
|
2381
|
11 |
0 |
if (ret && SvMAGICAL(ret)) |
|
|
0 |
11 |
if (ret && SvMAGICAL(ret)) |
|
2384
|
11 |
0 |
if (unlikely(!ret || !SvOK(ret))) { |
|
|
5 |
6 |
if (unlikely(!ret || !SvOK(ret))) { |
|
2386
|
0 |
5 |
PUSHMARK(SP); |
|
2387
|
0 |
5 |
XPUSHs(c->poll_write_cb); |
|
2392
|
5 |
0 |
if (unlikely(SvTRUE(ERRSV))) { |
|
|
0 |
5 |
if (unlikely(SvTRUE(ERRSV))) { |
|
2393
|
0 |
0 |
trouble("Couldn't close body IO handle: %-p",ERRSV); |
|
2404
|
6 |
0 |
if (c->is_http11) |
|
2413
|
11 |
0 |
FREETMPS; |
|
2435
|
0 |
8 |
PUSHMARK(SP); |
|
2436
|
0 |
8 |
XPUSHs(sv); |
|
2437
|
0 |
8 |
mXPUSHs(newSViv(c->fd)); |
|
2443
|
8 |
0 |
if (unlikely(SvTRUE(ERRSV))) { |
|
|
0 |
8 |
if (unlikely(SvTRUE(ERRSV))) { |
|
2455
|
8 |
0 |
if (likely(c->rbuf && SvOK(c->rbuf) && SvCUR(c->rbuf))) { |
|
|
8 |
0 |
if (likely(c->rbuf && SvOK(c->rbuf) && SvCUR(c->rbuf))) { |
|
|
8 |
0 |
if (likely(c->rbuf && SvOK(c->rbuf) && SvCUR(c->rbuf))) { |
|
|
8 |
0 |
if (likely(c->rbuf && SvOK(c->rbuf) && SvCUR(c->rbuf))) { |
|
2470
|
8 |
0 |
FREETMPS; |
|
2483
|
0 |
23 |
if (feer_server_name) |
|
2488
|
0 |
23 |
if (feer_server_port) |
|
2501
|
0 |
23 |
if (getsockname(fd, (struct sockaddr*)&addr, &addr_len) == -1) perror("getsockname"); |
|
2508
|
0 |
23 |
if (setsockopt(fd, IPPROTO_TCP, TCP_DEFER_ACCEPT, &(int){1}, sizeof(int)) < 0) |
|
2553
|
30 |
0 |
if (unlikely(!SvOK(cb) || !SvROK(cb))) |
|
|
0 |
30 |
if (unlikely(!SvOK(cb) || !SvROK(cb))) |
|
2555
|
7 |
23 |
if (request_cb_cv) |
|
2568
|
3 |
0 |
if (!IsCodeRef(cb)) |
|
|
0 |
3 |
if (!IsCodeRef(cb)) |
|
2570
|
0 |
3 |
if (unlikely(shutting_down)) |
|
2579
|
2 |
1 |
if (active_conns <= 0) { |
|
2584
|
0 |
2 |
PUSHMARK(SP); |
|
2590
|
0 |
1 |
FREETMPS; |
|
2599
|
14 |
0 |
double new_read_timeout = 0.0; |
|
2602
|
7 |
7 |
if (items > 1) { |
|
2604
|
3 |
4 |
if (!(new_read_timeout > 0.0)) { |
|
2610
|
0 |
11 |
RETVAL = read_timeout; |
|
2627
|
0 |
0 |
unsigned int new_max_connection_reqs = 0; |
|
2630
|
0 |
0 |
if (items > 1) { |
|
2638
|
0 |
0 |
RETVAL = max_connection_reqs; |
|
2648
|
23 |
0 |
if (request_cb_cv) |
|
2659
|
0 |
0 |
RETVAL = c->fd; |
|
2672
|
16 |
19 |
if (hdl == NULL) { |
|
2680
|
8 |
8 |
if (ix == 2) // only close the writer on destruction |
|
2696
|
2 |
14 |
if (unlikely(items == 4) && SvOK(ST(3)) && SvIOK(ST(3))) |
|
|
2 |
0 |
if (unlikely(items == 4) && SvOK(ST(3)) && SvIOK(ST(3))) |
|
|
2 |
0 |
if (unlikely(items == 4) && SvOK(ST(3)) && SvIOK(ST(3))) |
|
2704
|
0 |
16 |
if (unlikely(c->receiving <= RECEIVE_HEADERS)) |
|
2708
|
12 |
4 |
if (!SvOK(buf) || !SvPOK(buf)) { |
|
|
0 |
12 |
if (!SvOK(buf) || !SvPOK(buf)) { |
|
2711
|
4 |
0 |
SvGROW(buf, len+1); |
|
|
1 |
3 |
SvGROW(buf, len+1); |
|
2714
|
0 |
16 |
if (unlikely(SvREADONLY(buf))) |
|
2717
|
0 |
16 |
if (unlikely(len == 0)) |
|
2721
|
14 |
2 |
if (likely(c->rbuf)) |
|
2727
|
1 |
15 |
if (unlikely(offset < 0)) |
|
2728
|
1 |
0 |
offset = (-offset >= c->received_cl) ? 0 : c->received_cl + offset; |
|
2730
|
4 |
12 |
if (unlikely(len + offset > src_len)) |
|
2736
|
14 |
2 |
if (unlikely(!c->rbuf || src_len == 0 || offset >= c->received_cl)) { |
|
|
0 |
14 |
if (unlikely(!c->rbuf || src_len == 0 || offset >= c->received_cl)) { |
|
|
14 |
2 |
if (unlikely(!c->rbuf || src_len == 0 || offset >= c->received_cl)) { |
|
|
0 |
14 |
if (unlikely(!c->rbuf || src_len == 0 || offset >= c->received_cl)) { |
|
2738
|
2 |
0 |
if (c->receiving == RECEIVE_SHUTDOWN) { |
|
2747
|
5 |
9 |
if (likely(len == src_len && offset == 0)) { |
|
|
5 |
0 |
if (likely(len == src_len && offset == 0)) { |
|
2750
|
3 |
2 |
if (likely(buf_len == 0)) { |
|
2762
|
8 |
1 |
SvGROW(buf, SvCUR(buf) + len); |
|
|
1 |
7 |
SvGROW(buf, SvCUR(buf) + len); |
|
2764
|
7 |
2 |
if (likely(items == 3)) { |
|
2778
|
0 |
29 |
if (unlikely(c->responding != RESPOND_STREAMING)) |
|
2781
|
29 |
0 |
SV *body = (items == 2) ? ST(1) : &PL_sv_undef; |
|
2782
|
29 |
0 |
if (unlikely(!body || !SvOK(body))) |
|
|
0 |
29 |
if (unlikely(!body || !SvOK(body))) |
|
2786
|
0 |
29 |
if (SvROK(body)) { |
|
2788
|
0 |
0 |
if (SvOK(refd) && SvPOK(refd)) { |
|
|
0 |
0 |
if (SvOK(refd) && SvPOK(refd)) { |
|
2797
|
20 |
9 |
if (c->is_http11) |
|
2812
|
0 |
2 |
if (unlikely(c->responding != RESPOND_STREAMING)) |
|
2819
|
2 |
0 |
if (c->is_http11) { |
|
2820
|
10 |
2 |
for (i=0; i<=amax; i++) { |
|
2822
|
8 |
2 |
if (likely(sv)) add_chunk_sv_to_wbuf(c, sv); |
|
2826
|
0 |
0 |
for (i=0; i<=amax; i++) { |
|
2828
|
0 |
0 |
if (likely(sv)) add_sv_to_wbuf(c, sv); |
|
2841
|
7 |
0 |
if (items == 3 && SvOK(ST(2)) && SvIOK(ST(2))) |
|
|
7 |
0 |
if (items == 3 && SvOK(ST(2)) && SvIOK(ST(2))) |
|
|
7 |
0 |
if (items == 3 && SvOK(ST(2)) && SvIOK(ST(2))) |
|
2846
|
0 |
7 |
if (unlikely(!c->rbuf)) { |
|
2850
|
1 |
6 |
else if (offset == 0) { |
|
2853
|
2 |
4 |
else if (offset > 0 && (whence == SEEK_CUR || whence == SEEK_SET)) { |
|
|
1 |
1 |
else if (offset > 0 && (whence == SEEK_CUR || whence == SEEK_SET)) { |
|
|
1 |
0 |
else if (offset > 0 && (whence == SEEK_CUR || whence == SEEK_SET)) { |
|
2856
|
0 |
2 |
if (offset > len) |
|
2861
|
4 |
0 |
else if (offset < 0 && whence == SEEK_END) { |
|
|
2 |
2 |
else if (offset < 0 && whence == SEEK_END) { |
|
2865
|
0 |
2 |
if (offset == 0) { |
|
2868
|
1 |
1 |
else if (offset > 0) { |
|
2895
|
1 |
18 |
SvUVX(hdl_sv) = 0; |
|
2908
|
12 |
0 |
if (unlikely(ix < 1 || ix > 2)) |
|
|
0 |
12 |
if (unlikely(ix < 1 || ix > 2)) |
|
2910
|
0 |
12 |
else if (unlikely(ix == 1)) |
|
2913
|
6 |
6 |
if (c->poll_write_cb != NULL) { |
|
2918
|
6 |
6 |
if (!SvOK(cb)) { |
|
2922
|
6 |
0 |
else if (unlikely(!IsCodeRef(cb))) |
|
|
0 |
6 |
else if (unlikely(!IsCodeRef(cb))) |
|
2933
|
2 |
1 |
RETVAL = feersum_conn_guard(aTHX_ c, (items==2) ? ST(1) : NULL); |
|
2953
|
0 |
0 |
RETVAL = c->is_http11; |
|
2962
|
0 |
38 |
if (unlikely(!SvOK(body))) |
|
2976
|
6 |
0 |
if (IsArrayRef(psgi_response)) { |
|
|
6 |
0 |
if (IsArrayRef(psgi_response)) { |
|
2981
|
3 |
3 |
if (len == 3) { |
|
2986
|
3 |
0 |
else if (len == 2) { |
|
2989
|
3 |
0 |
if (unlikely(!IsArrayRef(headers))) |
|
|
0 |
3 |
if (unlikely(!IsArrayRef(headers))) |
|
3090
|
6 |
0 |
if (likely(c->expected_cl > 0)) { |
|
3119
|
6 |
2 |
RETVAL = c->fd; |
|
3126
|
0 |
0 |
RETVAL = c->is_keepalive; |
|
3134
|
2 |
1 |
RETVAL = feersum_conn_guard(aTHX_ c, (items == 2) ? ST(1) : NULL); |
|
3145
|
69 |
4 |
if (likely(c->rbuf)) SvREFCNT_dec(c->rbuf); |
|
3147
|
1 |
72 |
if (c->wbuf_rinq) { |
|
3149
|
1 |
1 |
while ((m = (struct iomatrix *)rinq_shift(&c->wbuf_rinq)) != NULL) { |
|
3150
|
1 |
1 |
for (i=0; i < m->count; i++) { |
|
3151
|
0 |
1 |
if (m->sv[i]) SvREFCNT_dec(m->sv[i]); |
|
3157
|
70 |
3 |
if (likely(c->req)) { |
|
3158
|
68 |
2 |
if (c->req->buf) SvREFCNT_dec(c->req->buf); |
|
3159
|
58 |
12 |
if (likely(c->req->path)) SvREFCNT_dec(c->req->path); |
|
3160
|
58 |
12 |
if (likely(c->req->query)) SvREFCNT_dec(c->req->query); |
|
3161
|
55 |
15 |
if (likely(c->req->addr)) SvREFCNT_dec(c->req->addr); |
|
3162
|
55 |
15 |
if (likely(c->req->port)) SvREFCNT_dec(c->req->port); |
|
3166
|
73 |
0 |
if (likely(c->sa)) free(c->sa); |
|
3170
|
0 |
73 |
if (c->poll_write_cb) SvREFCNT_dec(c->poll_write_cb); |
|
3172
|
2 |
71 |
if (c->ext_guard) SvREFCNT_dec(c->ext_guard); |
|
3176
|
3 |
70 |
if (unlikely(shutting_down && active_conns <= 0)) { |
|
|
1 |
2 |
if (unlikely(shutting_down && active_conns <= 0)) { |
|
3182
|
1 |
0 |
if (shutdown_cb_cv) { |
|
3183
|
0 |
1 |
PUSHMARK(SP); |
|
3201
|
0 |
24 |
I_EV_API("Feersum"); |
|
|
24 |
0 |
I_EV_API("Feersum"); |
|
|
0 |
24 |
I_EV_API("Feersum"); |