http.cpp
上传用户:chn_coc
上传日期:2007-12-20
资源大小:563k
文件大小:4k
源码类别:

P2P编程

开发平台:

Windows_Unix

  1. // ------------------------------------------------
  2. // File : http.cpp
  3. // Date: 4-apr-2002
  4. // Author: giles
  5. // Desc: 
  6. // HTTP protocol handling
  7. //
  8. // (c) 2002 peercast.org
  9. // ------------------------------------------------
  10. // This program is free software; you can redistribute it and/or modify
  11. // it under the terms of the GNU General Public License as published by
  12. // the Free Software Foundation; either version 2 of the License, or
  13. // (at your option) any later version.
  14. // This program is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17. // GNU General Public License for more details.
  18. // ------------------------------------------------
  19. #include <stdlib.h>
  20. #include "http.h"
  21. #include "sys.h"
  22. #include "common.h"
  23. //-----------------------------------------
  24. bool HTTP::checkResponse(int r)
  25. {
  26. if (readResponse()!=r)
  27. {
  28. LOG_ERROR("Unexpected HTTP: %s",cmdLine);
  29. throw StreamException("Unexpected HTTP response");
  30. return false;
  31. }
  32. return true;
  33. }
  34. //-----------------------------------------
  35. void HTTP::readRequest()
  36. {
  37. readLine(cmdLine,sizeof(cmdLine));
  38. }
  39. //-----------------------------------------
  40. int HTTP::readResponse()
  41. {
  42. readLine(cmdLine,sizeof(cmdLine));
  43. char *cp = cmdLine;
  44. while (*cp) if (*++cp == ' ') break;
  45. while (*cp) if (*++cp != ' ') break;
  46. char *scp = cp;
  47. while (*cp) if (*++cp == ' ') break;
  48. *cp = 0;
  49. return atoi(scp);
  50. }
  51. //-----------------------------------------
  52. bool HTTP::nextHeader()
  53. {
  54. if (readLine(cmdLine,sizeof(cmdLine)))
  55. {
  56. char *ap = strstr(cmdLine,":");
  57. if (ap)
  58. while (*++ap)
  59. if (*ap!=' ')
  60. break;
  61. arg = ap;
  62. return true;
  63. }else
  64. {
  65. arg = NULL;
  66. return false;
  67. }
  68. }
  69. //-----------------------------------------
  70. bool HTTP::isHeader(const char *hs)
  71. {
  72. return stristr(cmdLine,hs) != NULL;
  73. }
  74. //-----------------------------------------
  75. bool HTTP::isRequest(const char *rq)
  76. {
  77. return strncmp(cmdLine,rq,strlen(rq)) == 0;
  78. }
  79. //-----------------------------------------
  80. char *HTTP::getArgStr()
  81. {
  82. return arg;
  83. }
  84. //-----------------------------------------
  85. int HTTP::getArgInt()
  86. {
  87. if (arg) 
  88. return atoi(arg);
  89. else 
  90. return 0;
  91. }
  92. //-----------------------------------------
  93. void HTTP::getAuthUserPass(char *user, char *pass)
  94. {
  95. if (arg)
  96. {
  97. char *s = stristr(arg,"Basic");
  98. if (s)
  99. {
  100. while (*s)
  101. if (*s++ == ' ')
  102. break;
  103. String str;
  104. str.set(s,String::T_BASE64);
  105. str.convertTo(String::T_ASCII);
  106. s = strstr(str.cstr(),":");
  107. if (s)
  108. {
  109. *s = 0;
  110. if (user)
  111. strcpy(user,str.cstr());
  112. if (pass)
  113. strcpy(pass,s+1);
  114. }
  115. }
  116. }
  117. }
  118. // -----------------------------------
  119. void CookieList::init()
  120. {
  121. for(int i=0; i<MAX_COOKIES; i++)
  122. list[i].clear();
  123. neverExpire = false;
  124. }
  125. // -----------------------------------
  126. bool CookieList::contains(Cookie &c)
  127. {
  128. if ((c.id[0]) && (c.ip))
  129. for(int i=0; i<MAX_COOKIES; i++)
  130. if (list[i].compare(c))
  131. return true;
  132. return false;
  133. }
  134. // -----------------------------------
  135. void Cookie::logDebug(const char *str, int ind)
  136. {
  137. char ipstr[64];
  138. Host h;
  139. h.ip = ip;
  140. h.IPtoStr(ipstr);
  141. LOG_DEBUG("%s %d: %s - %s",str,ind,ipstr,id);
  142. }
  143. // -----------------------------------
  144. bool CookieList::add(Cookie &c)
  145. {
  146. if (contains(c))
  147. return false;
  148. unsigned int oldestTime=(unsigned int)-1; 
  149. int oldestIndex=0;
  150. for(int i=0; i<MAX_COOKIES; i++)
  151. if (list[i].time <= oldestTime)
  152. {
  153. oldestIndex = i;
  154. oldestTime = list[i].time;
  155. }
  156. c.logDebug("Added cookie",oldestIndex);
  157. c.time = sys->getTime();
  158. list[oldestIndex]=c;
  159. return true;
  160. }
  161. // -----------------------------------
  162. void CookieList::remove(Cookie &c)
  163. {
  164. for(int i=0; i<MAX_COOKIES; i++)
  165. if (list[i].compare(c))
  166. list[i].clear();
  167. }