Lines Matching refs:req

467 void fcgi_request_set_keep(fcgi_request *req, int new_value)  in fcgi_request_set_keep()  argument
469 req->keep = new_value; in fcgi_request_set_keep()
884 fcgi_request *req = calloc(1, sizeof(fcgi_request)); in fcgi_init_request() local
885 req->listen_socket = listen_socket; in fcgi_init_request()
886 req->fd = -1; in fcgi_init_request()
887 req->id = -1; in fcgi_init_request()
903 req->out_pos = req->out_buf; in fcgi_init_request()
904 req->hook.on_accept = on_accept ? on_accept : fcgi_hook_dummy; in fcgi_init_request()
905 req->hook.on_read = on_read ? on_read : fcgi_hook_dummy; in fcgi_init_request()
906 req->hook.on_close = on_close ? on_close : fcgi_hook_dummy; in fcgi_init_request()
909 req->tcp = !GetNamedPipeInfo((HANDLE)_get_osfhandle(req->listen_socket), NULL, NULL, NULL, NULL); in fcgi_init_request()
912 fcgi_hash_init(&req->env); in fcgi_init_request()
914 return req; in fcgi_init_request()
917 void fcgi_destroy_request(fcgi_request *req) { in fcgi_destroy_request() argument
918 fcgi_hash_destroy(&req->env); in fcgi_destroy_request()
919 free(req); in fcgi_destroy_request()
922 static inline ssize_t safe_write(fcgi_request *req, const void *buf, size_t count) in safe_write() argument
935 if (!req->tcp) { in safe_write()
938 ret = write(req->fd, ((char*)buf)+n, out_len); in safe_write()
942 ret = send(req->fd, ((char*)buf)+n, out_len, 0); in safe_write()
948 ret = write(req->fd, ((char*)buf)+n, count-n); in safe_write()
959 static inline ssize_t safe_read(fcgi_request *req, const void *buf, size_t count) in safe_read() argument
972 if (!req->tcp) { in safe_read()
975 ret = read(req->fd, ((char*)buf)+n, in_len); in safe_read()
979 ret = recv(req->fd, ((char*)buf)+n, in_len, 0); in safe_read()
985 ret = read(req->fd, ((char*)buf)+n, count-n); in safe_read()
1016 static int fcgi_get_params(fcgi_request *req, unsigned char *p, unsigned char *end) in fcgi_get_params() argument
1042 …fcgi_hash_set(&req->env, FCGI_HASH_FUNC(p, name_len), (char*)p, name_len, (char*)p + name_len, val… in fcgi_get_params()
1048 static int fcgi_read_request(fcgi_request *req) in fcgi_read_request() argument
1054 req->keep = 0; in fcgi_read_request()
1055 req->ended = 0; in fcgi_read_request()
1056 req->in_len = 0; in fcgi_read_request()
1057 req->out_hdr = NULL; in fcgi_read_request()
1058 req->out_pos = req->out_buf; in fcgi_read_request()
1060 if (req->has_env) { in fcgi_read_request()
1061 fcgi_hash_clean(&req->env); in fcgi_read_request()
1063 req->has_env = 1; in fcgi_read_request()
1066 if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || in fcgi_read_request()
1075 if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || in fcgi_read_request()
1088 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()
1095 req->keep = (((fcgi_begin_request*)buf)->flags & FCGI_KEEP_CONN); in fcgi_read_request()
1097 if (req->keep && req->tcp && !req->nodelay) { in fcgi_read_request()
1104 setsockopt(req->fd, IPPROTO_TCP, TCP_NODELAY, (char*)&on, sizeof(on)); in fcgi_read_request()
1105 req->nodelay = 1; in fcgi_read_request()
1110 …fcgi_hash_set(&req->env, FCGI_HASH_FUNC("FCGI_ROLE", sizeof("FCGI_ROLE")-1), "FCGI_ROLE", sizeof("… in fcgi_read_request()
1113 …fcgi_hash_set(&req->env, FCGI_HASH_FUNC("FCGI_ROLE", sizeof("FCGI_ROLE")-1), "FCGI_ROLE", sizeof("… in fcgi_read_request()
1116 …fcgi_hash_set(&req->env, FCGI_HASH_FUNC("FCGI_ROLE", sizeof("FCGI_ROLE")-1), "FCGI_ROLE", sizeof("… in fcgi_read_request()
1122 if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || in fcgi_read_request()
1135 if (safe_read(req, buf, len+padding) != len+padding) { in fcgi_read_request()
1136 req->keep = 0; in fcgi_read_request()
1140 if (!fcgi_get_params(req, buf, buf+len)) { in fcgi_read_request()
1141 req->keep = 0; in fcgi_read_request()
1145 if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || in fcgi_read_request()
1147 req->keep = 0; in fcgi_read_request()
1159 if (safe_read(req, buf, len+padding) != len+padding) { in fcgi_read_request()
1160 req->keep = 0; in fcgi_read_request()
1164 if (!fcgi_get_params(req, buf, buf+len)) { in fcgi_read_request()
1165 req->keep = 0; in fcgi_read_request()
1169 q = req->env.list; in fcgi_read_request()
1203 if (safe_write(req, buf, sizeof(fcgi_header) + len) != (ssize_t)sizeof(fcgi_header)+len) { in fcgi_read_request()
1204 req->keep = 0; in fcgi_read_request()
1215 int fcgi_read(fcgi_request *req, char *str, int len) in fcgi_read() argument
1224 if (req->in_len == 0) { in fcgi_read()
1225 if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) || in fcgi_read()
1228 req->keep = 0; in fcgi_read()
1231 req->in_len = (hdr.contentLengthB1 << 8) | hdr.contentLengthB0; in fcgi_read()
1232 req->in_pad = hdr.paddingLength; in fcgi_read()
1233 if (req->in_len == 0) { in fcgi_read()
1238 if (req->in_len >= rest) { in fcgi_read()
1239 ret = (int)safe_read(req, str, rest); in fcgi_read()
1241 ret = (int)safe_read(req, str, req->in_len); in fcgi_read()
1244 req->keep = 0; in fcgi_read()
1247 req->in_len -= ret; in fcgi_read()
1251 if (req->in_len == 0) { in fcgi_read()
1252 if (req->in_pad) { in fcgi_read()
1253 if (safe_read(req, buf, req->in_pad) != req->in_pad) { in fcgi_read()
1254 req->keep = 0; in fcgi_read()
1268 void fcgi_close(fcgi_request *req, int force, int destroy) in fcgi_close() argument
1270 if (destroy && req->has_env) { in fcgi_close()
1271 fcgi_hash_clean(&req->env); in fcgi_close()
1272 req->has_env = 0; in fcgi_close()
1276 if (is_impersonate && !req->tcp) { in fcgi_close()
1281 if ((force || !req->keep) && req->fd >= 0) { in fcgi_close()
1283 if (!req->tcp) { in fcgi_close()
1284 HANDLE pipe = (HANDLE)_get_osfhandle(req->fd); in fcgi_close()
1294 shutdown(req->fd, 1); in fcgi_close()
1296 while (recv(req->fd, buf, sizeof(buf), 0) > 0) {} in fcgi_close()
1298 closesocket(req->fd); in fcgi_close()
1304 shutdown(req->fd, 1); in fcgi_close()
1306 while (recv(req->fd, buf, sizeof(buf), 0) > 0) {} in fcgi_close()
1308 close(req->fd); in fcgi_close()
1311 req->nodelay = 0; in fcgi_close()
1313 req->fd = -1; in fcgi_close()
1315 req->hook.on_close(); in fcgi_close()
1319 int fcgi_is_closed(fcgi_request *req) in fcgi_is_closed() argument
1321 return (req->fd < 0); in fcgi_is_closed()
1362 int fcgi_accept_request(fcgi_request *req) argument
1370 if (req->fd < 0) {
1376 if (!req->tcp) {
1377 pipe = (HANDLE)_get_osfhandle(req->listen_socket);
1378 FCGI_LOCK(req->listen_socket);
1386 FCGI_UNLOCK(req->listen_socket);
1394 req->fd = req->listen_socket;
1395 FCGI_UNLOCK(req->listen_socket);
1397 SOCKET listen_socket = (SOCKET)_get_osfhandle(req->listen_socket);
1400 int listen_socket = req->listen_socket;
1405 req->hook.on_accept();
1407 FCGI_LOCK(req->listen_socket);
1408 req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len);
1409 FCGI_UNLOCK(req->listen_socket);
1412 if (req->fd >= 0 && !fcgi_is_allowed()) {
1414 closesocket(req->fd);
1415 req->fd = -1;
1421 if (req->fd < 0 && (in_shutdown || errno != EINTR)) {
1423 if (req->fd < 0 && (in_shutdown || (errno != EINTR && errno != ECONNABORTED))) {
1431 if (req->fd >= 0) {
1436 fds.fd = req->fd;
1446 fcgi_close(req, 1, 0);
1448 if (req->fd < FD_SETSIZE) {
1454 FD_SET(req->fd, &set);
1457 ret = select(req->fd + 1, &set, NULL, NULL, &tv) >= 0;
1459 if (ret > 0 && FD_ISSET(req->fd, &set)) {
1462 fcgi_close(req, 1, 0);
1465 fcgi_close(req, 1, 0);
1474 req->hook.on_read();
1475 if (fcgi_read_request(req)) {
1477 if (is_impersonate && !req->tcp) {
1478 pipe = (HANDLE)_get_osfhandle(req->fd);
1480 fcgi_close(req, 1, 1);
1485 return req->fd;
1487 fcgi_close(req, 1, 1);
1492 static inline fcgi_header* open_packet(fcgi_request *req, fcgi_request_type type) argument
1494 req->out_hdr = (fcgi_header*) req->out_pos;
1495 req->out_hdr->type = type;
1496 req->out_pos += sizeof(fcgi_header);
1497 return req->out_hdr;
1500 static inline void close_packet(fcgi_request *req) argument
1502 if (req->out_hdr) {
1503 int len = (int)(req->out_pos - ((unsigned char*)req->out_hdr + sizeof(fcgi_header)));
1505req->out_pos += fcgi_make_header(req->out_hdr, (fcgi_request_type)req->out_hdr->type, req->id, len…
1506 req->out_hdr = NULL;
1510 int fcgi_flush(fcgi_request *req, int end) argument
1514 close_packet(req);
1516 len = (int)(req->out_pos - req->out_buf);
1519 fcgi_end_request_rec *rec = (fcgi_end_request_rec*)(req->out_pos);
1521 fcgi_make_header(&rec->hdr, FCGI_END_REQUEST, req->id, sizeof(fcgi_end_request));
1530 if (safe_write(req, req->out_buf, len) != len) {
1531 req->keep = 0;
1532 req->out_pos = req->out_buf;
1536 req->out_pos = req->out_buf;
1540 int fcgi_write(fcgi_request *req, fcgi_request_type type, const char *str, int len) argument
1548 if (req->out_hdr && req->out_hdr->type != type) {
1549 close_packet(req);
1555 limit = sizeof(req->out_buf) - (req->out_pos - req->out_buf);
1557 if (!req->out_hdr) {
1559 if (!fcgi_flush(req, 0)) {
1563 open_packet(req, type);
1565 limit = sizeof(req->out_buf) - (req->out_pos - req->out_buf);
1567 memcpy(req->out_pos, str, rest);
1568 req->out_pos += rest;
1571 memcpy(req->out_pos, str, limit);
1572 req->out_pos += limit;
1575 if (!fcgi_flush(req, 0)) {
1582 limit = (int)(sizeof(req->out_buf) - (req->out_pos - req->out_buf));
1583 if (!req->out_hdr) {
1589 if (!req->out_hdr) {
1590 open_packet(req, type);
1592 memcpy(req->out_pos, str, len);
1593 req->out_pos += len;
1594 } else if (len - limit < sizeof(req->out_buf) - sizeof(fcgi_header)) {
1595 if (!req->out_hdr) {
1596 open_packet(req, type);
1599 memcpy(req->out_pos, str, limit);
1600 req->out_pos += limit;
1602 if (!fcgi_flush(req, 0)) {
1606 open_packet(req, type);
1607 memcpy(req->out_pos, str + limit, len - limit);
1608 req->out_pos += len - limit;
1614 close_packet(req);
1616 open_packet(req, type);
1617 fcgi_make_header(req->out_hdr, type, req->id, 0xfff8);
1618 req->out_hdr = NULL;
1619 if (!fcgi_flush(req, 0)) {
1622 if (safe_write(req, str + pos, 0xfff8) != 0xfff8) {
1623 req->keep = 0;
1632 open_packet(req, type);
1633 fcgi_make_header(req->out_hdr, type, req->id, (len - pos) - rest);
1634 req->out_hdr = NULL;
1635 if (!fcgi_flush(req, 0)) {
1638 if (safe_write(req, str + pos, (len - pos) - rest) != (len - pos) - rest) {
1639 req->keep = 0;
1643 open_packet(req, type);
1644 memcpy(req->out_pos, str + len - rest, rest);
1645 req->out_pos += rest;
1652 int fcgi_end(fcgi_request *req) { argument
1654 if (!req->ended) {
1655 ret = fcgi_flush(req, 1);
1656 req->ended = 1;
1661 int fcgi_finish_request(fcgi_request *req, int force_close) argument
1665 if (req->fd >= 0) {
1666 ret = fcgi_end(req);
1667 fcgi_close(req, force_close, 1);
1672 int fcgi_has_env(fcgi_request *req) argument
1674 return req && req->has_env;
1677 char* fcgi_getenv(fcgi_request *req, const char* var, int var_len) argument
1681 if (!req) return NULL;
1683 return fcgi_hash_get(&req->env, FCGI_HASH_FUNC(var, var_len), (char*)var, var_len, &val_len);
1686 char* fcgi_quick_getenv(fcgi_request *req, const char* var, int var_len, unsigned int hash_value) argument
1690 return fcgi_hash_get(&req->env, hash_value, (char*)var, var_len, &val_len);
1693 char* fcgi_putenv(fcgi_request *req, char* var, int var_len, char* val) argument
1695 if (!req) return NULL;
1697 fcgi_hash_del(&req->env, FCGI_HASH_FUNC(var, var_len), var, var_len);
1700 …return fcgi_hash_set(&req->env, FCGI_HASH_FUNC(var, var_len), var, var_len, val, (unsigned int)str…
1704 char* fcgi_quick_putenv(fcgi_request *req, char* var, int var_len, unsigned int hash_value, char* v… argument
1707 fcgi_hash_del(&req->env, hash_value, var, var_len);
1710 return fcgi_hash_set(&req->env, hash_value, var, var_len, val, (unsigned int)strlen(val));
1714 void fcgi_loadenv(fcgi_request *req, fcgi_apply_func func, zval *array) argument
1716 fcgi_hash_apply(&req->env, func, array);