void PushWeakObject(duk_context* ctx, Object* object) { if (!object) { duk_push_null(ctx); return; } duk_push_heap_stash(ctx); // Check if the wrapper for the object already exists in stash // This is required so that comparisons of object references (e.g. against the me property) work properly if (duk_has_prop_index(ctx, -1, (size_t)object)) { duk_get_prop_index(ctx, -1, (size_t)object); WeakPtr<Object>* oldPtr = GetWeakPtr(ctx, -1); if (oldPtr && oldPtr->Get() == object) { duk_remove(ctx, -2); // Remove stash return; } else duk_pop(ctx); // Valid existing wrapper not found } duk_push_object(ctx); WeakPtr<Object>* ptr = new WeakPtr<Object>(object); duk_push_pointer(ctx, ptr); duk_put_prop_string(ctx, -2, "\xff""weak"); duk_push_c_function(ctx, WeakPtr_Finalizer, 1); duk_set_finalizer(ctx, -2); // Set prototype. If not found, use base class prototype (e.g. IComponent) duk_get_global_string(ctx, object->GetTypeName().CString()); if (!duk_is_object(ctx, -1)) { duk_pop(ctx); duk_get_global_string(ctx, object->GetTypeInfo()->GetBaseTypeInfo()->GetTypeName().CString()); } duk_get_prop_string(ctx, -1, "prototype"); duk_set_prototype(ctx, -3); duk_pop(ctx); // Proxied property access handling for scene, entity & component if (object->GetType() == Scene::GetTypeStatic()) SetupProxy(ctx, SceneProxyFunctions); if (object->GetType() == Entity::GetTypeStatic()) SetupProxy(ctx, EntityProxyFunctions); else if (dynamic_cast<IComponent*>(object)) SetupProxy(ctx, ComponentProxyFunctions); // Store to stash duk_dup(ctx, -1); duk_put_prop_index(ctx, -3, (size_t)object); duk_remove(ctx, -2); // Remove stash }
apr_status_t setup_test_mock_proxy(test_baton_t *tb) { if (!tb->mh) tb->mh = mhInit(); InitMockServers(tb->mh) SetupProxy(WithHTTP, WithID("proxy"), WithPort(PROXY_PORT)) EndInit tb->proxy_port = mhProxyPortNr(tb->mh); return apr_sockaddr_info_get(&tb->proxy_addr, "localhost", APR_UNSPEC, mhProxyPortNr(tb->mh), 0, tb->pool); }
fsInternetResult fsHttpFile::OpenEx(LPCSTR pszFilePath, UINT64 uStartPos, UINT64 uUploadPartSize, UINT64 uUploadTotalSize) { if (uUploadTotalSize == _UI64_MAX) return Open_imp (pszFilePath, uStartPos, 0); if (uStartPos + uUploadPartSize > uUploadTotalSize) return IR_INVALIDPARAM; if (!m_pServer) return IR_NOTINITIALIZED; HINTERNET hServer = m_pServer->GetHandle (); if (!hServer) return IR_NOTINITIALIZED; CloseHandle (); if (lstrlen (pszFilePath) > 9000) return IR_BADURL; fsString strFilePath = pszFilePath; fsString strFileName; if (m_bUseMultipart) { LPSTR psz = strrchr (strFilePath, '/'); if (psz) { strFileName = psz + 1; psz [1] = 0; } else strFileName = pszFilePath; } LPTSTR ppszAcceptedTypes [2] = { "*/*", NULL }; m_hFile = HttpOpenRequest (hServer, "POST", strFilePath, m_pszHttpVersion, NULL, (LPCSTR*)ppszAcceptedTypes, INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_KEEP_CONNECTION, 0); if (m_hFile == NULL) return fsWinInetErrorToIR (); fsInternetResult ir = SetupProxy (); if (ir != IR_SUCCESS) { CloseHandle (); return ir; } CHAR szHdr [10000] = ""; if (m_bUseMultipart) lstrcpy (szHdr, "Content-Type: multipart/form-data; boundary=---------------------------284583012225247"); else { lstrcpy (szHdr, "Content-Type: application/x-www-form-urlencoded"); if (m_strCharset.IsEmpty () == FALSE) { lstrcat (szHdr, "; charset="); lstrcat (szHdr, m_strCharset); } } if (uStartPos || uUploadPartSize != uUploadTotalSize) { if (*szHdr) lstrcat (szHdr, "\r\n"); sprintf (szHdr + lstrlen (szHdr), "Range: bytes=%I64u-%I64u/%I64u", uStartPos, uStartPos + uUploadPartSize - 1, uUploadTotalSize); } if (m_pszCookies) { if (*szHdr) lstrcat (szHdr, "\r\n"); sprintf (szHdr + lstrlen (szHdr), "Cookie: %s", m_pszCookies); } if (m_pszAdditionalHeaders) { if (*szHdr) lstrcat (szHdr, "\r\n"); lstrcat (szHdr, m_pszAdditionalHeaders); } IgnoreSecurityProblems (); int nSizeAdd = 0; fsString strMultipartHdr; if (m_bUseMultipart) { m_strLabel = "-----------------------------284583012225247"; strMultipartHdr = m_strLabel; strMultipartHdr += "\r\n"; strMultipartHdr += "Content-Disposition: form-data; name=\"uploadFormFile\"; filename=\""; strMultipartHdr += strFileName; strMultipartHdr += "\"\r\n"; strMultipartHdr += "Content-Type: application/octet-stream\r\n\r\n"; nSizeAdd = strMultipartHdr.GetLength () + m_strLabel.GetLength () + 6; } INTERNET_BUFFERS BufferIn = {0}; BufferIn.dwStructSize = sizeof (INTERNET_BUFFERS); BufferIn.lpcszHeader = szHdr; BufferIn.dwHeadersLength = BufferIn.dwHeadersTotal = lstrlen (szHdr); BufferIn.dwBufferTotal = (DWORD) (uUploadPartSize + nSizeAdd); if (!HttpSendRequestEx (m_hFile, &BufferIn, NULL, HSR_INITIATE, 0)) { ir = fsWinInetErrorToIR (); CloseHandle (); return ir; } if (m_bUseMultipart) { DWORD dw; if (FALSE == InternetWriteFile (m_hFile, strMultipartHdr, strMultipartHdr.GetLength (), &dw)) { ir = fsWinInetErrorToIR (); CloseHandle (); return ir; } } m_uLeftToUpload = uUploadPartSize; return IR_SUCCESS; }
fsInternetResult fsHttpFile::Open_imp(LPCSTR pszFilePath, UINT64 uStartPos, int cTryings) { if (!m_pServer) return IR_NOTINITIALIZED; HINTERNET hServer = m_pServer->GetHandle (); if (!hServer) return IR_NOTINITIALIZED; CloseHandle (); if (lstrlen (pszFilePath) > 9000) return IR_BADURL; if (cTryings > 1) return IR_WININETUNKERROR; DWORD dwFlags = m_dwFlags; if (m_pszCookies) dwFlags |= INTERNET_FLAG_NO_COOKIES; if (m_bEnableAutoRedirect == FALSE) dwFlags |= INTERNET_FLAG_NO_AUTO_REDIRECT; LPTSTR ppszAcceptedTypes [2] = { "*/*", NULL }; LPCSTR pszVerb = "GET"; if (m_pszPostData) pszVerb = "POST"; else if (m_bHeadersOnly) pszVerb = "HEAD"; m_hFile = HttpOpenRequest (hServer, pszVerb, pszFilePath, m_pszHttpVersion, m_pszReferer, (LPCSTR*) ppszAcceptedTypes, dwFlags | INTERNET_FLAG_RELOAD | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_NO_CACHE_WRITE, NULL); if (m_hFile == NULL) return fsWinInetErrorToIR (); fsInternetResult ir = SetupProxy (); if (ir != IR_SUCCESS) { CloseHandle (); return ir; } CHAR szHdr [20000] = ""; if (uStartPos) sprintf (szHdr, "Range: bytes=%I64u-\r\n", uStartPos); if (m_pszCookies) sprintf (szHdr + lstrlen (szHdr), "Cookie: %s\r\n", m_pszCookies); if (m_pszPostData) strcat (szHdr, "Content-Type: application/x-www-form-urlencoded\r\n"); if (m_pszAdditionalHeaders) strcat (szHdr, m_pszAdditionalHeaders); if (cTryings == 0) { char szReq [90000]; sprintf (szReq, "%s %s %s\r\nReferer: %s", pszVerb, pszFilePath, m_pszHttpVersion, m_pszReferer ? m_pszReferer : "-"); if (*szHdr) { strcat (szReq, "\r\n"); strcat (szReq, szHdr); szReq [strlen (szReq) - 2] = 0; } if ((dwFlags & INTERNET_FLAG_NO_COOKIES) == 0) { char szUrl [10000]; DWORD dw = sizeof (szUrl); fsURL url; url.Create (m_dwFlags & INTERNET_FLAG_SECURE ? INTERNET_SCHEME_HTTPS : INTERNET_SCHEME_HTTP, m_pServer->GetServerName (), m_pServer->GetServerPort (), NULL, NULL, pszFilePath, szUrl, &dw); char szCookie [10000]; dw = sizeof (szCookie); *szCookie = 0; InternetGetCookie (szUrl, NULL, szCookie, &dw); if (*szCookie) { strcat (szReq, "\r\n"); strcat (szReq, "Cookie: "); strcat (szReq, szCookie); } } strcat (szReq, "\r\nHost: "); strcat (szReq, m_pServer->GetServerName ()); if (m_pszPostData) { strcat (szReq, "\r\n"); strcat (szReq, m_pszPostData); } Dialog (IFDD_TOSERVER, szReq); } IgnoreSecurityProblems (); if (!HttpSendRequest (m_hFile, *szHdr ? szHdr : NULL, (UINT)-1, m_pszPostData, m_pszPostData ? lstrlen (m_pszPostData) : 0)) { ir = fsWinInetErrorToIR (); DialogHttpResponse (m_hFile); CloseHandle (); return ir; } char szResp [10000]; DWORD dwRespLen = sizeof (szResp), dwIndex = 0; if (HttpQueryInfo (m_hFile, HTTP_QUERY_RAW_HEADERS_CRLF, szResp, &dwRespLen, &dwIndex)) { int cLines = 0; LPCSTR pszLine = szResp; while (pszLine) { pszLine = strchr (pszLine, '\n'); if (pszLine) { while (*pszLine == '\r' || *pszLine == '\n') pszLine++; cLines++; } } if (cLines == 0 || cLines == 1) { return Open_imp (pszFilePath, uStartPos, ++cTryings); } } DialogHttpResponse (m_hFile); DWORD dwStatusCode; DWORD dwSize = sizeof (DWORD); if (!HttpQueryInfo(m_hFile, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatusCode, &dwSize, NULL)) return fsWinInetErrorToIR (); if (dwStatusCode < 200 || dwStatusCode >= 300) { ir = fsHttpStatusCodeToIR (dwStatusCode); if (ir == IR_NEEDREDIRECT) { DWORD dwNeedLen = 0; HttpQueryInfo (m_hFile, HTTP_QUERY_LOCATION, NULL, &dwNeedLen, NULL); if (::GetLastError () == ERROR_INSUFFICIENT_BUFFER) { SAFE_DELETE_ARRAY (m_pszLastError); try { m_pszLastError = new char [++dwNeedLen]; }catch (...) {return IR_OUTOFMEMORY;} if (m_pszLastError == NULL) return IR_OUTOFMEMORY; if (!HttpQueryInfo (m_hFile, HTTP_QUERY_LOCATION, m_pszLastError, &dwNeedLen, NULL)) return IR_SERVERUNKERROR; } else return IR_SERVERUNKERROR; } return ir; } char szContLen [1000]; DWORD dwLen = sizeof (szContLen); if (HttpQueryInfo (m_hFile, HTTP_QUERY_CONTENT_LENGTH, szContLen, &dwLen, NULL)) { __int64 iSize = _atoi64 (szContLen); if (iSize < 0) return IR_SERVERUNKERROR; m_uFileSize = (UINT64) iSize; } else m_uFileSize = _UI64_MAX; ir = IR_SUCCESS; if (uStartPos) { ir = ProcessRangesResponse (); if (ir == IR_RANGESNOTAVAIL) return ir; } else { CHAR sz [10000]; DWORD dw = sizeof (sz); if (HttpQueryInfo (m_hFile, HTTP_QUERY_ACCEPT_RANGES, sz, &dw, NULL)) { if (stricmp (sz, "bytes") == 0) m_enRST = RST_PRESENT; else m_enRST = RST_NONE; } else m_enRST = RST_UNKNOWN; } m_bContentTypeValid = FALSE; m_bDateValid = FALSE; CHAR szContentType [10000]; DWORD dwCL = sizeof (szContentType); if (HttpQueryInfo (m_hFile, HTTP_QUERY_CONTENT_TYPE, szContentType, &dwCL, NULL)) { m_strContentType = szContentType; m_bContentTypeValid = TRUE; } SYSTEMTIME time; DWORD dwTL = sizeof (time); if (HttpQueryInfo (m_hFile, HTTP_QUERY_LAST_MODIFIED | HTTP_QUERY_FLAG_SYSTEMTIME, &time, &dwTL, NULL)) { SystemTimeToFileTime (&time, &m_date); m_bDateValid = TRUE; } RetreiveSuggFileName (); return ir; }