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

📄 htnews.c

📁 www工具包
💻 C
📖 第 1 页 / 共 2 页
字号:
	case NEWS_SEEK_CACHE:	    if (HTNewsCache_before(request, NULL, 0) == HT_LOADED)		news->state = NEWS_SUCCESS;	    else		news->state = NEWS_NEED_CONNECTION;	    break;	  case NEWS_NEED_CONNECTION: 		/* Let's set up a connection */	    if (!strncasecomp(url, "news:", 5)) {		HTUserProfile * up = HTRequest_userProfile(request);		char * newshost = HTUserProfile_news(up);		StrAllocCopy(news->name, url+5);		if (newshost) {		    char *newshack = NULL;    /* Then we can use HTParse :-) */		    StrAllocCopy(newshack, "news://");		    StrAllocCat(newshack, newshost);		    status = HTHost_connect(host, net, (char *) newshack, NEWS_PORT);		    host = HTNet_host(net);		    HT_FREE(newshack);		} else		    news->state = NEWS_ERROR;	    } else if (!strncasecomp(url, "nntp:", 5)) {		news->name = HTParse(url, "", PARSE_PATH);		status = HTHost_connect(host, net, url, NEWS_PORT);		host = HTNet_host(net);	    } else {		HTTRACE(PROT_TRACE, "News........ Huh?");		news->state = NEWS_ERROR;            }            if (status == HT_OK) {		BOOL greeting = NO;		/* Set up the persistent connection */		if (!HTNet_persistent(net)) {		    HTNet_setPersistent(net, YES, HT_TP_SINGLE);		    greeting = YES;		}		/*		** Check the protocol class to see if we have connected to a		** the right class of server, in this case HTTP.		*/		{		    HTHost * host = HTNet_host(net);		    char * s_class = HTHost_class(host);		    if (s_class && strcasecomp(s_class, "nntp")) {			HTRequest_addError(request, ERR_FATAL, NO, HTERR_CLASS,					   NULL, 0, "HTLoadNews");			news->state = NEWS_ERROR;			break;		    }		    HTHost_setClass(host, "nntp");		}		/* 		** Create the stream pipe FROM the channel to the application.		** The target for the input stream pipe is set up using the		** stream stack.		*/		{		    HTStream * rstream = HTNewsStatus_new(request, news, host);		    HTNet_setReadStream(net, rstream);		    HTRequest_setOutputConnected(request, YES);		}		/*		** Create the stream pipe TO the channel from the application		** and hook it up to the request object		*/		{		    HTOutputStream * output = HTNet_getOutput(net, NULL, 0);		    HTRequest_setInputStream(request, (HTStream *) output);		}		news->state = greeting ? NEWS_NEED_GREETING : NEWS_NEED_SWITCH;	    } else if (status == HT_WOULD_BLOCK || status == HT_PENDING)		return HT_OK;	    else		news->state = NEWS_ERROR;	    break;	  case NEWS_NEED_GREETING:	    status = HTHost_read(HTNet_host(net), net);	    if (status == HT_WOULD_BLOCK)		return HT_OK;	    else if (status == HT_LOADED) {		if (news->repcode/100 == 2)		    news->state = NEWS_NEED_SWITCH;		else		    news->state = NEWS_ERROR;	    } else		news->state = NEWS_ERROR;	    break;	  case NEWS_NEED_SWITCH:	  {	      HTMethod method = HTRequest_method(request);	      /*	      ** Find out what to ask the news server. Syntax of address is	      **	xxx@yyy		Article	      **	<xxx@yyy>	Same article	      **	xxxxx		News group (no "@")	      */	      if (method == METHOD_GET) {		  if (strchr(url, '@')) {				  /* ARTICLE */		      if (*(news->name) != '<') {		  /* Add '<' and '>' */			  char *newart;			  if ((newart = (char  *) HT_MALLOC(strlen(news->name)+3)) == NULL)			      HT_OUTOFMEM("HTLoadNews");			  sprintf(newart, "<%s>", news->name);			  HT_FREE(news->name);			  news->name = newart;		      }		      news->state = NEWS_NEED_ARTICLE;		  } else if (strchr(url, '*'))		      news->state = NEWS_NEED_LIST;		  else		      news->state = NEWS_NEED_GROUP;	      } else if (method == METHOD_POST)		  news->state = NEWS_NEED_POST;	      else {		  HTRequest_addError(request, ERR_FATAL, NO,				     HTERR_NOT_IMPLEMENTED,NULL, 0,"HTLoadNews");		  news->state = NEWS_ERROR;	      }	      HTUnEscape(news->name);	      HTCleanTelnetString(news->name);	  }	  break;	  case NEWS_NEED_ARTICLE:	    if (!news->sent) {		status = SendCommand(request, news, "ARTICLE", news->name);		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_ERROR)		    news->state = NEWS_ERROR;		news->format = WWW_MIME;		/*		** Set the default content type to plain text as news servers		** almost never send any useful information about the length		** of the body or the type - the success of MIME!		*/		HTAnchor_setFormat(anchor, WWW_PLAINTEXT);		news->sent = YES;	    } else {		status = HTHost_read(HTNet_host(net), net);		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_OK)		    news->state = NEWS_NEED_BODY;		else if (status == HT_LOADED) {		    news->state = (news->repcode/100 == 2) ?			NEWS_SUCCESS : NEWS_ERROR;		} else		    news->state = NEWS_ERROR;		news->sent = NO;	    }	    break;#if HT_LISTGROUP	  case NEWS_NEED_LGRP:	    if (!news->sent) {		status = SendCommand(request, news, "LIST", "NEWSGROUPS");		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_ERROR)		    news->state = NEWS_ERROR; 		news->format = WWW_NNTP_LIST;		news->sent = YES;	    } else {		status = HTHost_read(HTNet_host(net), net);		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_OK)		    news->state = NEWS_NEED_BODY;		else if (status == HT_LOADED) {		    news->state = (news->repcode/100 == 2) ?			NEWS_SUCCESS : NEWS_NEED_LIST;		} else		    news->state = NEWS_ERROR;		news->sent = NO;	    }	    break;#endif /* HT_LISTGROUP */	  case NEWS_NEED_LIST:	    if (!news->sent) {		status = SendCommand(request, news, "LIST", NULL);		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_ERROR)		    news->state = NEWS_ERROR;		news->format = WWW_NNTP_LIST;		news->sent = YES;	    } else {		status = HTHost_read(HTNet_host(net), net);		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_OK)		    news->state = NEWS_NEED_BODY;		else if (status == HT_LOADED) {		    news->state = (news->repcode/100 == 2) ?			NEWS_SUCCESS : NEWS_ERROR;		} else		    news->state = NEWS_ERROR;		news->sent = NO;	    }	    break;	  case NEWS_NEED_GROUP:	    if (!news->sent) {		status = SendCommand(request, news, "GROUP", news->name);		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_ERROR)		    news->state = NEWS_ERROR;		news->sent = YES;	    } else {		status = HTHost_read(HTNet_host(net), net);		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_LOADED) {		    if (news->repcode/100 == 2) {			if (sscanf(news->reply, "%d%d%d", &news->total,				   &news->first, &news->last) == 3) {			    if (MaxArt && news->total>MaxArt)				news->last = news->first-MaxArt;			    news->current = news->first;			    /* If no content in this group */			    if (news->first == news->last) {				HTRequest_addError(request, ERR_FATAL, NO,						   HTERR_NO_CONTENT,						   NULL, 0, "HTLoadNews");				news->state = NEWS_NO_DATA;				break;			    }			    news->state = NEWS_NEED_XOVER;			} else			    news->state = NEWS_ERROR;		    } else			news->state = NEWS_ERROR;		} else		    news->state = NEWS_ERROR;		news->sent = NO;	    }	    break;	  case NEWS_NEED_XOVER:	    if (!news->sent) {		char buf[20];		sprintf(buf, "%d-%d", news->first, news->last);		status = SendCommand(request, news, "XOVER", buf);		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_ERROR)		    news->state = NEWS_ERROR;		news->format = WWW_NNTP_OVER;		news->sent = YES;	    } else {		status = HTHost_read(HTNet_host(net), net);		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_OK)		    news->state = NEWS_NEED_BODY;		else if (status == HT_LOADED) {		    if (news->repcode/100 == 2)			news->state = NEWS_SUCCESS;		    else {			news->format = WWW_NNTP_HEAD;			news->state = NEWS_NEED_HEAD;		    }		} else		    news->state = NEWS_ERROR;		news->sent = NO;	    }	    break;	  case NEWS_NEED_HEAD:	    if (!news->sent) {		char buf[10];		sprintf(buf, "%d", news->current++);		status = SendCommand(request, news, "HEAD", buf);		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_ERROR)		    news->state = NEWS_ERROR;		news->sent = YES;	    } else {		status = HTHost_read(HTNet_host(net), net);		if (status == HT_WOULD_BLOCK)		    return HT_OK;		else if (status == HT_LOADED) {		    if (news->repcode/100 == 2) {			if (news->current > news->last)			    news->state = NEWS_SUCCESS;		    } else			news->state = NEWS_ERROR;		} else		    news->state = NEWS_ERROR;		news->sent = NO;	    }	    break;	  case NEWS_NEED_POST:	  {	      HTStream * oldinput = HTRequest_inputStream(request);	      HTStream * newinput =		  HTNewsPost_new(request, HTBuffer_new(oldinput, request,512));	      HTRequest_setInputStream(request, newinput);	      	      /* Remember to convert to CRLF */	  }	  news->state = NEWS_NEED_BODY;	  break;          case NEWS_NEED_BODY:            if (type == HTEvent_WRITE || type == HTEvent_BEGIN) {		if (HTRequest_isDestination(request)) {		    HTRequest * source = HTRequest_source(request);		    HTNet * srcnet = HTRequest_net(source);		    if (srcnet) {			HTHost_register(HTNet_host(srcnet), srcnet, HTEvent_READ);			HTHost_unregister(HTNet_host(srcnet), srcnet, HTEvent_WRITE);		    }		    return HT_OK;		}		/*		**  Should we use the input stream directly or call the post		**  callback function to send data down to the network?		*/		{		    HTStream * input = HTRequest_inputStream(request);		    HTPostCallback * pcbf = HTRequest_postCallback(request);		    if (pcbf) {			status = pcbf(request, input);			if (status == HT_PAUSE || status == HT_LOADED)			    type = HTEvent_READ;		    } else {			status = (*input->isa->flush)(input);			type = HTEvent_READ;		    }		    if (status == HT_WOULD_BLOCK) return HT_OK;		}		status = request->PostCallback ?                    request->PostCallback(request, request->input_stream) :			(*request->input_stream->isa->flush)(request->input_stream); 		if (status == HT_WOULD_BLOCK)                    return HT_OK;                else 	                    type = HTEvent_READ;	  /* Trick to ensure that we do READ */	    } else if (type == HTEvent_READ) {                status = HTHost_read(HTNet_host(net), net);		if (status == HT_WOULD_BLOCK)		    return HT_OK;                else if (status == HT_LOADED)		    news->state = NEWS_SUCCESS;		else		    news->state = NEWS_ERROR;	    } else {		news->state = NEWS_ERROR;	    }	    break;			  case NEWS_SUCCESS:	    HTNewsCleanup(request, HT_LOADED);	    return HT_OK;	    break;	case NEWS_NO_DATA:	    HTNewsCleanup(request, HT_NO_DATA);	    return HT_OK;	    break;	  case NEWS_ERROR:	    HTNewsCleanup(request, HT_NOT_FOUND);	    return HT_OK;	    break;	}    } /* End of while(1) */}

⌨️ 快捷键说明

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