int cso_recno;
int len;
char *buf; /* pts to a 4k page */
- int fd;
+ Comm::ConnectionPointer serverConn;
HttpRequest *req;
FwdState::Pointer fwd;
char replybuf[BUFSIZ];
/// \ingroup ServerProtocolGopherInternal
static void
-gopherStateFree(int fdnotused, void *data)
+gopherStateFree(int, void *data)
{
GopherStateData *gopherState = (GopherStateData *)data;
gopherTimeout(int fd, void *data)
{
GopherStateData *gopherState = (GopherStateData *)data;
- StoreEntry *entry = gopherState->entry;
- debugs(10, 4, "gopherTimeout: FD " << fd << ": '" << entry->url() << "'" );
+ debugs(10, 4, HERE << gopherState->serverConn << ": '" << gopherState->entry->url() << "'" );
gopherState->fwd->fail(errorCon(ERR_READ_TIMEOUT, HTTP_GATEWAY_TIMEOUT, gopherState->fwd->request));
- comm_close(fd);
+ if (Comm::IsConnOpen(gopherState->serverConn))
+ gopherState->serverConn->close();
}
/**
* Read until error or connection closed.
*/
static void
-gopherReadReply(int fd, char *buf, size_t len, comm_err_t flag, int xerrno, void *data)
+gopherReadReply(const Comm::ConnectionPointer &conn, char *buf, size_t len, comm_err_t flag, int xerrno, void *data)
{
GopherStateData *gopherState = (GopherStateData *)data;
StoreEntry *entry = gopherState->entry;
assert(buf == gopherState->replybuf);
if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) {
- comm_close(fd);
+ gopherState->serverConn->close();
return;
}
/* leave one space for \0 in gopherToHTML */
+ debugs(10, 5, HERE << conn << " read len=" << len);
+
if (flag == COMM_OK && len > 0) {
#if DELAY_POOLS
delayId.bytesIn(len);
kb_incr(&statCounter.server.all.kbytes_in, len);
kb_incr(&statCounter.server.other.kbytes_in, len);
- }
- debugs(10, 5, "gopherReadReply: FD " << fd << " read len=" << len);
-
- if (flag == COMM_OK && len > 0) {
- commSetTimeout(fd, Config.Timeout.read, NULL, NULL);
+ commSetTimeout(conn->fd, Config.Timeout.read, NULL, NULL);
IOStats.Gopher.reads++;
for (clen = len - 1, bin = 0; clen; bin++)
if (ignoreErrno(errno)) {
do_next_read = 1;
} else {
- ErrorState *err;
- err = errorCon(ERR_READ_ERROR, HTTP_INTERNAL_SERVER_ERROR, gopherState->fwd->request);
+ ErrorState *err = errorCon(ERR_READ_ERROR, HTTP_INTERNAL_SERVER_ERROR, gopherState->fwd->request);
err->xerrno = errno;
gopherState->fwd->fail(err);
- comm_close(fd);
+ gopherState->serverConn->close();
do_next_read = 0;
}
} else if (len == 0 && entry->isEmpty()) {
gopherState->fwd->fail(errorCon(ERR_ZERO_SIZE_OBJECT, HTTP_SERVICE_UNAVAILABLE, gopherState->fwd->request));
- comm_close(fd);
+ gopherState->serverConn->close();
do_next_read = 0;
} else if (len == 0) {
/* Connection closed; retrieval done. */
gopherEndHTML(gopherState);
entry->timestampsSet();
-
entry->flush();
-
gopherState->fwd->complete();
-
- comm_close(fd);
-
+ gopherState->serverConn->close();
do_next_read = 0;
} else {
if (gopherState->conversion != gopher_ds::NORMAL) {
}
if (do_next_read)
- comm_read(fd, buf, read_sz, gopherReadReply, gopherState);
+ comm_read(conn, buf, read_sz, gopherReadReply, gopherState);
return;
}
* This will be called when request write is complete. Schedule read of reply.
*/
static void
-gopherSendComplete(int fd, char *buf, size_t size, comm_err_t errflag, int xerrno, void *data)
+gopherSendComplete(const Comm::ConnectionPointer &conn, char *buf, size_t size, comm_err_t errflag, int xerrno, void *data)
{
GopherStateData *gopherState = (GopherStateData *) data;
StoreEntry *entry = gopherState->entry;
- debugs(10, 5, "gopherSendComplete: FD " << fd << " size: " << size << " errflag: " << errflag);
+ debugs(10, 5, HERE << conn << " size: " << size << " errflag: " << errflag);
if (size > 0) {
- fd_bytes(fd, size, FD_WRITE);
+ fd_bytes(conn->fd, size, FD_WRITE);
kb_incr(&statCounter.server.all.kbytes_out, size);
kb_incr(&statCounter.server.other.kbytes_out, size);
}
err->port = gopherState->fwd->request->port;
err->url = xstrdup(entry->url());
gopherState->fwd->fail(err);
- comm_close(fd);
+ gopherState->serverConn->close();
if (buf)
memFree(buf, MEM_4K_BUF); /* Allocated by gopherSendRequest. */
/* Schedule read reply. */
AsyncCall::Pointer call = commCbCall(10,5, "gopherReadReply",
CommIoCbPtrFun(gopherReadReply, gopherState));
- entry->delayAwareRead(fd, gopherState->replybuf, BUFSIZ, call);
+ entry->delayAwareRead(conn->fd, gopherState->replybuf, BUFSIZ, call);
if (buf)
memFree(buf, MEM_4K_BUF); /* Allocated by gopherSendRequest. */
snprintf(buf, 4096, "%s\r\n", gopherState->request);
}
- debugs(10, 5, "gopherSendRequest: FD " << fd);
- comm_write(fd, buf, strlen(buf), gopherSendComplete, gopherState, NULL);
+ debugs(10, 5, HERE << gopherState->serverConn);
+ comm_write(gopherState->serverConn, buf, strlen(buf), gopherSendComplete, gopherState, NULL);
if (EBIT_TEST(gopherState->entry->flags, ENTRY_CACHABLE))
gopherState->entry->setPublicKey(); /* Make it public */
void
gopherStart(FwdState * fwd)
{
- int fd = fwd->server_fd;
StoreEntry *entry = fwd->entry;
GopherStateData *gopherState;
CBDATA_INIT_TYPE(GopherStateData);
gopher_request_parse(fwd->request,
&gopherState->type_id, gopherState->request);
- comm_add_close_handler(fd, gopherStateFree, gopherState);
+ comm_add_close_handler(fwd->serverConnection()->fd, gopherStateFree, gopherState);
if (((gopherState->type_id == GOPHER_INDEX) || (gopherState->type_id == GOPHER_CSO))
&& (strchr(gopherState->request, '?') == NULL)) {
gopherToHTML(gopherState, (char *) NULL, 0);
fwd->complete();
- comm_close(fd);
return;
}
- gopherState->fd = fd;
- gopherState->fwd = fwd;
- gopherSendRequest(fd, gopherState);
- commSetTimeout(fd, Config.Timeout.read, gopherTimeout, gopherState);
+ gopherState->serverConn = fwd->serverConnection();
+ gopherSendRequest(fwd->serverConnection()->fd, gopherState);
+ commSetTimeout(fwd->serverConnection()->fd, Config.Timeout.read, gopherTimeout, gopherState);
}