⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ssl.c

📁 -
💻 C
📖 第 1 页 / 共 2 页
字号:
	sslState->client.len -= len;	if (sslState->client.len > 0) {	    /* we didn't write the whole thing */	    xmemmove(sslState->client.buf,		sslState->client.buf + len,		sslState->client.len);	}    }    cbdataLock(sslState);    if (len < 0) {	debug(50, 1) ("sslWriteServer: FD %d: write failure: %s.\n",	    fd, xstrerror());	if (!ignoreErrno(errno))	    comm_close(fd);    }    if (cbdataValid(sslState))	sslSetSelect(sslState);    cbdataUnlock(sslState);}/* Writes data from the server buffer to the client side */static voidsslWriteClient(int fd, void *data){    SslStateData *sslState = data;    int len;    assert(fd == sslState->client.fd);    debug(26, 3) ("sslWriteClient: FD %d, %d bytes to write\n",	fd, sslState->server.len);    Counter.syscalls.sock.writes++;    len = write(fd,	sslState->server.buf,	sslState->server.len);    debug(26, 3) ("sslWriteClient: FD %d, %d bytes written\n", fd, len);    if (len > 0) {	fd_bytes(fd, len, FD_WRITE);	kb_incr(&Counter.client_http.kbytes_out, len);	assert(len <= sslState->server.len);	sslState->server.len -= len;	/* increment total object size */	if (sslState->size_ptr)	    *sslState->size_ptr += len;	if (sslState->server.len > 0) {	    /* we didn't write the whole thing */	    xmemmove(sslState->server.buf,		sslState->server.buf + len,		sslState->server.len);	}    }    cbdataLock(sslState);    if (len < 0) {	debug(50, 1) ("sslWriteClient: FD %d: write failure: %s.\n",	    fd, xstrerror());	if (!ignoreErrno(errno))	    comm_close(fd);    }    if (cbdataValid(sslState))	sslSetSelect(sslState);    cbdataUnlock(sslState);}static voidsslTimeout(int fd, void *data){    SslStateData *sslState = data;    debug(26, 3) ("sslTimeout: FD %d\n", fd);    if (sslState->client.fd > -1)	comm_close(sslState->client.fd);    if (sslState->server.fd > -1)	comm_close(sslState->server.fd);}static voidsslConnected(int fd, void *data){    SslStateData *sslState = data;    debug(26, 3) ("sslConnected: FD %d sslState=%p\n", fd, sslState);    xstrncpy(sslState->server.buf, conn_established, SQUID_TCP_SO_RCVBUF);    sslState->server.len = strlen(conn_established);    sslSetSelect(sslState);}static voidsslErrorComplete(int fdnotused, void *data, size_t sizenotused){    SslStateData *sslState = data;    assert(sslState != NULL);    if (sslState->client.fd > -1)	comm_close(sslState->client.fd);    if (sslState->server.fd > -1)	comm_close(sslState->server.fd);}static voidsslConnectDone(int fdnotused, int status, void *data){    SslStateData *sslState = data;    request_t *request = sslState->request;    ErrorState *err = NULL;    if (status == COMM_ERR_DNS) {	debug(26, 4) ("sslConnect: Unknown host: %s\n", sslState->host);	err = errorCon(ERR_DNS_FAIL, HTTP_NOT_FOUND);	err->request = requestLink(request);	err->dnsserver_msg = xstrdup(dns_error_message);	err->callback = sslErrorComplete;	err->callback_data = sslState;	errorSend(sslState->client.fd, err);    } else if (status != COMM_OK) {	err = errorCon(ERR_CONNECT_FAIL, HTTP_SERVICE_UNAVAILABLE);	err->xerrno = errno;	err->host = xstrdup(sslState->host);	err->port = sslState->port;	err->request = requestLink(request);	err->callback = sslErrorComplete;	err->callback_data = sslState;	errorSend(sslState->client.fd, err);    } else {	if (sslState->servers->peer)	    sslProxyConnected(sslState->server.fd, sslState);	else	    sslConnected(sslState->server.fd, sslState);	commSetTimeout(sslState->server.fd,	    Config.Timeout.read,	    sslTimeout,	    sslState);#if DELAY_POOLS	commSetDefer(sslState->server.fd, sslDeferServerRead, sslState);#endif    }}voidsslStart(int fd, const char *url, request_t * request, size_t * size_ptr){    /* Create state structure. */    SslStateData *sslState = NULL;    int sock;    ErrorState *err = NULL;    debug(26, 3) ("sslStart: '%s %s'\n",	RequestMethodStr[request->method], url);    Counter.server.all.requests++;    Counter.server.other.requests++;    /* Create socket. */    sock = comm_open(SOCK_STREAM,	0,	Config.Addrs.tcp_outgoing,	0,	COMM_NONBLOCKING,	url);    if (sock == COMM_ERROR) {	debug(26, 4) ("sslStart: Failed because we're out of sockets.\n");	err = errorCon(ERR_SOCKET_FAILURE, HTTP_INTERNAL_SERVER_ERROR);	err->xerrno = errno;	err->request = requestLink(request);	errorSend(fd, err);	return;    }    sslState = xcalloc(1, sizeof(SslStateData));    cbdataAdd(sslState, cbdataXfree, 0);#if DELAY_POOLS    sslState->delay_id = delayClient(request);    delayRegisterDelayIdPtr(&sslState->delay_id);#endif    sslState->url = xstrdup(url);    sslState->request = requestLink(request);    sslState->size_ptr = size_ptr;    sslState->client.fd = fd;    sslState->server.fd = sock;    sslState->server.buf = xmalloc(SQUID_TCP_SO_RCVBUF);    sslState->client.buf = xmalloc(SQUID_TCP_SO_RCVBUF);    comm_add_close_handler(sslState->server.fd,	sslServerClosed,	sslState);    comm_add_close_handler(sslState->client.fd,	sslClientClosed,	sslState);    commSetTimeout(sslState->client.fd,	Config.Timeout.lifetime,	sslTimeout,	sslState);    commSetTimeout(sslState->server.fd,	Config.Timeout.connect,	sslTimeout,	sslState);    peerSelect(request,	NULL,	sslPeerSelectComplete,	sslState);    /*     * Disable the client read handler until peer selection is complete     * Take control away from client_side.c.     */    commSetSelect(sslState->client.fd, COMM_SELECT_READ, NULL, NULL, 0);}static voidsslProxyConnected(int fd, void *data){    SslStateData *sslState = data;    MemBuf mb;    HttpHeader hdr_out;    Packer p;    http_state_flags flags;    debug(26, 3) ("sslProxyConnected: FD %d sslState=%p\n", fd, sslState);    memset(&flags, '\0', sizeof(flags));    memBufDefInit(&mb);    memBufPrintf(&mb, "CONNECT %s HTTP/1.0\r\n", sslState->url);    httpBuildRequestHeader(sslState->request,	sslState->request,	NULL,			/* StoreEntry */	&hdr_out,	sslState->client.fd,	flags);			/* flags */    packerToMemInit(&p, &mb);    httpHeaderPackInto(&hdr_out, &p);    httpHeaderClean(&hdr_out);    packerClean(&p);    memBufAppend(&mb, "\r\n", 2);    xstrncpy(sslState->client.buf, mb.buf, SQUID_TCP_SO_RCVBUF);    debug(26, 3) ("sslProxyConnected: Sending {%s}\n", sslState->client.buf);    sslState->client.len = mb.size;    memBufClean(&mb);    commSetTimeout(sslState->server.fd,	Config.Timeout.read,	sslTimeout,	sslState);    sslSetSelect(sslState);}static voidsslPeerSelectComplete(FwdServer * fs, void *data){    SslStateData *sslState = data;    request_t *request = sslState->request;    peer *g = NULL;    if (fs == NULL) {	ErrorState *err;	err = errorCon(ERR_CANNOT_FORWARD, HTTP_SERVICE_UNAVAILABLE);	err->request = requestLink(sslState->request);	err->callback = sslErrorComplete;	err->callback_data = sslState;	errorSend(sslState->client.fd, err);	return;    }    sslState->servers = fs;    sslState->host = fs->peer ? fs->peer->host : request->host;    if (fs->peer == NULL) {	sslState->port = request->port;    } else if (fs->peer->http_port != 0) {	sslState->port = fs->peer->http_port;    } else if ((g = peerFindByName(fs->peer->host))) {	sslState->port = g->http_port;    } else {	sslState->port = CACHE_HTTP_PORT;    }#if DELAY_POOLS    /* no point using the delayIsNoDelay stuff since ssl is nice and simple */    if (g && g->options.no_delay && sslState->delay_id) {	delayUnregisterDelayIdPtr(&sslState->delay_id);	sslState->delay_id = 0;    }#endif    hierarchyNote(&sslState->request->hier,	fs->peer ? fs->code : DIRECT,	sslState->host);    commConnectStart(sslState->server.fd,	sslState->host,	sslState->port,	sslConnectDone,	sslState);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -