zoukankan      html  css  js  c++  java
  • symbian的HTTP引擎中对302、301事件的处理

    当发起一个Get请求至服务器时,有时候会返回一个页面跳转的信息,这个信息体现在HTTPHEARDER中的具体数值就是302或者301,两者对于用户来说并没有什么本质区别。

    以下是处理方法:

    1.可以在MHFRunL中直接处理:

    void CHttpEngine::MHFRunL(RHTTPTransaction aTransaction,
    		const THTTPEvent& aEvent)
    {
      switch (aEvent.iStatus)
      {
      case THTTPEvent::ERedirectedTemporarily:
      case THTTPEvent::ERedirectedPermanently:
      {
        iUri = aTransaction.Request().URI().UriDes().Alloc();
      }
    }

    其中ERedirectedTemporarily和ERedirectedPermanently分别对应301和302,系统会自动重新发送一个get请求至跳转后的url。

    但是我在用wifi和cmwap的接入点进行测试的时候发现迟迟得不到重新发送的get请求返回的数据。于是我只能自己手动重新发送:

    void CHttpEngine::MHFRunL(RHTTPTransaction aTransaction,
    		const THTTPEvent& aEvent)
    {
      switch (aEvent.iStatus)
      {
      case THTTPEvent::ERedirectedTemporarily:
      case THTTPEvent::ERedirectedPermanently:
      {
        iUri = aTransaction.Request().URI().UriDes().Alloc();
        aTransaction.Close();//关闭当前会话
        SendGetL(*iUri);//发送一个新的get请求
      }
    }
    
    

    2.另外一种处理方式是将http引擎中处理Redirect的过滤器移除:

    	RStringPool pool = iSession.StringPool();
    	iSession.FilterCollection().RemoveFilter( pool.StringF( HTTP::ERedirect, RHTTPSession::GetTable() ) );
    
    

    然后在MHFRunL中进行判断:

    void CHttpEngine::MHFRunL(RHTTPTransaction aTransaction,
    		const THTTPEvent& aEvent)
    {
    	switch (aEvent.iStatus)
    	{
    	case THTTPEvent::EGotResponseHeaders: 
    	{
    		RHTTPResponse resp = aTransaction.Response();
          iResponseCode = resp.StatusCode();
    		if(iResponseCode == 302 || iResponseCode == 301)
    		{
    			RStringF sLocation = iSession.StringPool().StringF(HTTP::ELocation, RHTTPSession::GetTable());
    			THTTPHdrVal headerLocation;
    			resp.GetHeaderCollection().GetField(sLocation, 0, headerLocation);
    			iLocationUrl = headerLocation.StrF().DesC().Alloc();//获取跳转的url地址
             sLocation.Close();
             aTransaction.Close();
             SendGetL(*iLocationUrl);
    		}
      }
      }
    }
    
    

    用这种方式在测试时同样出现了在wifi和cmwap接入点中重新get后无响应的情况。

    本文为脚盆同学原创,如需转载请注明出处。

  • 相关阅读:
    Populating Next Right Pointers in Each Node I&&II ——II仍然需要认真看看
    MySQL源码分析以及目录结构
    mysql分表的三种方法
    Hadoop学习
    关系型数据库ACID
    九种基本数据类型和它们的封装类
    java中堆和栈的区别
    软件测试-----Graph Coverage作业
    Lab1--关于安装JUnit的简要描述
    动态导入(import)和静态导入(import)的区别
  • 原文地址:https://www.cnblogs.com/ziip/p/1793761.html
Copyright © 2011-2022 走看看