source: cheroxy/trunk/src/CRXHttpResponse.cpp@ 54

Last change on this file since 54 was 54, checked in by cheese, 11 years ago

#1 remove unnecessary memset

File size: 5.6 KB
RevLine 
[6]1/**
2 * CRXHttpResponse.cpp
3 */
4#ifdef _WIN32
5# pragma warning (disable:4996)
6#endif
7
8#include "CRXHttpResponse.h"
9
10#include <stdio.h>
11#include <stdlib.h>
[25]12#include <string.h>
[6]13
[24]14#define CONTENT_LENGTH "Content-Length: "
15#define TRANSFER_ENCODING "Transfer-Encoding: "
16
[6]17CRXHttpResponse::CRXHttpResponse (void)
[24]18 : mStatusCode (0),
19 mIsChunked (false),
20 mContentLength (0)
[6]21{
[26]22 /*----------------------------------------------------------------*/
23 /*----------------------------------------------------------------*/
[6]24}
25
[24]26CRXHttpResponse::~CRXHttpResponse (void)
27{
[26]28 /*----------------------------------------------------------------*/
29 Reset ();
30 /*----------------------------------------------------------------*/
31}
32
33void
34CRXHttpResponse::Reset (void)
35{
36 /*----------------------------------------------------------------*/
[46]37 Get ().clear ();
38 mContent.clear ();
[26]39 /*----------------------------------------------------------------*/
[24]40}
41
[6]42void
[46]43CRXHttpResponse::SetHeader (const char * aHeader)
[6]44{
[26]45 /*----------------------------------------------------------------*/
[46]46 Set (aHeader);
[26]47 /*----------------------------------------------------------------*/
[6]48}
49
[24]50std::string
51CRXHttpResponse::GetHeader (void) const
52{
[26]53 /*----------------------------------------------------------------*/
54 /*----------------------------------------------------------------*/
55
[46]56 return Get ();
[24]57}
58
[6]59void
60CRXHttpResponse::Parse (void)
61{
[24]62 std::string aValue;
[6]63
64 char aStatusCode[64] = {0x00, };
[24]65 char aStatusName[64] = {0x00, };
[6]66 char aHttpVersion[64] = {0x00, };
67
[24]68 size_t aBegin = 0;
69 size_t aOffset = 0;
70
[6]71 /*----------------------------------------------------------------*/
[24]72 aValue = GetHeader ().substr (0, GetHeader ().find (CRLF, 0));
[6]73
74 /*----------------------------------------------------------------
75 * 1. separate first line to <METHOD>, <URL> and <VERSION>
76 *----------------------------------------------------------------*/
[24]77 sscanf (aValue.c_str (), "%[^ ] %[^ ] %[^ ]\r\n", aHttpVersion, aStatusCode, aStatusName);
[6]78 mHttpVersion.assign (aHttpVersion);
[24]79 mStatusString.assign (aStatusName);
[6]80 mStatusCode = atoi (aStatusCode);
[24]81
82 /*----------------------------------------------------------------
83 * 2. get Content-Length or check is chunked
84 *----------------------------------------------------------------*/
85 aBegin = GetHeader ().find (CONTENT_LENGTH);
86 if (aBegin == std::string::npos)
87 {
88 /* is really chunked encoding ? */
89 aBegin = GetHeader ().find (TRANSFER_ENCODING);
90 if (aBegin == std::string::npos)
91 return ;
92
93 aBegin += strlen (TRANSFER_ENCODING);
94 aOffset = GetHeader ().find (CRLF, aBegin) - aBegin;
95
96 aValue = GetHeader ().substr (aBegin, aOffset);
97 if (aValue == "chunked")
98 {
99 mIsChunked = true;
100 return ;
101 }
102 }
103
104 aBegin += strlen (CONTENT_LENGTH);
105 aOffset = GetHeader ().find (CRLF, aBegin) - aBegin;
106
107 aValue = GetHeader ().substr (aBegin, aOffset);
108 mContentLength = atoi (aValue.c_str ());
[6]109 /*----------------------------------------------------------------*/
110}
111
112int
[44]113CRXHttpResponse::SetContent (const char * aContent,
[45]114 const int aLength)
[6]115{
[51]116 int aResult = 0;
117 unsigned int aSize = 0;
118 char * aChunkedPtr = NULL;
[24]119
[46]120 /*----------------------------------------------------------------*/
121 /*----------------------------------------------------------------
122 * 1. check parameter
123 *----------------------------------------------------------------*/
124 if (aLength < 0)
125 return ERROR_HTTP_RESPONSE_INVALID_LENGTH;
[24]126
[46]127 /*----------------------------------------------------------------
128 * 2. check content size when is NOT chunked-encoding
129 *----------------------------------------------------------------*/
130 if (!mIsChunked && mContent.size () >= mContentLength)
131 return 0;
132
133 /*----------------------------------------------------------------
134 * 3. resize memory and copy
135 *----------------------------------------------------------------*/
136 aSize = mContent.size ();
137 mContent.resize (aSize + aLength);
[47]138 memcpy (&mContent[0] + aSize, aContent, aLength);
[46]139
140 /*----------------------------------------------------------------
141 * 4.
142 *----------------------------------------------------------------*/
143 aResult = mContent.size ();
144 if (mIsChunked)
[24]145 {
[46]146 mContentLength += aLength;
147 aSize = mContent.size ();
[51]148 if (aSize > strlen (CRLF) + strlen (CRLF2))
[24]149 {
[47]150 aChunkedPtr = &mContent[0] + aSize - strlen (CRLF2);
[46]151 if (!strncmp (aChunkedPtr, CRLF2, strlen (CRLF2)))
[24]152 {
[46]153 for ( ; strncmp (aChunkedPtr--, CRLF, strlen (CRLF)) ; );
154 aResult = strtol (aChunkedPtr, NULL, 16);
[24]155 }
156 }
157 }
158 /*----------------------------------------------------------------*/
159
160 return aResult;
[25]161}
[28]162
[46]163int
164CRXHttpResponse::GetStatusCode (void) const
165{
166 /*----------------------------------------------------------------*/
167 /*----------------------------------------------------------------*/
168
169 return mStatusCode;
170}
171
172bool
173CRXHttpResponse::IsChunked (void) const
174{
175 /*----------------------------------------------------------------*/
176 /*----------------------------------------------------------------*/
177
178 return mIsChunked;
179}
180
181int
182CRXHttpResponse::GetContentLength (void) const
183{
184 /*----------------------------------------------------------------*/
185 /*----------------------------------------------------------------*/
186
187 return mContentLength;
188}
189
190const char *
191CRXHttpResponse::GetContentBody (void) const
192{
193 /*----------------------------------------------------------------*/
194 /*----------------------------------------------------------------*/
195
196 return mContent.empty () ? "" : &mContent[0];
[51]197}
Note: See TracBrowser for help on using the repository browser.