Lines Matching refs:req

465 void fcgi_request_set_keep(fcgi_request *req, int new_value)  in fcgi_request_set_keep()  argument
467 req->keep = new_value; in fcgi_request_set_keep()
882 fcgi_request *req = calloc(1, sizeof(fcgi_request)); in fcgi_init_request() local
883 req->listen_socket = listen_socket; in fcgi_init_request()
884 req->fd = -1; in fcgi_init_request()
885 req->id = -1; in fcgi_init_request()
901 req->out_pos = req->out_buf; in fcgi_init_request()
902 req->hook.on_accept = on_accept ? on_accept : fcgi_hook_dummy; in fcgi_init_request()
903 req->hook.on_read = on_read ? on_read : fcgi_hook_dummy; in fcgi_init_request()
904 req->hook.on_close = on_close ? on_close : fcgi_hook_dummy; in fcgi_init_request()
907 req->tcp = !GetNamedPipeInfo((HANDLE)_get_osfhandle(req->listen_socket), NULL, NULL, NULL, NULL); in fcgi_init_request()
910 fcgi_hash_init(&req->env); in fcgi_init_request()
912 return req; in fcgi_init_request()
915 void fcgi_destroy_request(fcgi_request *req) { in fcgi_destroy_request() argument
916 fcgi_hash_destroy(&req->env); in fcgi_destroy_request()
917 free(req); in fcgi_destroy_request()
920 static inline ssize_t safe_write(fcgi_request *req, const void *buf, size_t count) in safe_write() argument
933 if (!req->tcp) { in safe_write()
936 ret = write(req->fd, ((char*)buf)+n, out_len); in safe_write()
940 ret = send(req->fd, ((char*)buf)+n, out_len, 0); in safe_write()
946 ret = write(req->fd, ((char*)buf)+n, count-n); in safe_write()
957 static inline ssize_t safe_read(fcgi_request *req, const void *buf, size_t count) in safe_read() argument
970 if (!req->tcp) { in safe_read()
973 ret = read(req->fd, ((char*)buf)+n, in_len); in safe_read()
977 ret = recv(req->fd, ((char*)buf)+n, in_len, 0); in safe_read()
983 ret = read(req->fd, ((char*)buf)+n, count-n); in safe_read()
1014 static int fcgi_get_params(fcgi_request *req, unsigned char *p, unsigned char *end) in fcgi_get_params() argument
1040 …fcgi_hash_set(&req->env, FCGI_HASH_FUNC(p, name_len), (char*)p, name_len, (char*)p + name_len, val… in fcgi_get_params()
1046 static int fcgi_read_request(fcgi_request *req) in fcgi_read_request() argument
1052 req->keep = 0; in fcgi_read_request()
1053 req->ended = 0; in fcgi_read_request()
1054 req->in_len = 0; in fcgi_read_request()
1055 req->out_hdr = NULL; in fcgi_read_request()
1056 req->out_pos = req->out_buf; in fcgi_read_request()
1058 if (req->has_env) { in fcgi_read_request()
1059 fcgi_hash_clean(&req->env); in fcgi_read_request()
1061 req->has_env = 1; in fcgi_read_request()
1064 if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || in fcgi_read_request()
1073 if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || in fcgi_read_request()
1086 req->id = (hdr.requestIdB1 << 8) + hdr.requestIdB0; in fcgi_read_request()
1091 if (safe_read(req, buf, len+padding) != len+padding) { in fcgi_read_request()
1096 req->keep = (b->flags & FCGI_KEEP_CONN); in fcgi_read_request()
1098 if (req->keep && req->tcp && !req->nodelay) { in fcgi_read_request()
1105 setsockopt(req->fd, IPPROTO_TCP, TCP_NODELAY, (char*)&on, sizeof(on)); in fcgi_read_request()
1106 req->nodelay = 1; in fcgi_read_request()
1111 …fcgi_hash_set(&req->env, FCGI_HASH_FUNC("FCGI_ROLE", sizeof("FCGI_ROLE")-1), "FCGI_ROLE", sizeof("… in fcgi_read_request()
1114 …fcgi_hash_set(&req->env, FCGI_HASH_FUNC("FCGI_ROLE", sizeof("FCGI_ROLE")-1), "FCGI_ROLE", sizeof("… in fcgi_read_request()
1117 …fcgi_hash_set(&req->env, FCGI_HASH_FUNC("FCGI_ROLE", sizeof("FCGI_ROLE")-1), "FCGI_ROLE", sizeof("… in fcgi_read_request()
1123 if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || in fcgi_read_request()
1136 if (safe_read(req, buf, len+padding) != len+padding) { in fcgi_read_request()
1137 req->keep = 0; in fcgi_read_request()
1141 if (!fcgi_get_params(req, buf, buf+len)) { in fcgi_read_request()
1142 req->keep = 0; in fcgi_read_request()
1146 if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || in fcgi_read_request()
1148 req->keep = 0; in fcgi_read_request()
1160 if (safe_read(req, buf, len+padding) != len+padding) { in fcgi_read_request()
1161 req->keep = 0; in fcgi_read_request()
1165 if (!fcgi_get_params(req, buf, buf+len)) { in fcgi_read_request()
1166 req->keep = 0; in fcgi_read_request()
1170 q = req->env.list; in fcgi_read_request()
1204 if (safe_write(req, buf, sizeof(fcgi_header) + len) != (ssize_t)sizeof(fcgi_header)+len) { in fcgi_read_request()
1205 req->keep = 0; in fcgi_read_request()
1216 int fcgi_read(fcgi_request *req, char *str, int len) in fcgi_read() argument
1225 if (req->in_len == 0) { in fcgi_read()
1226 if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || in fcgi_read()
1229 req->keep = 0; in fcgi_read()
1232 req->in_len = (hdr.contentLengthB1 << 8) | hdr.contentLengthB0; in fcgi_read()
1233 req->in_pad = hdr.paddingLength; in fcgi_read()
1234 if (req->in_len == 0) { in fcgi_read()
1239 if (req->in_len >= rest) { in fcgi_read()
1240 ret = (int)safe_read(req, str, rest); in fcgi_read()
1242 ret = (int)safe_read(req, str, req->in_len); in fcgi_read()
1245 req->keep = 0; in fcgi_read()
1248 req->in_len -= ret; in fcgi_read()
1252 if (req->in_len == 0) { in fcgi_read()
1253 if (req->in_pad) { in fcgi_read()
1254 if (safe_read(req, buf, req->in_pad) != req->in_pad) { in fcgi_read()
1255 req->keep = 0; in fcgi_read()
1269 void fcgi_close(fcgi_request *req, int force, int destroy) in fcgi_close() argument
1271 if (destroy && req->has_env) { in fcgi_close()
1272 fcgi_hash_clean(&req->env); in fcgi_close()
1273 req->has_env = 0; in fcgi_close()
1277 if (is_impersonate && !req->tcp) { in fcgi_close()
1282 if ((force || !req->keep) && req->fd >= 0) { in fcgi_close()
1284 if (!req->tcp) { in fcgi_close()
1285 HANDLE pipe = (HANDLE)_get_osfhandle(req->fd); in fcgi_close()
1295 shutdown(req->fd, 1); in fcgi_close()
1297 while (recv(req->fd, buf, sizeof(buf), 0) > 0) {} in fcgi_close()
1299 closesocket(req->fd); in fcgi_close()
1305 shutdown(req->fd, 1); in fcgi_close()
1307 while (recv(req->fd, buf, sizeof(buf), 0) > 0) {} in fcgi_close()
1309 close(req->fd); in fcgi_close()
1312 req->nodelay = 0; in fcgi_close()
1314 req->fd = -1; in fcgi_close()
1316 req->hook.on_close(); in fcgi_close()
1320 int fcgi_is_closed(fcgi_request *req) in fcgi_is_closed() argument
1322 return (req->fd < 0); in fcgi_is_closed()
1363 int fcgi_accept_request(fcgi_request *req) argument
1371 if (req->fd < 0) {
1377 req->hook.on_accept();
1379 if (!req->tcp) {
1380 pipe = (HANDLE)_get_osfhandle(req->listen_socket);
1381 FCGI_LOCK(req->listen_socket);
1389 FCGI_UNLOCK(req->listen_socket);
1397 req->fd = req->listen_socket;
1398 FCGI_UNLOCK(req->listen_socket);
1400 SOCKET listen_socket = (SOCKET)_get_osfhandle(req->listen_socket);
1403 int listen_socket = req->listen_socket;
1408 FCGI_LOCK(req->listen_socket);
1409 req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len);
1410 FCGI_UNLOCK(req->listen_socket);
1413 if (req->fd >= 0 && !fcgi_is_allowed()) {
1415 closesocket(req->fd);
1416 req->fd = -1;
1422 if (req->fd < 0 && (in_shutdown || errno != EINTR)) {
1424 if (req->fd < 0 && (in_shutdown || (errno != EINTR && errno != ECONNABORTED))) {
1432 if (req->fd >= 0) {
1437 fds.fd = req->fd;
1447 fcgi_close(req, 1, 0);
1449 if (req->fd < FD_SETSIZE) {
1455 FD_SET(req->fd, &set);
1458 ret = select(req->fd + 1, &set, NULL, NULL, &tv) >= 0;
1460 if (ret > 0 && FD_ISSET(req->fd, &set)) {
1463 fcgi_close(req, 1, 0);
1466 fcgi_close(req, 1, 0);
1475 req->hook.on_read();
1476 if (fcgi_read_request(req)) {
1478 if (is_impersonate && !req->tcp) {
1479 pipe = (HANDLE)_get_osfhandle(req->fd);
1481 fcgi_close(req, 1, 1);
1486 return req->fd;
1488 fcgi_close(req, 1, 1);
1493 static inline fcgi_header* open_packet(fcgi_request *req, fcgi_request_type type) argument
1495 req->out_hdr = (fcgi_header*) req->out_pos;
1496 req->out_hdr->type = type;
1497 req->out_pos += sizeof(fcgi_header);
1498 return req->out_hdr;
1501 static inline void close_packet(fcgi_request *req) argument
1503 if (req->out_hdr) {
1504 int len = (int)(req->out_pos - ((unsigned char*)req->out_hdr + sizeof(fcgi_header)));
1506req->out_pos += fcgi_make_header(req->out_hdr, (fcgi_request_type)req->out_hdr->type, req->id, len…
1507 req->out_hdr = NULL;
1511 int fcgi_flush(fcgi_request *req, int end) argument
1515 close_packet(req);
1517 len = (int)(req->out_pos - req->out_buf);
1520 fcgi_end_request_rec *rec = (fcgi_end_request_rec*)(req->out_pos);
1522 fcgi_make_header(&rec->hdr, FCGI_END_REQUEST, req->id, sizeof(fcgi_end_request));
1531 if (safe_write(req, req->out_buf, len) != len) {
1532 req->keep = 0;
1533 req->out_pos = req->out_buf;
1537 req->out_pos = req->out_buf;
1541 int fcgi_write(fcgi_request *req, fcgi_request_type type, const char *str, int len) argument
1549 if (req->out_hdr && req->out_hdr->type != type) {
1550 close_packet(req);
1556 limit = sizeof(req->out_buf) - (req->out_pos - req->out_buf);
1558 if (!req->out_hdr) {
1560 if (!fcgi_flush(req, 0)) {
1564 open_packet(req, type);
1566 limit = sizeof(req->out_buf) - (req->out_pos - req->out_buf);
1568 memcpy(req->out_pos, str, rest);
1569 req->out_pos += rest;
1572 memcpy(req->out_pos, str, limit);
1573 req->out_pos += limit;
1576 if (!fcgi_flush(req, 0)) {
1583 limit = (int)(sizeof(req->out_buf) - (req->out_pos - req->out_buf));
1584 if (!req->out_hdr) {
1590 if (!req->out_hdr) {
1591 open_packet(req, type);
1593 memcpy(req->out_pos, str, len);
1594 req->out_pos += len;
1595 } else if (len - limit < (int)(sizeof(req->out_buf) - sizeof(fcgi_header))) {
1596 if (!req->out_hdr) {
1597 open_packet(req, type);
1600 memcpy(req->out_pos, str, limit);
1601 req->out_pos += limit;
1603 if (!fcgi_flush(req, 0)) {
1607 open_packet(req, type);
1608 memcpy(req->out_pos, str + limit, len - limit);
1609 req->out_pos += len - limit;
1615 close_packet(req);
1617 open_packet(req, type);
1618 fcgi_make_header(req->out_hdr, type, req->id, 0xfff8);
1619 req->out_hdr = NULL;
1620 if (!fcgi_flush(req, 0)) {
1623 if (safe_write(req, str + pos, 0xfff8) != 0xfff8) {
1624 req->keep = 0;
1633 open_packet(req, type);
1634 fcgi_make_header(req->out_hdr, type, req->id, (len - pos) - rest);
1635 req->out_hdr = NULL;
1636 if (!fcgi_flush(req, 0)) {
1639 if (safe_write(req, str + pos, (len - pos) - rest) != (len - pos) - rest) {
1640 req->keep = 0;
1644 open_packet(req, type);
1645 memcpy(req->out_pos, str + len - rest, rest);
1646 req->out_pos += rest;
1653 int fcgi_end(fcgi_request *req) { argument
1655 if (!req->ended) {
1656 ret = fcgi_flush(req, 1);
1657 req->ended = 1;
1662 int fcgi_finish_request(fcgi_request *req, int force_close) argument
1666 if (req->fd >= 0) {
1667 ret = fcgi_end(req);
1668 fcgi_close(req, force_close, 1);
1673 int fcgi_has_env(fcgi_request *req) argument
1675 return req && req->has_env;
1678 char* fcgi_getenv(fcgi_request *req, const char* var, int var_len) argument
1682 if (!req) return NULL;
1684 return fcgi_hash_get(&req->env, FCGI_HASH_FUNC(var, var_len), (char*)var, var_len, &val_len);
1687 char* fcgi_quick_getenv(fcgi_request *req, const char* var, int var_len, unsigned int hash_value) argument
1691 return fcgi_hash_get(&req->env, hash_value, (char*)var, var_len, &val_len);
1694 char* fcgi_putenv(fcgi_request *req, char* var, int var_len, char* val) argument
1696 if (!req) return NULL;
1698 fcgi_hash_del(&req->env, FCGI_HASH_FUNC(var, var_len), var, var_len);
1701 …return fcgi_hash_set(&req->env, FCGI_HASH_FUNC(var, var_len), var, var_len, val, (unsigned int)str…
1705 char* fcgi_quick_putenv(fcgi_request *req, char* var, int var_len, unsigned int hash_value, char* v… argument
1708 fcgi_hash_del(&req->env, hash_value, var, var_len);
1711 return fcgi_hash_set(&req->env, hash_value, var, var_len, val, (unsigned int)strlen(val));
1715 void fcgi_loadenv(fcgi_request *req, fcgi_apply_func func, zval *array) argument
1717 fcgi_hash_apply(&req->env, func, array);