Skip to content

Commit fd394fc

Browse files
author
Daniel Mueller
committed
Proof of concept, Fixes compatibility issues mentioned in ticket #998
- WARNING: I am not a F# developer and this code could possibly break alternative NuGet server versions :-) - "It works on my machine" using the current master of Klondike (https://github.com/themotleyfool/Klondike)
1 parent 71b69f3 commit fd394fc

5 files changed

Lines changed: 28 additions & 17 deletions

File tree

‎src/Paket.Core/NuGetV2.fs‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/// Contains NuGet support.
1+
/// Contains NuGet support.
22
module Paket.NuGetV2
33

44
open System
@@ -30,7 +30,7 @@ type NugetPackageCache =
3030

3131
let rec private followODataLink getUrlContents url =
3232
async {
33-
let! raw = getUrlContents url
33+
let! raw = getUrlContents url acceptXml
3434
let doc = XmlDocument()
3535
doc.LoadXml raw
3636
let feed =
@@ -83,8 +83,8 @@ let getAllVersionsFromNuGet2(auth,nugetURL,package) =
8383
async {
8484
let url = sprintf "%s/package-versions/%s?includePrerelease=true" nugetURL package
8585
verbosefn "getAllVersionsFromNuGet2 from url '%s'" url
86-
let! raw = safeGetFromUrl(auth, url)
87-
let getUrlContents url = getFromUrl(auth, url)
86+
let! raw = safeGetFromUrl(auth, url, acceptJson)
87+
let getUrlContents url acceptJson = getFromUrl(auth, url, acceptJson)
8888
match raw with
8989
| None -> let! result = getAllVersionsFromNugetOData(getUrlContents, nugetURL, package)
9090
return result
@@ -215,15 +215,15 @@ let getDetailsFromNuGetViaODataFast auth nugetURL package (version:SemVerInfo) =
215215
async {
216216
try
217217
let url = sprintf "%s/Packages?$filter=Id eq '%s' and NormalizedVersion eq '%s'" nugetURL package (version.Normalize())
218-
let! raw = getFromUrl(auth,url)
218+
let! raw = getFromUrl(auth,url,acceptXml)
219219
if verbose then
220220
tracefn "Response from %s:" url
221221
tracefn ""
222222
tracefn "%s" raw
223223
return parseODataDetails(nugetURL,package,version,raw)
224224
with _ ->
225225
let url = sprintf "%s/Packages?$filter=Id eq '%s' and Version eq '%s'" nugetURL package (version.ToString())
226-
let! raw = getFromUrl(auth,url)
226+
let! raw = getFromUrl(auth,url,acceptXml)
227227
if verbose then
228228
tracefn "Response from %s:" url
229229
tracefn ""
@@ -238,7 +238,7 @@ let getDetailsFromNuGetViaOData auth nugetURL package (version:SemVerInfo) =
238238
return! getDetailsFromNuGetViaODataFast auth nugetURL package version
239239
with _ ->
240240
let url = sprintf "%s/Packages(Id='%s',Version='%s')" nugetURL package (version.ToString())
241-
let! response = safeGetFromUrl(auth,url)
241+
let! response = safeGetFromUrl(auth,url,acceptXml)
242242

243243
let! raw =
244244
match response with

‎src/Paket.Core/NuGetV3.fs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ let getSearchAPI(auth,nugetUrl) =
4444
| None -> None
4545
| Some v3Path ->
4646
let serviceData =
47-
safeGetFromUrl(auth,v3Path)
47+
safeGetFromUrl(auth,v3Path,acceptJson)
4848
|> Async.RunSynchronously
4949

5050
match serviceData with
@@ -62,7 +62,7 @@ let internal findVersionsForPackage(auth, nugetURL, package, includingPrerelease
6262
async {
6363
match getSearchAPI(auth,nugetURL) with
6464
| Some url ->
65-
let! response = safeGetFromUrl(auth,sprintf "%s?id=%s&take=%d%s" url package (max maxResults 100000) (if includingPrereleases then "&prerelease=true" else "")) // Nuget is showing old versions first
65+
let! response = safeGetFromUrl(auth,sprintf "%s?id=%s&take=%d%s" url package (max maxResults 100000) (if includingPrereleases then "&prerelease=true" else ""), acceptXml) // Nuget is showing old versions first
6666
match response with
6767
| Some text ->
6868
let versions =
@@ -94,7 +94,7 @@ let private getPackages(auth, nugetURL, packageNamePrefix, maxResults) = async {
9494
match getSearchAPI(auth,nugetURL) with
9595
| Some url ->
9696
let query = sprintf "%s?q=%s&take=%d" url packageNamePrefix maxResults
97-
let! response = safeGetFromUrl(auth,query)
97+
let! response = safeGetFromUrl(auth,query,acceptJson)
9898
match response with
9999
| Some text -> return extractPackages text
100100
| None -> return [||]

‎src/Paket.Core/RemoteDownload.fs‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@ let getSHA1OfBranch origin owner project branch =
1313
match origin with
1414
| ModuleResolver.SingleSourceFileOrigin.GitHubLink ->
1515
let url = sprintf "https://api.github.com/repos/%s/%s/commits/%s" owner project branch
16-
let! document = getFromUrl(None, url)
16+
let! document = getFromUrl(None, url, null)
1717
let json = JObject.Parse(document)
1818
return json.["sha"].ToString()
1919
| ModuleResolver.SingleSourceFileOrigin.GistLink ->
2020
let url = sprintf "https://api.github.com/gists/%s/%s" project branch
21-
let! document = getFromUrl(None, url)
21+
let! document = getFromUrl(None, url, null)
2222
let json = JObject.Parse(document)
2323
let latest = json.["history"].First.["version"]
2424
return latest.ToString()
@@ -44,7 +44,7 @@ let downloadDependenciesFile(rootPath,parserF,remoteFile:ModuleResolver.Resolved
4444
| ModuleResolver.GistLink ->
4545
rawGistFileUrl remoteFile.Owner remoteFile.Project dependenciesFileName
4646
| ModuleResolver.HttpLink url -> url.Replace(remoteFile.Name,Constants.DependenciesFileName)
47-
let! result = safeGetFromUrl(None,url)
47+
let! result = safeGetFromUrl(None,url,null)
4848

4949
match result with
5050
| Some text when parserF text ->
@@ -83,7 +83,7 @@ let downloadRemoteFiles(remoteFile:ResolvedSourceFile,destination) = async {
8383
let projectPath = fi.Directory.FullName
8484

8585
let url = sprintf "https://api.github.com/gists/%s" remoteFile.Project
86-
let! document = getFromUrl(None, url)
86+
let! document = getFromUrl(None, url, null)
8787
let json = JObject.Parse(document)
8888
let files = json.["files"] |> Seq.map (fun i -> i.First.["filename"].ToString(), i.First.["raw_url"].ToString())
8989

‎src/Paket.Core/Utils.fs‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ open Paket.Logging
1212
open Chessie.ErrorHandling
1313
open Paket.Domain
1414

15+
let acceptXml = "application/atom+xml,application/xml"
16+
let acceptJson = "application/atom+json,application/json"
17+
18+
let notNullOrEmpty = not << System.String.IsNullOrEmpty
19+
1520
type Auth =
1621
{ Username : string
1722
Password : string }
@@ -168,10 +173,12 @@ let downloadFromUrl (auth:Auth option, url : string) (filePath: string) =
168173
}
169174

170175
/// [omit]
171-
let getFromUrl (auth:Auth option, url : string) =
176+
let getFromUrl (auth:Auth option, url : string, contentType : string) =
172177
async {
173178
try
174179
use client = createWebClient(url,auth)
180+
if notNullOrEmpty contentType then
181+
client.Headers.Add(HttpRequestHeader.Accept, contentType)
175182
let s = client.DownloadStringTaskAsync(Uri(url)) |> Async.AwaitTask
176183
return! s
177184
with
@@ -200,10 +207,14 @@ let getXmlFromUrl (auth:Auth option, url : string) =
200207
}
201208

202209
/// [omit]
203-
let safeGetFromUrl (auth:Auth option, url : string) =
210+
let safeGetFromUrl (auth:Auth option, url : string, contentType : string) =
204211
async {
205212
try
206213
use client = createWebClient(url,auth)
214+
215+
if notNullOrEmpty contentType then
216+
client.Headers.Add(HttpRequestHeader.Accept, contentType)
217+
207218
let s = client.DownloadStringTaskAsync(Uri(url)) |> Async.AwaitTask
208219
let! raw = s
209220
return Some raw

‎tests/Paket.Tests/NuGetOData/ODataSpecs.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ let ``can calculate v3 path``() =
116116

117117
[<Test>]
118118
let ``can read all versions from single page with multiple entries``() =
119-
let getUrlContentsStub _ = async { return File.ReadAllText "NuGetOData/NUnit.xml" }
119+
let getUrlContentsStub _ _ = async { return File.ReadAllText "NuGetOData/NUnit.xml" }
120120

121121
let versions = getAllVersionsFromNugetOData(getUrlContentsStub, fakeUrl, "NUnit")
122122
|> Async.RunSynchronously

0 commit comments

Comments
 (0)