00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "stdafx.h"
00032 #include ".\httpsocket.h"
00033
00034 HTTPSocket::HTTPSocket(void)
00035 : mWasError(false)
00036 , mIsEOF(false)
00037 , mIsOpen(false)
00038 , mSeenResponse(false)
00039 {
00040
00041
00042
00043 WORD locWinsockVersion = MAKEWORD(1,1);
00044 WSADATA locWinsockData;
00045 int locRet= 0;
00046
00047 locRet = WSAStartup(locWinsockVersion, &locWinsockData);
00048 if ((locRet != 0) || (locWinsockData.wVersion != locWinsockVersion)) {
00049
00050
00051 WSACleanup();
00052 throw 0;
00053 }
00054
00055
00056 }
00057
00058 HTTPSocket::~HTTPSocket(void)
00059 {
00060
00061
00062
00063 WSACleanup();
00064 }
00065
00066
00067 bool HTTPSocket::setupSocket(string inSourceLocation)
00068 {
00069
00070 mSourceLocation = inSourceLocation;
00071
00072 IN_ADDR locAddress;
00073 LPHOSTENT locHostData;;
00074
00075 bool locValidURL = splitURL(inSourceLocation);
00076
00077 locAddress.S_un.S_addr = inet_addr(mServerName.c_str());
00078
00079
00080 if (locAddress.S_un.S_addr == INADDR_NONE) {
00081 locHostData = gethostbyname(mServerName.c_str());
00082 } else {
00083 locHostData = gethostbyaddr((const char*)&locAddress, sizeof(struct in_addr), AF_INET);
00084 }
00085
00086
00087
00088 if (locHostData == NULL) {
00089
00090
00091 return false;
00092 }
00093
00094 mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
00095 if (mSocket == INVALID_SOCKET) {
00096
00097
00098 return false;
00099 }
00100
00101
00102 LPSERVENT locServiceData;
00103 SOCKADDR_IN locServiceSocketAddr;
00104
00105 if (mPort == 0) {
00106 locServiceData = getservbyname("http", "tcp");
00107 if (locServiceData == NULL) {
00108 locServiceSocketAddr.sin_port = htons(80);
00109 } else {
00110 locServiceSocketAddr.sin_port = locServiceData->s_port;
00111 }
00112 } else {
00113
00114 locServiceSocketAddr.sin_port = htons(mPort);
00115 }
00116
00117
00118
00119 locServiceSocketAddr.sin_family = AF_INET;
00120 locServiceSocketAddr.sin_addr = *((LPIN_ADDR)*locHostData->h_addr_list);
00121
00122
00123 int locRetVal = 0;
00124 locRetVal = connect(mSocket, (LPSOCKADDR)&locServiceSocketAddr, sizeof(SOCKADDR_IN));
00125 if (locRetVal == SOCKET_ERROR) {
00126
00127 closesocket(mSocket);
00128 return false;
00129 }
00130
00131 return true;
00132
00133
00134 }
00135
00136 string HTTPSocket::assembleRequest(string inFilePath, unsigned long inStartByte) {
00137 string retRequest;
00138 retRequest = "GET " + inFilePath+ " HTTP/1.1\r\n" + "Host: " + mServerName+ "\r\n" + "Connection: close";
00139
00140 if (inStartByte != 0) {
00141 retRequest = retRequest + "\r\n" + "Range: bytes=" + StringHelper::numToString(inStartByte) + "-";
00142 }
00143
00144 retRequest += "\r\n\r\n";
00145
00146 return retRequest;
00147 }
00148
00149 bool HTTPSocket::httpRequest(string inRequest) {
00150
00151 int locRetVal = send(mSocket, inRequest.c_str(), (int)inRequest.length(), 0);
00152
00153 if (locRetVal == SOCKET_ERROR) {
00154
00155 closesocket(mSocket);
00156 return false;
00157 }
00158 return true;
00159 }
00160
00161 bool HTTPSocket::splitURL(string inURL) {
00162
00163 string locProtocol;
00164 string locServerName;
00165 string locPath;
00166 string locPort;
00167 string locTemp;
00168 size_t locPos2;
00169 size_t locPos = inURL.find(':');
00170 if (locPos == string::npos) {
00171
00172 return false;
00173 } else {
00174 locProtocol = inURL.substr(0, locPos);
00175 locTemp = inURL.substr(locPos+1);
00176 locPos = locTemp.find("//");
00177 if ((locPos == string::npos) || (locPos != 0)) {
00178 return false;
00179 } else {
00180 locTemp = locTemp.substr(locPos+2);
00181 locPos = locTemp.find('/');
00182 if (locPos == string::npos) {
00183 return false;
00184 } else {
00185 locPos2 = locTemp.find(':');
00186 if (locPos2 == string::npos) {
00187 locServerName = locTemp.substr(0, locPos);
00188 locPath = locTemp.substr(locPos);
00189 } else if (locPos2 < locPos) {
00190
00191 locPort = locTemp.substr(locPos2 + 1, locPos - locPos2 - 1);
00192 locServerName = locTemp.substr(0, locPos2);
00193 locPath = locTemp.substr(locPos);
00194 }
00195
00196 }
00197 }
00198
00199 }
00200
00201 mServerName = locServerName;
00202 mFileName = locPath;
00203 if (locPort != "") {
00204
00205 mPort = atoi(locPort.c_str());
00206 } else {
00207 mPort = 0;
00208 }
00209
00210 return true;
00211
00212 }
00213 void HTTPSocket::closeSocket() {
00214
00215 int ret = closesocket(mSocket);
00216 ret = ret;
00217 }